]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/ArchiveWrapper.java
Improve OSGi distribution
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / osgi / ArchiveWrapper.java
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 (file)
index 0000000..8439518
--- /dev/null
@@ -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<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;
+       }
+
+}