blob: fbbeeeeb309310cb0edb4e04156de0bf09507cae [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.update.internal.model;
import java.io.*;
import java.util.jar.*;
import org.eclipse.osgi.util.*;
import org.eclipse.update.core.*;
import org.osgi.framework.*;
/**
* Parses MANIFEST.MF
*/
public class BundleManifest {
private PluginEntry pluginEntry;
private IOException exception;
/**
* Constructor for local file
*/
public BundleManifest(File manifest) {
super();
if (manifest.exists() && !manifest.isDirectory()) {
FileInputStream fos = null;
try {
fos = new FileInputStream(manifest);
parse(fos);
} catch (IOException ioe) {
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}
}
}
}
/**
* Constructor for local file
*/
public BundleManifest(InputStream input) {
super();
if (input != null) {
parse(input);
}
}
/**
* Parses manifest, creates PluginEntry if manifest is valid, stores
* exception if any occurs
*
* @param in
* InputStream
*/
private void parse(InputStream in) {
try {
Manifest m = new Manifest(in);
Attributes a = m.getMainAttributes();
// plugin id
String symbolicName = a.getValue(Constants.BUNDLE_SYMBOLICNAME);
if (symbolicName == null) {
// In Eclipse manifest must have Bundle-SymbolicName attribute
return;
}
String id;
try {
ManifestElement[] elements = ManifestElement.parseHeader(
Constants.BUNDLE_SYMBOLICNAME, symbolicName);
id = elements[0].getValue();
} catch (BundleException be) {
throw new IOException(be.getMessage());
}
// plugin version
String version = a.getValue(Constants.BUNDLE_VERSION);
if (version == null) {
return;
}
String hostPlugin = a.getValue(Constants.FRAGMENT_HOST);
pluginEntry = new PluginEntry();
pluginEntry.setVersionedIdentifier(new VersionedIdentifier(id,
version));
pluginEntry.isFragment(hostPlugin != null
&& hostPlugin.length() > 0);
} catch (IOException ioe) {
exception = ioe;
}
}
public boolean exists() {
return exception != null || pluginEntry != null;
}
/**
* Obtains PluginEntry from a manifest.
*
* @return PluginEntry or null if valid manifest does not exist
* @throws IOException
* if exception during parsing
*/
public PluginEntry getPluginEntry() throws IOException {
if (exception != null) {
throw exception;
} else {
return pluginEntry;
}
}
}