X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2Fosgi%2FArchiveWrapper.java;fp=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2Fosgi%2FArchiveWrapper.java;h=843951843c927cf6348c3e04379f4f87d947cedf;hb=a0a0f0b074c867a73dabca20b28767a2f7475745;hp=0000000000000000000000000000000000000000;hpb=a05c9432445454825a97a74a431170b49903ca3c;p=gpl%2Fargeo-slc.git 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; + } + +}