--- /dev/null
+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();
+ }
+
+}
--- /dev/null
+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<ArtifactDistribution> provides();
+}
--- /dev/null
+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<String, BndWrapper> wrappers = new HashMap<String, BndWrapper>();
+
+ 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<ArtifactDistribution> provides() {
+ // List<ArtifactDistribution> res = new ArrayList<ArtifactDistribution>();
+ // 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<String, BndWrapper> wrappers) {
+ this.wrappers = wrappers;
+ }
+
+ public void setOsgiFactory(OsgiFactory osgiFactory) {
+ this.osgiFactory = osgiFactory;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+}
--- /dev/null
+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<ArtifactDistribution> modules = new HashSet<ArtifactDistribution>();
+
+ 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<NameVersion> listModulesNameVersions() {
+ return new TreeSet<NameVersion>(modules);
+ }
+
+ public Object getModulesDescriptor(String descriptorType) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setModules(Set<ArtifactDistribution> modules) {
+ this.modules = modules;
+ }
+
+}
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);
}
}
- 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();
}
- 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) {
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;
// 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 {
+++ /dev/null
-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<String, BndWrapper> wrappers = new HashMap<String, BndWrapper>();
-
- 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<String, BndWrapper> wrappers) {
- this.wrappers = wrappers;
- }
-
- public void setGroupId(String groupId) {
- this.groupId = groupId;
- }
-
- public void setOsgiFactory(OsgiFactory osgiFactory) {
- this.osgiFactory = osgiFactory;
- }
-
-}
--- /dev/null
+###############################################################################
+# 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