import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.RepositoryException;
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.DefaultNameVersion;
+import org.argeo.slc.ModuleSet;
import org.argeo.slc.NameVersion;
import org.argeo.slc.SlcException;
import org.argeo.slc.aether.ArtifactIdComparator;
+import org.argeo.slc.build.Distribution;
import org.argeo.slc.repo.OsgiFactory;
import org.argeo.slc.repo.RepoUtils;
import org.sonatype.aether.artifact.Artifact;
* the jars, or import them directly if they are already OSGi bundles and don't
* need further modification.
*/
-public class ArchiveWrapper implements Runnable {
+public class ArchiveWrapper implements Runnable, ModuleSet, Distribution {
private final static Log log = LogFactory.getLog(ArchiveWrapper.class);
private OsgiFactory osgiFactory;
private String version;
-
+
private String uri;
- private List<String> fallbackUris = new ArrayList<String>();
-
- // jars to wrap as OSGi bundles
+
+ /** Jars to wrap as OSGi bundles */
private Map<String, BndWrapper> wrappers = new HashMap<String, BndWrapper>();
// pattern of OSGi bundles to import
for (BndWrapper wrapper : wrappers.values()) {
if (wrapper.getVersion() == null)
wrapper.setVersion(version);
+ wrapper.setFactory(this);
}
}
}
+ public String getDistributionId() {
+ return uri;
+ }
+
+ public Iterator<? extends NameVersion> nameVersions() {
+ return wrappers.values().iterator();
+ }
+
public void run() {
if (mavenGroupIndexes && (version == null))
throw new SlcException(
ZipEntry zentry = null;
entries: while ((zentry = zin.getNextEntry()) != null) {
String name = zentry.getName();
+
+ // sources autodetect
+ String baseName = FilenameUtils.getBaseName(name);
+ if (baseName.endsWith("-sources")) {
+ String bundle = baseName.substring(0, baseName.length()
+ - "-sources".length());
+ log.debug(name + "," + baseName + ", " + bundle);
+ String bundlePath = FilenameUtils.getPath(name) + bundle
+ + ".jar";
+ if (wrappers.containsKey(bundlePath)) {
+ BndWrapper wrapper = wrappers.get(bundlePath);
+ NameVersion bundleNv = new DefaultNameVersion(
+ wrapper.getName(), wrapper.getVersion());
+ byte[] pdeSource = RepoUtils.packageAsPdeSource(zin,
+ bundleNv);
+ Node pdeSourceNode = RepoUtils.copyBytesAsArtifact(
+ javaSession.getRootNode(),
+ new DefaultArtifact(wrapper.getCategory(),
+ wrapper.getName() + ".source", "jar",
+ wrapper.getVersion()), pdeSource);
+ osgiFactory.indexNode(pdeSourceNode);
+ }
+ } else if (baseName.endsWith(".source")) {
+ // TODO Eclipse source already available
+ }
+
+ // binaries
if (wrappers.containsKey(name)) {
BndWrapper wrapper = (BndWrapper) wrappers.get(name);
// we must copy since the stream is closed by BND
sourceJarBytes, wrapper);
addArtifactToIndex(binaries, wrapper.getGroupId(), artifact);
} else {
+ for (String wrapperKey : wrappers.keySet())
+ if (pathMatcher.match(wrapperKey, name)) {
+ // first matched is taken
+ BndWrapper wrapper = (BndWrapper) wrappers
+ .get(wrapperKey);
+ // we must copy since the stream is closed by BND
+ byte[] sourceJarBytes = IOUtils.toByteArray(zin);
+ Artifact artifact = wrapZipEntry(javaSession,
+ zentry, sourceJarBytes, wrapper);
+ addArtifactToIndex(binaries, wrapper.getGroupId(),
+ artifact);
+ continue entries;
+ } else {
+ if (log.isTraceEnabled())
+ log.trace(name + " not matched by "
+ + wrapperKey);
+ }
+
for (String exclude : excludes)
if (pathMatcher.match(exclude, name))
continue entries;