From a0a0f0b074c867a73dabca20b28767a2f7475745 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 20 Aug 2013 13:46:39 +0000 Subject: [PATCH] Improve OSGi distribution git-svn-id: https://svn.argeo.org/slc/trunk@6400 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../argeo/slc/repo/ArtifactDistribution.java | 51 +++++ .../argeo/slc/repo/OsgiBundlesProvider.java | 12 ++ ...butionWrapper.java => ArchiveWrapper.java} | 50 +++-- .../slc/repo/osgi/ArgeoOsgiDistribution.java | 62 ++++++ .../org/argeo/slc/repo/osgi/BndWrapper.java | 53 ++++- .../argeo/slc/repo/osgi/JavaSE-1.7.profile | 198 ++++++++++++++++++ 6 files changed, 398 insertions(+), 28 deletions(-) create mode 100644 runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactDistribution.java create mode 100644 runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/OsgiBundlesProvider.java rename runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/{DistributionWrapper.java => ArchiveWrapper.java} (75%) create mode 100644 runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArgeoOsgiDistribution.java create mode 100644 runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/osgi/JavaSE-1.7.profile 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/DistributionWrapper.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java similarity index 75% rename from runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/DistributionWrapper.java rename to runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java index 094ee894c..843951843 100644 --- 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/ArchiveWrapper.java @@ -4,7 +4,6 @@ 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; @@ -20,21 +19,31 @@ 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); +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 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; @@ -62,22 +71,21 @@ public class DistributionWrapper implements Runnable { if (wrappers.containsKey(name)) { BndWrapper wrapper = (BndWrapper) wrappers.get(name); - if (wrapper.getVersion() == null) - wrapper.setVersion(version);// FIXME stateful? + // 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); + wrapper.wrapJar(in, out); - Artifact newArtifact = new DefaultArtifact(groupId, - wrapper.getBsn(), "jar", wrapper.getVersion()); + 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()); @@ -96,9 +104,15 @@ public class DistributionWrapper implements Runnable { } } - public void setVersion(String version) { - this.version = version; - } + // 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; @@ -108,12 +122,12 @@ public class DistributionWrapper implements Runnable { this.wrappers = wrappers; } - public void setGroupId(String groupId) { - this.groupId = groupId; - } - 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/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 -- 2.39.5