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.argeo.slc.SlcException;
import org.argeo.slc.aether.ArtifactIdComparator;
import org.argeo.slc.build.Distribution;
+import org.argeo.slc.build.License;
import org.argeo.slc.repo.OsgiFactory;
import org.argeo.slc.repo.RepoUtils;
import org.sonatype.aether.artifact.Artifact;
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
private OsgiFactory osgiFactory;
private String version;
+ private License license;
private String uri;
/** 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>();
private Boolean mavenGroupIndexes = false;
public void init() {
- if (version != null)
- for (BndWrapper wrapper : wrappers.values()) {
- if (wrapper.getVersion() == null)
- wrapper.setVersion(version);
- wrapper.setFactory(this);
- }
+ for (BndWrapper wrapper : wrappers.values()) {
+ wrapper.setFactory(this);
+ if (version != null && wrapper.getVersion() == null)
+ wrapper.setVersion(version);
+ if (license != null && wrapper.getLicense() == null)
+ wrapper.setLicense(license);
+ }
}
public void destroy() {
if (baseName.endsWith("-sources")) {
String bundle = baseName.substring(0, baseName.length()
- "-sources".length());
- log.debug(name + "," + baseName + ", " + bundle);
+ // log.debug(name + "," + baseName + ", " + bundle);
String bundlePath = FilenameUtils.getPath(name) + bundle
+ ".jar";
if (wrappers.containsKey(bundlePath)) {
wrapper.getName() + ".source", "jar",
wrapper.getVersion()), pdeSource);
osgiFactory.indexNode(pdeSourceNode);
+ pdeSourceNode.getSession().save();
}
} else if (baseName.endsWith(".source")) {
// TODO Eclipse source already available
}
}
+ // FIXME Fail if not all wrappers matched
} catch (Exception e) {
throw new SlcException("Cannot wrap distribution " + uri, e);
} finally {
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.version = version;
}
+ public void setLicense(License license) {
+ this.license = license;
+ }
+
public void setPathMatcher(PathMatcher pathMatcher) {
this.pathMatcher = pathMatcher;
}
this.mavenGroupIndexes = mavenGroupIndexes;
}
+ public void setSourcesProvider(SourcesProvider sourcesProvider) {
+ this.sourcesProvider = sourcesProvider;
+ }
+
}