From 44c43b9c874d7c6edd4327f180d5506b3e9c99e6 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 9 May 2012 11:08:25 +0000 Subject: [PATCH] Migrate sources git-svn-id: https://svn.argeo.org/slc/trunk@5297 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../java/org/argeo/slc/repo/RepoUtils.java | 56 +++++++++++++------ .../slc/repo/maven/MavenConventionsUtils.java | 6 ++ .../argeo/slc/repo/maven/Migration_01_03.java | 49 ++++++++++++++++ 3 files changed, 95 insertions(+), 16 deletions(-) diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java index 80569b159..242cbe0e4 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java @@ -28,6 +28,7 @@ import org.argeo.slc.NameVersion; 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; @@ -61,6 +62,24 @@ public class RepoUtils implements SlcNames { } } + 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 @@ -189,25 +208,10 @@ public class RepoUtils implements SlcNames { /** 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()) { @@ -220,6 +224,26 @@ public class RepoUtils implements SlcNames { 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 */ diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java index 3531515cd..5296895a6 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java @@ -63,6 +63,12 @@ public class MavenConventionsUtils { .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) { diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java index b93831cc1..9e37f7592 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java @@ -24,6 +24,7 @@ import javax.jcr.query.qom.Selector; 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; @@ -254,6 +255,54 @@ public class Migration_01_03 implements Runnable, SlcNames { 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(); + } } /* -- 2.39.2