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; } }