--- /dev/null
+package org.argeo.slc.repo.osgi;
+
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarEntry;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Session;
+
+import org.apache.commons.io.FilenameUtils;
+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;
+
+public class ArchiveSourcesProvider implements SourcesProvider {
+ private final static Log log = LogFactory
+ .getLog(ArchiveSourcesProvider.class);
+
+ private OsgiFactory osgiFactory;
+ private String uri;
+ private String base;
+
+ @Override
+ public void writeSources(List<String> packages, ZipOutputStream zout) {
+ Session distSession = null;
+ ZipInputStream zin = null;
+ try {
+ 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());
+
+ // prepare
+ Set<String> directories = new TreeSet<String>();
+ for (String pkg : packages)
+ if (!pkg.equals("META-INF"))
+ directories.add(base + pkg.replace('.', '/') + '/');
+
+ ZipEntry zentry = null;
+ entries: while ((zentry = zin.getNextEntry()) != null) {
+ String name = zentry.getName();
+ if (!name.startsWith(base))
+ continue entries;
+
+ String dirPath = FilenameUtils.getPath(name);
+ if (name.equals(dirPath))// directory
+ continue entries;
+
+ if (directories.contains(dirPath)) {
+ String path = name.substring(base.length());
+ zout.putNextEntry(new JarEntry(path));
+ IOUtils.copy(zin, zout);
+ zin.closeEntry();
+ zout.closeEntry();
+ continue entries;
+ }
+ }
+ } catch (Exception e) {
+ throw new SlcException("Cannot retrieve sources from " + uri, e);
+ } finally {
+ IOUtils.closeQuietly(zin);
+ JcrUtils.logoutQuietly(distSession);
+ }
+
+ }
+
+ public void setOsgiFactory(OsgiFactory osgiFactory) {
+ this.osgiFactory = osgiFactory;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ public void setBase(String base) {
+ this.base = base;
+ }
+
+}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
import javax.jcr.Node;
import javax.jcr.Property;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
+import aQute.lib.osgi.Jar;
+
/**
* Download a software distribution and generates the related OSGi bundles from
* the jars, or import them directly if they are already OSGi bundles and don't
/** Jars to wrap as OSGi bundles */
private Map<String, BndWrapper> wrappers = new HashMap<String, BndWrapper>();
+ private SourcesProvider sourcesProvider;
+
// pattern of OSGi bundles to import
private PathMatcher pathMatcher = new AntPathMatcher();
private Map<String, String> includes = new HashMap<String, String>();
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
Node newJarNode;
+ Jar jar = null;
try {
out = new ByteArrayOutputStream((int) zentry.getSize());
in = new ByteArrayInputStream(sourceJarBytes);
if (log.isDebugEnabled())
log.debug("Wrapped jar " + zentry.getName() + " to "
+ newJarNode.getPath());
+
+ // sources
+ if (sourcesProvider != null) {
+ IOUtils.closeQuietly(in);
+ in = new ByteArrayInputStream(out.toByteArray());
+ jar = new Jar(null, in);
+ List<String> packages = jar.getPackages();
+
+ IOUtils.closeQuietly(out);
+ out = new ByteArrayOutputStream();
+ sourcesProvider
+ .writeSources(packages, new ZipOutputStream(out));
+
+ IOUtils.closeQuietly(in);
+ in = new ByteArrayInputStream(out.toByteArray());
+ byte[] sourcesJar = RepoUtils.packageAsPdeSource(in,
+ new DefaultNameVersion(wrapper));
+ Artifact sourcesArtifact = new DefaultArtifact(
+ artifact.getGroupId(), artifact.getArtifactId()
+ + ".source", "jar", artifact.getVersion());
+ Node sourcesJarNode = RepoUtils.copyBytesAsArtifact(
+ javaSession.getRootNode(), sourcesArtifact, sourcesJar);
+ sourcesJarNode.getSession().save();
+
+ if (log.isDebugEnabled())
+ log.debug("Added sources " + sourcesArtifact
+ + " for bundle " + artifact);
+ }
+
return artifact;
+ } catch (IOException e) {
+ throw new SlcException("Cannot open jar", e);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
+ if (jar != null)
+ jar.close();
}
}
this.mavenGroupIndexes = mavenGroupIndexes;
}
+ public void setSourcesProvider(SourcesProvider sourcesProvider) {
+ this.sourcesProvider = sourcesProvider;
+ }
+
}
--- /dev/null
+package org.argeo.slc.repo.osgi;
+
+import java.util.List;
+import java.util.zip.ZipOutputStream;
+
+/** Provides access to Java sources */
+public interface SourcesProvider {
+ /**
+ * Writes sources into a ZIP (or a JAR), under the same sirectory structure.
+ *
+ * @param packages
+ * the packages to import
+ * @param out
+ * the ZIP or JAR to write to
+ */
+ public void writeSources(List<String> packages, ZipOutputStream zout);
+}
import javax.jcr.Node;
import javax.jcr.Property;
-import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.logging.Log;
private OsgiFactory osgiFactory;
+ // private SourcesProvider sourcesProvider;
+
public UriWrapper() {
setFactory(this);
}
Session javaSession = null;
InputStream in;
ByteArrayOutputStream out;
+ // Jar jar = null;
try {
distSession = osgiFactory.openDistSession();
javaSession = osgiFactory.openJavaSession();
newJarNode.getSession().save();
if (log.isDebugEnabled())
log.debug("Wrapped " + uri + " to " + newJarNode.getPath());
- } catch (RepositoryException e) {
- throw new SlcException("Cannot wrap Maven " + uri, e);
+
+ // sources
+ // if (sourcesProvider != null) {
+ // IOUtils.closeQuietly(in);
+ // in = new ByteArrayInputStream(out.toByteArray());
+ // jar = new Jar(null, in);
+ // List<String> packages = jar.getPackages();
+ //
+ // IOUtils.closeQuietly(out);
+ // out = new ByteArrayOutputStream();
+ // sourcesProvider
+ // .writeSources(packages, new ZipOutputStream(out));
+ //
+ // IOUtils.closeQuietly(in);
+ // in = new ByteArrayInputStream(out.toByteArray());
+ // byte[] sourcesJar = RepoUtils.packageAsPdeSource(in,
+ // new DefaultNameVersion(this));
+ // Artifact sourcesArtifact = new DefaultArtifact(getArtifact()
+ // .getGroupId(), getArtifact().getArtifactId()
+ // + ".source", "jar", getArtifact().getVersion());
+ // Node sourcesJarNode = RepoUtils.copyBytesAsArtifact(
+ // javaSession.getRootNode(), sourcesArtifact, sourcesJar);
+ // sourcesJarNode.getSession().save();
+ //
+ // if (log.isDebugEnabled())
+ // log.debug("Added sources " + sourcesArtifact
+ // + " for bundle " + getArtifact());
+ // }
+ } catch (Exception e) {
+ throw new SlcException("Cannot wrap URI " + uri, e);
} finally {
JcrUtils.logoutQuietly(distSession);
JcrUtils.logoutQuietly(javaSession);
+ // if (jar != null)
+ // jar.close();
}
}