--- /dev/null
+package org.argeo.slc.repo;
+
+import javax.jcr.Binary;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.commons.io.FilenameUtils;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.NameVersion;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.repo.maven.AetherUtils;
+import org.argeo.slc.repo.maven.MavenConventionsUtils;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+
+/**
+ * Creates pde sources from a source {@link Artifact} with name
+ * "...-sources.jar"
+ */
+public class PdeSourcesIndexer implements NodeIndexer {
+ private CmsLog log = CmsLog.getLog(PdeSourcesIndexer.class);
+
+ private String artifactBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
+
+ // private ArtifactIndexer artifactIndexer;
+ // private JarFileIndexer jarFileIndexer;
+
+ // public PdeSourcesIndexer(){
+ // // ArtifactIndexer artifactIndexer,
+ // // JarFileIndexer jarFileIndexer) {
+ // // this.artifactIndexer = artifactIndexer;
+ // // this.jarFileIndexer = jarFileIndexer;
+ // }
+
+ public Boolean support(String path) {
+ // TODO implement clean management of same name siblings
+ String name = FilenameUtils.getBaseName(path);
+ // int lastInd = name.lastIndexOf("[");
+ // if (lastInd != -1)
+ // name = name.substring(0, lastInd);
+ return name.endsWith("-sources") && FilenameUtils.getExtension(path).equals("jar");
+ }
+
+ public void index(Node sourcesNode) {
+ try {
+ if (!support(sourcesNode.getPath()))
+ return;
+
+ packageSourcesAsPdeSource(sourcesNode);
+ } catch (Exception e) {
+ throw new SlcException("Cannot generate pde sources for node " + sourcesNode, e);
+ }
+ }
+
+ protected void packageSourcesAsPdeSource(Node sourcesNode) {
+ Binary origBinary = null;
+ Binary osgiBinary = null;
+ try {
+ Session session = sourcesNode.getSession();
+ Artifact sourcesArtifact = AetherUtils.convertPathToArtifact(sourcesNode.getPath(), null);
+
+ // read name version from manifest
+ Artifact osgiArtifact = new DefaultArtifact(sourcesArtifact.getGroupId(), sourcesArtifact.getArtifactId(),
+ sourcesArtifact.getExtension(), sourcesArtifact.getVersion());
+ String osgiPath = MavenConventionsUtils.artifactPath(artifactBasePath, osgiArtifact);
+ osgiBinary = session.getNode(osgiPath).getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary();
+
+ NameVersion nameVersion = RepoUtils.readNameVersion(osgiBinary.getStream());
+ if (nameVersion == null) {
+ log.warn("Cannot package PDE sources for " + osgiPath + " as it is probably not an OSGi bundle");
+ return;
+ }
+
+ // create PDe sources artifact
+ Artifact pdeSourceArtifact = new DefaultArtifact(sourcesArtifact.getGroupId(),
+ sourcesArtifact.getArtifactId() + ".source", sourcesArtifact.getExtension(),
+ sourcesArtifact.getVersion());
+ String targetSourceParentPath = MavenConventionsUtils.artifactParentPath(artifactBasePath,
+ pdeSourceArtifact);
+ String targetSourceFileName = MavenConventionsUtils.artifactFileName(pdeSourceArtifact);
+ // String targetSourceJarPath = targetSourceParentPath + '/'
+ // + targetSourceFileName;
+
+ Node targetSourceParentNode = JcrUtils.mkfolders(session, targetSourceParentPath);
+ origBinary = sourcesNode.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary();
+ byte[] targetJarBytes = RepoUtils.packageAsPdeSource(origBinary.getStream(), nameVersion);
+ JcrUtils.copyBytesAsFile(targetSourceParentNode, targetSourceFileName, targetJarBytes);
+
+ // reindex
+ // Automagically done via the various listeners or manually
+ // triggered.
+ // Node targetSourceJarNode = session.getNode(targetSourceJarPath);
+ // artifactIndexer.index(targetSourceJarNode);
+ // jarFileIndexer.index(targetSourceJarNode);
+ if (log.isTraceEnabled())
+ log.trace("Created pde source artifact " + pdeSourceArtifact + " from " + sourcesNode);
+
+ } catch (RepositoryException e) {
+ throw new SlcException("Cannot add PDE sources for " + sourcesNode, e);
+ } finally {
+ JcrUtils.closeQuietly(origBinary);
+ JcrUtils.closeQuietly(osgiBinary);
+ }
+ }
+}
\ No newline at end of file