]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/ManifestProvider.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / jarpackager / ManifestProvider.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/ManifestProvider.java b/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/ManifestProvider.java
new file mode 100644 (file)
index 0000000..c994447
--- /dev/null
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.jarpackager;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jdt.core.IPackageFragment;
+
+import org.eclipse.jdt.ui.jarpackager.IManifestProvider;
+import org.eclipse.jdt.ui.jarpackager.JarPackageData;
+
+/**
+ * A manifest provider creates manifest files.
+ */
+public class ManifestProvider implements IManifestProvider {
+
+       // Constants
+       private static final String SEALED_VALUE= "true"; //$NON-NLS-1$
+       private static final String UNSEALED_VALUE= "false"; //$NON-NLS-1$
+
+       /**
+        * Creates a manifest as defined by the <code>JarPackage</code>.
+        *
+        * @param       jarPackage      the JAR package specification
+        * @return the manifest
+        * @throws CoreException
+        */
+       public Manifest create(JarPackageData jarPackage) throws CoreException {
+               Assert.isNotNull(jarPackage);
+               if (jarPackage.isManifestGenerated())
+                       return createGeneratedManifest(jarPackage);
+
+               try {
+                       return createSuppliedManifest(jarPackage);
+               } catch (IOException ex) {
+                       throw JarPackagerUtil.createCoreException(ex.getLocalizedMessage(), ex);
+               }
+       }
+
+       /**
+        * Creates a default manifest.
+        *
+        * @param manifestVersion       the version of the manifest
+        * @return the manifest
+        */
+       public Manifest createDefault(String manifestVersion) {
+               Manifest manifest= new Manifest();
+               manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, manifestVersion);
+               return manifest;
+       }
+
+       /**
+        * Hook for subclasses to add additional manifest entries.
+        *
+        * @param       manifest        the manifest to which the entries should be added
+        * @param       jarPackage      the JAR package specification
+        */
+       protected void putAdditionalEntries(Manifest manifest, JarPackageData jarPackage) {
+       }
+
+       private Manifest createGeneratedManifest(JarPackageData jarPackage) {
+               Manifest manifest= new Manifest();
+               putVersion(manifest, jarPackage);
+               putSealing(manifest, jarPackage);
+               putMainClass(manifest, jarPackage);
+               putAdditionalEntries(manifest, jarPackage);
+               return manifest;
+       }
+
+       private void putVersion(Manifest manifest, JarPackageData jarPackage) {
+               manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, jarPackage.getManifestVersion());
+       }
+
+       private void putSealing(Manifest manifest, JarPackageData jarPackage) {
+               if (jarPackage.isJarSealed()) {
+                       manifest.getMainAttributes().put(Attributes.Name.SEALED, SEALED_VALUE);
+                       IPackageFragment[] packages= jarPackage.getPackagesToUnseal();
+                       if (packages != null) {
+                               for (int i= 0; i < packages.length; i++) {
+                                       Attributes attributes= new Attributes();
+                                       attributes.put(Attributes.Name.SEALED, UNSEALED_VALUE);
+                                       manifest.getEntries().put(getInManifestFormat(packages[i]), attributes);
+                               }
+                       }
+               }
+               else {
+                       IPackageFragment[] packages= jarPackage.getPackagesToSeal();
+                       if (packages != null)
+                               for (int i= 0; i < packages.length; i++) {
+                                       Attributes attributes= new Attributes();
+                                       attributes.put(Attributes.Name.SEALED, SEALED_VALUE);
+                                       manifest.getEntries().put(getInManifestFormat(packages[i]), attributes);
+                               }
+               }
+       }
+
+       private void putMainClass(Manifest manifest, JarPackageData jarPackage) {
+               if (jarPackage.getManifestMainClass() != null && jarPackage.getManifestMainClass().getFullyQualifiedName().length() > 0)
+                       manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, jarPackage.getManifestMainClass().getFullyQualifiedName());
+       }
+
+       private String getInManifestFormat(IPackageFragment packageFragment) {
+               String name= packageFragment.getElementName();
+               return name.replace('.', '/') + '/';
+       }
+
+       private Manifest createSuppliedManifest(JarPackageData jarPackage) throws CoreException, IOException {
+               Manifest manifest;
+               // No need to use buffer here because Manifest(...) does
+               InputStream stream= jarPackage.getManifestFile().getContents(false);
+               try {
+                       manifest= new Manifest(stream);
+               } finally {
+                       if (stream != null)
+                               stream.close();
+               }
+               return manifest;
+       }
+}