blob: c104c185aecac53c20a285d9d60dd938a2196b84 [file] [log] [blame]
package org.eclipse.update.examples.buildzip;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.net.URL;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import org.eclipse.update.core.*;
import org.eclipse.update.core.ContentReference;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IFeatureContentProvider;
import org.eclipse.update.core.IPluginEntry;
import org.eclipse.update.core.JarContentReference;
import org.eclipse.update.core.model.InstallAbortedException;
/**
* Converts eclipse build .zip files into packaged feature
*/
public class BuildZipConverter {
public static void main(String[] args) {
if (args.length <=0) {
System.out.println("Usage: BuildZipConverter <path to the zip file>.\r\nExample: BuildZipConverter d:/download/integration-eclipse-SDK-20020109-win32.zip");
return;
}
try {
URL buildzip = new URL(("file:"+args[0]).replace(File.separatorChar, '/'));
BuildZipFeatureFactory factory = new BuildZipFeatureFactory();
IFeature feature = factory.createFeature(buildzip, null);
IFeatureContentProvider provider = feature.getFeatureContentProvider();
ContentReference[] refs = provider.getFeatureEntryContentReferences(null);
File site = new File((args[0]+".packaged/").replace('/',File.separatorChar));
site.mkdirs();
File featuresDir = new File(site,"features");
featuresDir.mkdirs();
File pluginsDir = new File(site, "plugins");
pluginsDir.mkdirs();
File jarFile = new File(featuresDir,feature.getVersionedIdentifier()+".jar");
System.out.println("writing feature archive: "+feature.getVersionedIdentifier()+".jar");
writeJar(jarFile, refs, feature, null, null);
JarContentReference jar = new JarContentReference("build.zip",buildzip);
Properties manifest = getBuildManifest(jar);
IPluginEntry[] plugins = feature.getPluginEntries();
for (int i=0; i<plugins.length; i++) {
refs = provider.getPluginEntryContentReferences(plugins[i], null);
jarFile = new File(pluginsDir,plugins[i].getVersionedIdentifier()+".jar");
System.out.println("writing plugin archive: "+plugins[i].getVersionedIdentifier()+".jar");
writeJar(jarFile, refs, feature, plugins[i].getVersionedIdentifier().getIdentifier(), manifest);
}
writeSiteManifest(site, feature);
} catch(Exception e) {
e.printStackTrace();
}
}
public static void writeJar(File jarFile,ContentReference[] refs, IFeature feature, String pluginId, Properties manifest) {
JarOutputStream jos = null;
FileOutputStream os = null;
InputStream is = null;
try {
os = new FileOutputStream(jarFile);
jos = new JarOutputStream(os);
JarEntry entry = null;
String buf = null;
StringBufferInputStream sbis = null;
// write jar manifest (first entry in output stream)
buf = "Manifest-Version: 1.0\nCreated-By: 2.0.0 (www.eclipse.org Feature Packager)\n";
sbis = new StringBufferInputStream(buf);
entry = new JarEntry("META-INF/MANIFEST.MF");
jos.putNextEntry(entry);
Utilities.copy(sbis,jos,null);
sbis.close();
// jar up the references
for (int i=0; i<refs.length; i++) {
String id = refs[i].getIdentifier();
entry = new JarEntry(id);
jos.putNextEntry(entry);
is = refs[i].getInputStream();
Utilities.copy(is,jos,null);
is.close(); is = null;
}
// for plugin jars, write build manifest
if (pluginId != null && manifest != null) {
String key = "plugin@"+pluginId;
String value = manifest.getProperty(key);
if (value != null) {
if (value.equals("HEAD")) {
value += "-" + feature.getVersionedIdentifier().getVersion().getMajorComponent();
}
buf = key + "=" + value;
sbis = new StringBufferInputStream(buf);
entry = new JarEntry("buildmanifest.properties");
jos.putNextEntry(entry);
Utilities.copy(sbis,jos,null);
sbis.close();
}
}
// close jar
jos.close(); jos = null; os = null;
} catch(Exception e) {
e.printStackTrace();
} finally {
if (is != null)
try {is.close();} catch(IOException e) {}
if (jos != null)
try {jos.close();} catch(IOException e) {}
else if (os != null)
try {os.close();} catch(IOException e) {}
}
}
public static void writeSiteManifest(File site, IFeature feature) throws IOException, InstallAbortedException {
File manifest = new File(site, "site.xml");
FileOutputStream os = new FileOutputStream(manifest);
String siteXML = "<site>\n <feature url=\"features/"+feature.getVersionedIdentifier().toString()+".jar\"/>\n</site>";
StringBufferInputStream sbis = new StringBufferInputStream(siteXML);
Utilities.copy(sbis,os,null);
os.close();
sbis.close();
}
public static Properties getBuildManifest(JarContentReference jar) throws IOException {
ContentReference manifestEntry = jar.peek("eclipse/buildmanifest.properties",null/*ContentSelector*/, null/*ProgressMonitor*/);
InputStream is = null;
Properties props = null;
try {
props = new Properties();
is = manifestEntry.getInputStream();
props.load(is);
} finally {
if (is != null) try{ is.close(); } catch(IOException e) {}
}
return props;
}
}