From: Mathieu Baudier Date: Tue, 20 Aug 2013 13:46:39 +0000 (+0000) Subject: Improve OSGi distribution X-Git-Tag: argeo-slc-2.1.7~316 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=a0a0f0b074c867a73dabca20b28767a2f7475745;p=gpl%2Fargeo-slc.git Improve OSGi distribution git-svn-id: https://svn.argeo.org/slc/trunk@6400 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactDistribution.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactDistribution.java new file mode 100644 index 000000000..4cd673eb4 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactDistribution.java @@ -0,0 +1,51 @@ +package org.argeo.slc.repo; + +import org.argeo.slc.DefaultNameVersion; +import org.argeo.slc.NameVersion; +import org.argeo.slc.build.Distribution; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.util.artifact.DefaultArtifact; + +/** A {@link Distribution} based on an Aether {@link Artifact} */ +public class ArtifactDistribution extends DefaultNameVersion implements + Distribution { + private final Artifact artifact; + + public ArtifactDistribution(Artifact artifact) { + this.artifact = artifact; + setName(artifact.getArtifactId()); + setVersion(artifact.getVersion()); + } + + public ArtifactDistribution(String coords) { + this(new DefaultArtifact(coords)); + } + + /** Aether coordinates of the underlying artifact. */ + public String getDistributionId() { + return artifact.toString(); + } + + public Artifact getArtifact() { + return artifact; + } + + @Override + public int hashCode() { + return artifact.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NameVersion) + return super.equals(obj); + else + return artifact.equals(obj); + } + + @Override + public String toString() { + return getDistributionId(); + } + +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/OsgiBundlesProvider.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/OsgiBundlesProvider.java new file mode 100644 index 000000000..de5f03c39 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/OsgiBundlesProvider.java @@ -0,0 +1,12 @@ +package org.argeo.slc.repo; + +import java.util.List; + +/** + * Provides OSGi bundles either by linking to them, by wrapping existing + * archives or by building them. + */ +public interface OsgiBundlesProvider { + /** The provided bundles in the order they will be retrieved/wrapped/built. */ + public List provides(); +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java new file mode 100644 index 000000000..843951843 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java @@ -0,0 +1,133 @@ +package org.argeo.slc.repo.osgi; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.Session; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.repo.OsgiFactory; +import org.argeo.slc.repo.RepoUtils; +import org.sonatype.aether.artifact.Artifact; + +/** Download a software distribution and generates the related OSGi bundles. */ +public class ArchiveWrapper implements Runnable { + private final static Log log = LogFactory.getLog(ArchiveWrapper.class); + + private OsgiFactory osgiFactory; + + private String version; + // private String groupId; + + private String uri; + + private Map wrappers = new HashMap(); + + public void init() { + for (BndWrapper wrapper : wrappers.values()) { + if (wrapper.getVersion() == null) + wrapper.setVersion(version); + } + } + + public void destroy() { + + } + + public void run() { + + Session distSession = null; + Session javaSession = null; + ZipInputStream zin = null; + try { + javaSession = osgiFactory.openJavaSession(); + distSession = osgiFactory.openDistSession(); + + if (log.isDebugEnabled()) + log.debug("Wrapping " + uri); + + Node distNode = osgiFactory.getDist(distSession, uri); + zin = new ZipInputStream(distNode.getNode(Node.JCR_CONTENT) + .getProperty(Property.JCR_DATA).getBinary().getStream()); + + ZipEntry zentry = null; + ByteArrayOutputStream out = null; + ByteArrayInputStream in = null; + while ((zentry = zin.getNextEntry()) != null) { + try { + String name = zentry.getName(); + // if (log.isDebugEnabled()) + // log.debug("Scanning " + name); + if (wrappers.containsKey(name)) { + + BndWrapper wrapper = (BndWrapper) wrappers.get(name); + // if (wrapper.getVersion() == null) + // wrapper.setVersion(version);// FIXME stateful? + + out = new ByteArrayOutputStream((int) zentry.getSize()); + // we must copy since the stream is closed by BND + byte[] sourceJarBytes = IOUtils.toByteArray(zin); + in = new ByteArrayInputStream(sourceJarBytes); + wrapper.wrapJar(in, out); + + Artifact newArtifact = wrapper.getArtifact(); + Node newJarNode = RepoUtils.copyBytesAsArtifact( + javaSession.getRootNode(), newArtifact, + out.toByteArray()); + osgiFactory.indexNode(newJarNode); + newJarNode.getSession().save(); + if (log.isDebugEnabled()) + log.debug("Wrapped " + name + " to " + + newJarNode.getPath()); + } + } finally { + IOUtils.closeQuietly(out); + IOUtils.closeQuietly(in); + } + } + } catch (Exception e) { + throw new SlcException("Cannot wrap distribution " + uri, e); + } finally { + IOUtils.closeQuietly(zin); + JcrUtils.logoutQuietly(distSession); + JcrUtils.logoutQuietly(javaSession); + } + } + + // public List provides() { + // List res = new ArrayList(); + // for (BndWrapper bndWrapper : wrappers.values()) { + // ArtifactDistribution ad = new ArtifactDistribution(groupId + ":" + // + bndWrapper.getName() + ":" + bndWrapper.getVersion()); + // res.add(ad); + // } + // return res; + // } + + public void setUri(String uri) { + this.uri = uri; + } + + public void setWrappers(Map wrappers) { + this.wrappers = wrappers; + } + + public void setOsgiFactory(OsgiFactory osgiFactory) { + this.osgiFactory = osgiFactory; + } + + public void setVersion(String version) { + this.version = version; + } + +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArgeoOsgiDistribution.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArgeoOsgiDistribution.java new file mode 100644 index 000000000..c81126e0d --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArgeoOsgiDistribution.java @@ -0,0 +1,62 @@ +package org.argeo.slc.repo.osgi; + +import java.util.HashSet; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.DefaultNameVersion; +import org.argeo.slc.NameVersion; +import org.argeo.slc.build.Distribution; +import org.argeo.slc.build.ModularDistribution; +import org.argeo.slc.repo.ArtifactDistribution; + +public class ArgeoOsgiDistribution extends ArtifactDistribution implements + ModularDistribution { + private final static Log log = LogFactory + .getLog(ArgeoOsgiDistribution.class); + + private Set modules = new HashSet(); + + public ArgeoOsgiDistribution(String coords) { + super(coords); + } + + public void init() { + if (log.isDebugEnabled()) { + log.debug("## " + toString()); + for (NameVersion nv : listModulesNameVersions()) { + log.debug(nv); + } + } + } + + public void destroy() { + + } + + public Distribution getModuleDistribution(String moduleName, + String moduleVersion) { + NameVersion searched = new DefaultNameVersion(moduleName, moduleVersion); + for (ArtifactDistribution ad : modules) { + if (ad.equals(searched)) + return ad; + } + return null; + } + + public Set listModulesNameVersions() { + return new TreeSet(modules); + } + + public Object getModulesDescriptor(String descriptorType) { + // TODO Auto-generated method stub + return null; + } + + public void setModules(Set modules) { + this.modules = modules; + } + +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/BndWrapper.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/BndWrapper.java index 00308a2fd..f03a4d74b 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/BndWrapper.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/BndWrapper.java @@ -11,21 +11,27 @@ import java.util.jar.Manifest; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.slc.NameVersion; import org.argeo.slc.SlcException; import org.osgi.framework.Version; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.util.artifact.DefaultArtifact; +import org.springframework.beans.factory.BeanNameAware; import aQute.lib.osgi.Builder; import aQute.lib.osgi.Constants; import aQute.lib.osgi.Jar; /** Utilities around the BND library, which manipulates OSI meta-data. */ -public class BndWrapper implements Constants { +public class BndWrapper implements Constants, NameVersion, BeanNameAware { private final static Log log = LogFactory.getLog(BndWrapper.class); - private String bsn; + private String groupId; + private String name; private String version; + private Properties bndProperties = new Properties(); - public void wrapJar(Properties properties, InputStream in, OutputStream out) { + public void wrapJar(InputStream in, OutputStream out) { Builder b = new Builder(); try { Jar jar = new Jar(null, in); @@ -53,12 +59,15 @@ public class BndWrapper implements Constants { } } - properties.setProperty(BUNDLE_SYMBOLICNAME, bsn); + Properties properties = new Properties(); + properties.putAll(bndProperties); + properties.setProperty(BUNDLE_SYMBOLICNAME, name); properties.setProperty(BUNDLE_VERSION, versionToUse.toString()); // b.addIncluded(jarFile); b.addClasspath(jar); + log.debug(properties); b.setProperties(properties); Jar newJar = b.build(); @@ -71,12 +80,12 @@ public class BndWrapper implements Constants { } - public void setBsn(String bsn) { - this.bsn = bsn; + public void setName(String bsn) { + this.name = bsn; } - public String getBsn() { - return bsn; + public String getName() { + return name; } public void setVersion(String version) { @@ -87,9 +96,33 @@ public class BndWrapper implements Constants { return version; } + public Properties getBndProperties() { + return bndProperties; + } + + public void setBndProperties(Properties bndProperties) { + this.bndProperties = bndProperties; + } + + public void setBeanName(String name) { + this.name = name; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public Artifact getArtifact() { + return new DefaultArtifact(groupId, name, "jar", version); + } + public static void main(String[] args) { BndWrapper bndWrapper = new BndWrapper(); - bndWrapper.setBsn("org.slf4j"); + bndWrapper.setName("org.slf4j"); InputStream in = null; InputStream propertiesIn = null; @@ -104,7 +137,7 @@ public class BndWrapper implements Constants { // propertiesIn = new FileInputStream(propertiesFile); out = new FileOutputStream(new File("test.jar")); // properties.load(propertiesIn); - bndWrapper.wrapJar(properties, in, out); + bndWrapper.wrapJar(in, out); } catch (Exception e) { throw new SlcException("Cannot test", e); } finally { diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/DistributionWrapper.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/DistributionWrapper.java deleted file mode 100644 index 094ee894c..000000000 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/DistributionWrapper.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.argeo.slc.repo.osgi; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.Session; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.jcr.JcrUtils; -import org.argeo.slc.SlcException; -import org.argeo.slc.repo.OsgiFactory; -import org.argeo.slc.repo.RepoUtils; -import org.sonatype.aether.artifact.Artifact; -import org.sonatype.aether.util.artifact.DefaultArtifact; - -/** Download a software distribution and generates the related OSGi bundles. */ -public class DistributionWrapper implements Runnable { - private final static Log log = LogFactory.getLog(DistributionWrapper.class); - - private OsgiFactory osgiFactory; - - private String version; - private String groupId; - - private String uri; - - private Map wrappers = new HashMap(); - - public void run() { - - Session distSession = null; - Session javaSession = null; - ZipInputStream zin = null; - try { - javaSession = osgiFactory.openJavaSession(); - distSession = osgiFactory.openDistSession(); - - if (log.isDebugEnabled()) - log.debug("Wrapping " + uri); - - Node distNode = osgiFactory.getDist(distSession, uri); - zin = new ZipInputStream(distNode.getNode(Node.JCR_CONTENT) - .getProperty(Property.JCR_DATA).getBinary().getStream()); - - ZipEntry zentry = null; - ByteArrayOutputStream out = null; - ByteArrayInputStream in = null; - while ((zentry = zin.getNextEntry()) != null) { - try { - String name = zentry.getName(); - // if (log.isDebugEnabled()) - // log.debug("Scanning " + name); - if (wrappers.containsKey(name)) { - - BndWrapper wrapper = (BndWrapper) wrappers.get(name); - if (wrapper.getVersion() == null) - wrapper.setVersion(version);// FIXME stateful? - - out = new ByteArrayOutputStream((int) zentry.getSize()); - // we must copy since the stream is closed by BND - byte[] sourceJarBytes = IOUtils.toByteArray(zin); - in = new ByteArrayInputStream(sourceJarBytes); - Properties properties = new Properties(); - wrapper.wrapJar(properties, in, out); - - Artifact newArtifact = new DefaultArtifact(groupId, - wrapper.getBsn(), "jar", wrapper.getVersion()); - Node newJarNode = RepoUtils.copyBytesAsArtifact( - javaSession.getRootNode(), newArtifact, - out.toByteArray()); - osgiFactory.indexNode(newJarNode); - if (log.isDebugEnabled()) - log.debug("Wrapped " + name + " to " - + newJarNode.getPath()); - } - } finally { - IOUtils.closeQuietly(out); - IOUtils.closeQuietly(in); - } - } - } catch (Exception e) { - throw new SlcException("Cannot wrap distribution " + uri, e); - } finally { - IOUtils.closeQuietly(zin); - JcrUtils.logoutQuietly(distSession); - JcrUtils.logoutQuietly(javaSession); - } - } - - public void setVersion(String version) { - this.version = version; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public void setWrappers(Map wrappers) { - this.wrappers = wrappers; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public void setOsgiFactory(OsgiFactory osgiFactory) { - this.osgiFactory = osgiFactory; - } - -} diff --git a/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/osgi/JavaSE-1.7.profile b/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/osgi/JavaSE-1.7.profile new file mode 100644 index 000000000..192b46e9f --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/osgi/JavaSE-1.7.profile @@ -0,0 +1,198 @@ +############################################################################### +# Copyright (c) 2009, 2010 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 +############################################################################### +org.osgi.framework.system.packages = \ + javax.accessibility,\ + javax.activation,\ + javax.activity,\ + javax.annotation,\ + javax.annotation.processing,\ + javax.crypto,\ + javax.crypto.interfaces,\ + javax.crypto.spec,\ + javax.imageio,\ + javax.imageio.event,\ + javax.imageio.metadata,\ + javax.imageio.plugins.bmp,\ + javax.imageio.plugins.jpeg,\ + javax.imageio.spi,\ + javax.imageio.stream,\ + javax.jws,\ + javax.jws.soap,\ + javax.lang.model,\ + javax.lang.model.element,\ + javax.lang.model.type,\ + javax.lang.model.util,\ + javax.management,\ + javax.management.event,\ + javax.management.loading,\ + javax.management.modelmbean,\ + javax.management.monitor,\ + javax.management.namespace,\ + javax.management.openmbean,\ + javax.management.relation,\ + javax.management.remote,\ + javax.management.remote.rmi,\ + javax.management.timer,\ + javax.naming,\ + javax.naming.directory,\ + javax.naming.event,\ + javax.naming.ldap,\ + javax.naming.spi,\ + javax.net,\ + javax.net.ssl,\ + javax.print,\ + javax.print.attribute,\ + javax.print.attribute.standard,\ + javax.print.event,\ + javax.rmi,\ + javax.rmi.CORBA,\ + javax.rmi.ssl,\ + javax.script,\ + javax.security.auth,\ + javax.security.auth.callback,\ + javax.security.auth.kerberos,\ + javax.security.auth.login,\ + javax.security.auth.spi,\ + javax.security.auth.x500,\ + javax.security.cert,\ + javax.security.sasl,\ + javax.sound.midi,\ + javax.sound.midi.spi,\ + javax.sound.sampled,\ + javax.sound.sampled.spi,\ + javax.sql,\ + javax.sql.rowset,\ + javax.sql.rowset.serial,\ + javax.sql.rowset.spi,\ + javax.swing,\ + javax.swing.border,\ + javax.swing.colorchooser,\ + javax.swing.event,\ + javax.swing.filechooser,\ + javax.swing.plaf,\ + javax.swing.plaf.basic,\ + javax.swing.plaf.metal,\ + javax.swing.plaf.multi,\ + javax.swing.plaf.nimbus,\ + javax.swing.plaf.synth,\ + javax.swing.table,\ + javax.swing.text,\ + javax.swing.text.html,\ + javax.swing.text.html.parser,\ + javax.swing.text.rtf,\ + javax.swing.tree,\ + javax.swing.undo,\ + javax.tools,\ + javax.transaction,\ + javax.transaction.xa,\ + javax.xml,\ + javax.xml.bind,\ + javax.xml.bind.annotation,\ + javax.xml.bind.annotation.adapters,\ + javax.xml.bind.attachment,\ + javax.xml.bind.helpers,\ + javax.xml.bind.util,\ + javax.xml.crypto,\ + javax.xml.crypto.dom,\ + javax.xml.crypto.dsig,\ + javax.xml.crypto.dsig.dom,\ + javax.xml.crypto.dsig.keyinfo,\ + javax.xml.crypto.dsig.spec,\ + javax.xml.datatype,\ + javax.xml.namespace,\ + javax.xml.parsers,\ + javax.xml.soap,\ + javax.xml.stream,\ + javax.xml.stream.events,\ + javax.xml.stream.util,\ + javax.xml.transform,\ + javax.xml.transform.dom,\ + javax.xml.transform.sax,\ + javax.xml.transform.stax,\ + javax.xml.transform.stream,\ + javax.xml.validation,\ + javax.xml.ws,\ + javax.xml.ws.handler,\ + javax.xml.ws.handler.soap,\ + javax.xml.ws.http,\ + javax.xml.ws.soap,\ + javax.xml.ws.spi,\ + javax.xml.ws.wsaddressing,\ + javax.xml.xpath,\ + org.ietf.jgss,\ + org.omg.CORBA,\ + org.omg.CORBA_2_3,\ + org.omg.CORBA_2_3.portable,\ + org.omg.CORBA.DynAnyPackage,\ + org.omg.CORBA.ORBPackage,\ + org.omg.CORBA.portable,\ + org.omg.CORBA.TypeCodePackage,\ + org.omg.CosNaming,\ + org.omg.CosNaming.NamingContextExtPackage,\ + org.omg.CosNaming.NamingContextPackage,\ + org.omg.Dynamic,\ + org.omg.DynamicAny,\ + org.omg.DynamicAny.DynAnyFactoryPackage,\ + org.omg.DynamicAny.DynAnyPackage,\ + org.omg.IOP,\ + org.omg.IOP.CodecFactoryPackage,\ + org.omg.IOP.CodecPackage,\ + org.omg.Messaging,\ + org.omg.PortableInterceptor,\ + org.omg.PortableInterceptor.ORBInitInfoPackage,\ + org.omg.PortableServer,\ + org.omg.PortableServer.CurrentPackage,\ + org.omg.PortableServer.POAManagerPackage,\ + org.omg.PortableServer.POAPackage,\ + org.omg.PortableServer.portable,\ + org.omg.PortableServer.ServantLocatorPackage,\ + org.omg.SendingContext,\ + org.omg.stub.java.rmi,\ + org.w3c.dom,\ + org.w3c.dom.bootstrap,\ + org.w3c.dom.css,\ + org.w3c.dom.events,\ + org.w3c.dom.html,\ + org.w3c.dom.ls,\ + org.w3c.dom.ranges,\ + org.w3c.dom.stylesheets,\ + org.w3c.dom.traversal,\ + org.w3c.dom.views,\ + org.w3c.dom.xpath,\ + org.xml.sax,\ + org.xml.sax.ext,\ + org.xml.sax.helpers +org.osgi.framework.bootdelegation = \ + javax.*,\ + org.ietf.jgss,\ + org.omg.*,\ + org.w3c.*,\ + org.xml.*,\ + sun.*,\ + com.sun.* +org.osgi.framework.executionenvironment = \ + OSGi/Minimum-1.0,\ + OSGi/Minimum-1.1,\ + OSGi/Minimum-1.2,\ + JRE-1.1,\ + J2SE-1.2,\ + J2SE-1.3,\ + J2SE-1.4,\ + J2SE-1.5,\ + JavaSE-1.6,\ + JavaSE-1.7 +osgi.java.profile.name = JavaSE-1.7 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error