]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java
Improve OSGi related processes
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / RepoUtils.java
index 80569b159cc495b14164942d37bd3f0c8be622ff..6d22cbe687632ebcff13c7f4df87412ab4e653fd 100644 (file)
@@ -23,11 +23,14 @@ import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.BasicNameVersion;
 import org.argeo.slc.NameVersion;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.maven.MavenConventionsUtils;
+import org.osgi.framework.Constants;
 import org.sonatype.aether.artifact.Artifact;
 import org.sonatype.aether.util.artifact.DefaultArtifact;
 
@@ -61,6 +64,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 +210,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 +226,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
         */
@@ -244,6 +270,29 @@ public class RepoUtils implements SlcNames {
                }
        }
 
+       /**
+        * Copy this bytes array as an artifact, relative to the root of the
+        * repository (typically the workspace root node)
+        */
+       public static Node copyBytesAsArtifact(Node artifactsBase,
+                       Artifact artifact, byte[] bytes) throws RepositoryException {
+               String parentPath = MavenConventionsUtils.artifactParentPath(
+                               artifactsBase.getPath(), artifact);
+               Node folderNode = JcrUtils.mkfolders(artifactsBase.getSession(),
+                               parentPath);
+               return JcrUtils.copyBytesAsFile(folderNode,
+                               MavenConventionsUtils.artifactFileName(artifact), bytes);
+       }
+
        private RepoUtils() {
        }
+
+       /** If a source return the base bundle name, does not change otherwise */
+       public static String extractBundleNameFromSourceName(String sourceBundleName) {
+               if (sourceBundleName.endsWith(".source"))
+                       return sourceBundleName.substring(0, sourceBundleName.length()
+                                       - ".source".length());
+               else
+                       return sourceBundleName;
+       }
 }