--- /dev/null
+package org.argeo.slc.repo.osgi;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Session;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.DefaultNameVersion;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.repo.OsgiFactory;
+import org.argeo.slc.repo.RepoUtils;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+
+/**
+ * BND wrapper based on a Maven artifact available from one of the configured
+ * repositories.
+ */
+public class MavenWrapper extends BndWrapper implements Runnable {
+ private final static CmsLog log = CmsLog.getLog(MavenWrapper.class);
+
+ private String sourceCoords;
+
+ private OsgiFactory osgiFactory;
+
+ private Boolean doNotModifySources = false;
+
+ public MavenWrapper() {
+ setFactory(this);
+ }
+
+ @Override
+ public String getVersion() {
+ String version = super.getVersion();
+ if (version != null)
+ return version;
+ return new DefaultArtifact(sourceCoords).getVersion();
+ }
+
+ public void run() {
+ Session distSession = null;
+ Session javaSession = null;
+ InputStream in = null;
+ ByteArrayOutputStream out = null;
+ try {
+ distSession = osgiFactory.openDistSession();
+ javaSession = osgiFactory.openJavaSession();
+ Node origArtifact;
+ try {
+ origArtifact = osgiFactory.getMaven(distSession, sourceCoords);
+ } catch (Exception e1) {
+ origArtifact = osgiFactory.getMaven(distSession, sourceCoords + ":" + getVersion());
+ }
+
+ in = origArtifact.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary().getStream();
+ out = new ByteArrayOutputStream();
+ wrapJar(in, out);
+ Node newJarNode = RepoUtils.copyBytesAsArtifact(javaSession.getRootNode(), getArtifact(),
+ out.toByteArray());
+ osgiFactory.indexNode(newJarNode);
+ newJarNode.getSession().save();
+
+ if (log.isDebugEnabled())
+ log.debug("Wrapped Maven " + sourceCoords + " to " + newJarNode.getPath());
+
+ // sources
+ Artifact sourcesArtifact = new SubArtifact(new DefaultArtifact(sourceCoords), "sources", null);
+ Node sourcesArtifactNode;
+ try {
+
+ sourcesArtifactNode = osgiFactory.getMaven(distSession, sourcesArtifact.toString());
+ } catch (SlcException e) {
+ // no sources available
+ return;
+ }
+
+ IOUtils.closeQuietly(in);
+ in = sourcesArtifactNode.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary().getStream();
+ byte[] pdeSource;
+ if (doNotModifySources)
+ pdeSource = IOUtils.toByteArray(in);
+ else
+ pdeSource = RepoUtils.packageAsPdeSource(in, new DefaultNameVersion(getName(), getVersion()));
+ Node pdeSourceNode = RepoUtils.copyBytesAsArtifact(javaSession.getRootNode(),
+ new DefaultArtifact(getCategory(), getName() + ".source", "jar", getVersion()), pdeSource);
+ osgiFactory.indexNode(pdeSourceNode);
+ pdeSourceNode.getSession().save();
+
+ if (log.isDebugEnabled())
+ log.debug("Wrapped Maven " + sourcesArtifact + " to PDE sources " + pdeSourceNode.getPath());
+ } catch (Exception e) {
+ throw new SlcException("Cannot wrap Maven " + sourceCoords, e);
+ } finally {
+ JcrUtils.logoutQuietly(distSession);
+ JcrUtils.logoutQuietly(javaSession);
+ IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(out);
+ }
+ }
+
+ public void setSourceCoords(String sourceCoords) {
+ this.sourceCoords = sourceCoords;
+ }
+
+ public String getSourceCoords() {
+ return sourceCoords;
+ }
+
+ public void setOsgiFactory(OsgiFactory osgiFactory) {
+ this.osgiFactory = osgiFactory;
+ }
+
+ public void setDoNotModifySources(Boolean doNotModifySources) {
+ this.doNotModifySources = doNotModifySources;
+ }
+
+}