package org.eclipse.ecf.tests.osgi.services.remoteserviceadmin; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescriptionWriter; import org.osgi.service.remoteserviceadmin.EndpointDescription; public class EDEFBundleGenerator { private static final String MANIFEST_VERSION = "Manifest-Version"; //$NON-NLS-1$ private static final String BUNDLE_MANIFEST_VERSION = "Bundle-ManifestVersion"; //$NON-NLS-1$ private static final String BUNDLE_NAME = "Bundle-Name"; //$NON-NLS-1$ private static final String BUNDLE_SYMBOLIC_NAME = "Bundle-SymbolicName"; //$NON-NLS-1$ private static final String BUNDLE_VERSION = "Bundle-Version"; //$NON-NLS-1$ private static final String REMOTE_SERVICE = "Remote-Service"; //$NON-NLS-1$ private static final String EDEF_FILENAME = "edef.xml"; //$NON-NLS-1$ private File targetBundleDirectory; private String targetBundleSymbolicName; private String targetBundleVersion; private EndpointDescriptionWriter edWriter; public EDEFBundleGenerator(File targetBundleDirectory, String targetBundleSymbolicName, String targetBundleVersion, EndpointDescriptionWriter edWriter) { this.targetBundleDirectory = targetBundleDirectory; this.targetBundleSymbolicName = targetBundleSymbolicName; this.targetBundleVersion = targetBundleVersion; this.edWriter = (edWriter==null)?new EndpointDescriptionWriter():edWriter; } public void generateEDEFBundle(EndpointDescription [] endpointDescriptions) throws IOException { Manifest mf = new Manifest(); Attributes attribs = mf.getMainAttributes(); attribs.putValue(MANIFEST_VERSION, "1.0"); //$NON-NLS-1$ attribs.putValue(BUNDLE_MANIFEST_VERSION, "2"); //$NON-NLS-1$ attribs.putValue(BUNDLE_NAME, "RSA EDEF - "+ targetBundleSymbolicName + "." + targetBundleVersion); //$NON-NLS-1$ attribs.putValue(BUNDLE_SYMBOLIC_NAME, targetBundleSymbolicName); attribs.putValue(BUNDLE_VERSION, targetBundleVersion); attribs.putValue(REMOTE_SERVICE, EDEF_FILENAME); File targetBundleFile = new File(targetBundleDirectory, targetBundleSymbolicName+"_"+targetBundleVersion+".jar"); if (targetBundleFile.exists()) throw new IOException("file "+targetBundleFile+" already exists. Cannot overrite"); JarOutputStream jos = null; try { jos = new JarOutputStream(new FileOutputStream(targetBundleFile), mf); ZipEntry edefFileEntry = new ZipEntry(EDEF_FILENAME); jos.putNextEntry(edefFileEntry); OutputStreamWriter outsWriter = new OutputStreamWriter(jos); outsWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append("\n"); edWriter.writeEndpointDescriptions(outsWriter, endpointDescriptions); outsWriter.flush(); jos.closeEntry(); jos.finish(); } finally { if (jos != null) jos.close(); } } }