import org.argeo.slc.SlcException;
import org.argeo.slc.jcr.SlcNames;
import org.argeo.slc.jcr.SlcTypes;
+import org.osgi.framework.Constants;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.util.artifact.DefaultArtifact;
}
}
+ public static byte[] packageAsPdeSource(InputStream sourceJar,
+ NameVersion nameVersion) {
+ String sourceSymbolicName = nameVersion.getName() + ".source";
+
+ Manifest sourceManifest = null;
+ sourceManifest = new Manifest();
+ sourceManifest.getMainAttributes().put(
+ Attributes.Name.MANIFEST_VERSION, "1.0");
+ sourceManifest.getMainAttributes().putValue("Bundle-SymbolicName",
+ sourceSymbolicName);
+ sourceManifest.getMainAttributes().putValue("Bundle-Version",
+ nameVersion.getVersion());
+ sourceManifest.getMainAttributes().putValue("Eclipse-SourceBundle",
+ nameVersion.getName() + ";version=" + nameVersion.getVersion());
+
+ return modifyManifest(sourceJar, sourceManifest);
+ }
+
/**
* Check whether the file as already been packaged as PDE source, in order
* not to mess with Jar signing
/** Read the OSGi {@link NameVersion} */
public static NameVersion readNameVersion(File artifactFile) {
JarInputStream jarInputStream = null;
-
try {
- BasicNameVersion nameVersion = new BasicNameVersion();
jarInputStream = new JarInputStream(new FileInputStream(
artifactFile));
- nameVersion.setName(jarInputStream.getManifest()
- .getMainAttributes().getValue("Bundle-SymbolicName"));
-
- // Skip additional specs such as
- // ; singleton:=true
- if (nameVersion.getName().indexOf(';') > -1) {
- nameVersion.setName(new StringTokenizer(nameVersion.getName(),
- " ;").nextToken());
- }
-
- nameVersion.setVersion(jarInputStream.getManifest()
- .getMainAttributes().getValue("Bundle-Version"));
-
- return nameVersion;
+ return readNameVersion(jarInputStream.getManifest());
} catch (Exception e) {
// probably not a jar, skipping
if (log.isDebugEnabled()) {
return null;
}
+ /** Read the OSGi {@link NameVersion} */
+ public static NameVersion readNameVersion(Manifest manifest) {
+ BasicNameVersion nameVersion = new BasicNameVersion();
+ nameVersion.setName(manifest.getMainAttributes().getValue(
+ Constants.BUNDLE_SYMBOLICNAME));
+
+ // Skip additional specs such as
+ // ; singleton:=true
+ if (nameVersion.getName().indexOf(';') > -1) {
+ nameVersion
+ .setName(new StringTokenizer(nameVersion.getName(), " ;")
+ .nextToken());
+ }
+
+ nameVersion.setVersion(manifest.getMainAttributes().getValue(
+ Constants.BUNDLE_VERSION));
+
+ return nameVersion;
+ }
+
/*
* DATA MODEL
*/
.getClassifier()) + '.' + artifact.getExtension();
}
+ /** Absolute path to the file */
+ public static String artifactPath(String artifactBasePath, Artifact artifact) {
+ return artifactParentPath(artifactBasePath, artifact) + '/'
+ + artifactFileName(artifact);
+ }
+
/** Absolute path to the directories where the files will be stored */
public static String artifactParentPath(String artifactBasePath,
Artifact artifact) {
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.NameVersion;
import org.argeo.slc.SlcException;
import org.argeo.slc.jcr.SlcNames;
import org.argeo.slc.jcr.SlcTypes;
jarFileIndexer.index(targetJarNode);
targetSession.save();
+
+ // sources
+ Artifact origSourceArtifact = new DefaultArtifact(
+ origArtifact.getGroupId(), origArtifact.getArtifactId()
+ + ".source", "jar", origArtifact.getVersion());
+ String origSourcePath = MavenConventionsUtils.artifactPath(
+ artifactBasePath, origSourceArtifact);
+ if (origSession.itemExists(origSourcePath)) {
+ Node origSourceJarNode = origSession.getNode(origSourcePath);
+
+ Artifact targetSourceArtifact = new DefaultArtifact(targetGroupId,
+ targetArtifactId + ".source", "jar",
+ origArtifact.getVersion());
+ String targetSourceParentPath = MavenConventionsUtils
+ .artifactParentPath(artifactBasePath, targetSourceArtifact);
+ String targetSourceFileName = MavenConventionsUtils
+ .artifactFileName(targetSourceArtifact);
+ String targetSourceJarPath = targetSourceParentPath + '/'
+ + targetSourceFileName;
+
+ Node targetSourceParentNode = JcrUtils.mkfolders(targetSession,
+ targetSourceParentPath);
+ targetSession.save();
+
+ if (!targetSymbolicName.equals(origSymbolicName)) {
+ Binary origBinary = origSourceJarNode.getNode(Node.JCR_CONTENT)
+ .getProperty(Property.JCR_DATA).getBinary();
+ NameVersion targetNameVersion = RepoUtils
+ .readNameVersion(targetManifest);
+ byte[] targetJarBytes = RepoUtils.packageAsPdeSource(
+ origBinary.getStream(), targetNameVersion);
+ JcrUtils.copyBytesAsFile(targetSourceParentNode,
+ targetSourceFileName, targetJarBytes);
+ JcrUtils.closeQuietly(origBinary);
+ } else {// just copy
+ targetSession.getWorkspace().copy(sourceWorkspace,
+ origSourceJarNode.getPath(), targetSourceJarPath);
+ }
+ targetSession.save();
+
+ // reindex
+ Node targetSourceJarNode = targetSession
+ .getNode(targetSourceJarPath);
+ artifactIndexer.index(targetSourceJarNode);
+ jarFileIndexer.index(targetSourceJarNode);
+
+ targetSession.save();
+ }
}
/*