X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2Fosgi%2FArchiveWrapper.java;h=a34b64fb39802ad1a7f9f4aff967aef2379ef304;hb=5686259eb6e4da5006034087c71f349b3097be8d;hp=8d1cee58d4859750b4cd51fb408d7d6b2cd189ba;hpb=1f0e95374536f1e521eb7b29a6704c1a9d79b94c;p=gpl%2Fargeo-slc.git 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 index 8d1cee58d..a34b64fb3 100644 --- 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 @@ -2,9 +2,9 @@ package org.argeo.slc.repo.osgi; 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; @@ -17,13 +17,17 @@ import javax.jcr.Property; 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; @@ -36,16 +40,15 @@ import org.springframework.util.PathMatcher; * 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 fallbackUris = new ArrayList(); - - // jars to wrap as OSGi bundles + + /** Jars to wrap as OSGi bundles */ private Map wrappers = new HashMap(); // pattern of OSGi bundles to import @@ -60,6 +63,7 @@ public class ArchiveWrapper implements Runnable { for (BndWrapper wrapper : wrappers.values()) { if (wrapper.getVersion() == null) wrapper.setVersion(version); + wrapper.setFactory(this); } } @@ -67,6 +71,14 @@ public class ArchiveWrapper implements Runnable { } + public String getDistributionId() { + return uri; + } + + public Iterator nameVersions() { + return wrappers.values().iterator(); + } + public void run() { if (mavenGroupIndexes && (version == null)) throw new SlcException( @@ -92,6 +104,33 @@ public class ArchiveWrapper implements Runnable { 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 @@ -100,6 +139,24 @@ public class ArchiveWrapper implements Runnable { 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;