]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Migrate sources
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 9 May 2012 11:08:25 +0000 (11:08 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 9 May 2012 11:08:25 +0000 (11:08 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5297 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java

index 80569b159cc495b14164942d37bd3f0c8be622ff..242cbe0e4242a86412e20e2761bd48b26ead64ce 100644 (file)
@@ -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
         */
index 3531515cd9ad4a0cd441b55d96b1c0dbc67b66f6..5296895a6b0bc7352e9ed8f37cbb859ce1f3f750 100644 (file)
@@ -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) {
index b93831cc191c8bf0f071791030b84cba30e4582d..9e37f7592516e5de8b0aa099f7c57050516615b1 100644 (file)
@@ -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();
+               }
        }
 
        /*