--- /dev/null
+/*******************************************************************************
+ * 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;
+ }
+}