]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/BndWrapper.java
Add BSD License.
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / osgi / BndWrapper.java
index f1acf49e4d8c54fb2e10c3d953ab73db1455beba..7b75b903d4609df31054fc876042ad05c8c4a767 100644 (file)
@@ -1,15 +1,18 @@
 package org.argeo.slc.repo.osgi;
 
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Properties;
 import java.util.jar.Manifest;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.CategorizedNameVersion;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.build.Distribution;
+import org.argeo.slc.build.License;
 import org.osgi.framework.Version;
 import org.sonatype.aether.artifact.Artifact;
 import org.sonatype.aether.util.artifact.DefaultArtifact;
@@ -26,40 +29,48 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
 
        private String groupId;
        private String name;
-       private String version;
        private Properties bndProperties = new Properties();
 
+       private String version;
+       private License license;
+
        private Boolean doNotModify = false;
 
+       private Runnable factory = null;
+
        public void wrapJar(InputStream in, OutputStream out) {
                Builder b = new Builder();
+               Jar jar = null;
                try {
-                       Jar jar = new Jar(null, in);
+                       byte[] jarBytes = IOUtils.toByteArray(in);
 
+                       jar = new Jar(null, new ByteArrayInputStream(jarBytes));
                        Manifest sourceManifest = jar.getManifest();
 
                        Version versionToUse;
                        if (sourceManifest != null) {
+                               // Symbolic name
                                String sourceSymbolicName = sourceManifest.getMainAttributes()
                                                .getValue(BUNDLE_SYMBOLICNAME);
                                if (sourceSymbolicName != null
-                                               && sourceSymbolicName.equals(name))
+                                               && !sourceSymbolicName.equals(name))
                                        log.warn("The new symbolic name ("
                                                        + name
                                                        + ") is not consistant with the wrapped bundle symbolic name ("
                                                        + sourceSymbolicName + ")");
 
+                               // Version
                                String sourceVersion = sourceManifest.getMainAttributes()
                                                .getValue(BUNDLE_VERSION);
-                               if (version == null && sourceVersion == null) {
+                               if (getVersion() == null && sourceVersion == null) {
                                        throw new SlcException("A bundle version must be defined.");
-                               } else if (version == null && sourceVersion != null) {
+                               } else if (getVersion() == null && sourceVersion != null) {
                                        versionToUse = new Version(sourceVersion);
                                        version = sourceVersion; // set wrapper version
-                               } else if (version != null && sourceVersion == null) {
-                                       versionToUse = new Version(version);
+                               } else if (getVersion() != null && sourceVersion == null) {
+                                       versionToUse = new Version(getVersion());
                                } else {// both set
-                                       versionToUse = new Version(version);
+                                       versionToUse = new Version(getVersion());
                                        Version sv = new Version(sourceVersion);
                                        if (versionToUse.getMajor() != sv.getMajor()
                                                        || versionToUse.getMinor() != sv.getMinor()
@@ -71,11 +82,12 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
                                        }
                                }
                        } else {
-                               versionToUse = new Version(version);
+                               versionToUse = new Version(getVersion());
                        }
 
                        if (doNotModify) {
-                               jar.write(out);
+                               IOUtils.write(jarBytes, out);
+                               // jar.write(out);
                        } else {
 
                                Properties properties = new Properties();
@@ -83,6 +95,21 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
                                properties.setProperty(BUNDLE_SYMBOLICNAME, name);
                                properties.setProperty(BUNDLE_VERSION, versionToUse.toString());
 
+                               // License
+                               if (license != null) {
+                                       StringBuilder sb = new StringBuilder(license.getUri());
+                                       if (license.getName() != null)
+                                               sb.append(';').append("description=")
+                                                               .append(license.getName());
+                                       if (license.getLink() != null)
+                                               sb.append(';').append("link=")
+                                                               .append(license.getLink());
+                                       properties.setProperty(BUNDLE_LICENSE, sb.toString());
+                                       // TODO add LICENSE.TXT
+                               } else {
+                                       log.warn("No license set for " + toString());
+                               }
+
                                // b.addIncluded(jarFile);
                                b.addClasspath(jar);
 
@@ -92,15 +119,28 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
 
                                Jar newJar = b.build();
                                newJar.write(out);
+                               newJar.close();
                        }
                } catch (Exception e) {
                        throw new SlcException("Cannot wrap jar", e);
                } finally {
                        b.close();
+                       if (jar != null)
+                               jar.close();
                }
 
        }
 
+       public Runnable getFactory() {
+               return factory;
+       }
+
+       public void setFactory(Runnable factory) {
+               if (this.factory != null)
+                       throw new SlcException("Factory already set on " + name);
+               this.factory = factory;
+       }
+
        public void setName(String bsn) {
                this.name = bsn;
        }
@@ -110,6 +150,9 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
        }
 
        public void setVersion(String version) {
+               if (this.version != null)
+                       throw new SlcException("Version already set on " + name + " ("
+                                       + this.version + ")");
                this.version = version;
        }
 
@@ -117,6 +160,16 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
                return version;
        }
 
+       public License getLicense() {
+               return license;
+       }
+
+       public void setLicense(License license) {
+               if (this.license != null)
+                       throw new SlcException("License already set on " + name);
+               this.license = license;
+       }
+
        public Properties getBndProperties() {
                return bndProperties;
        }
@@ -126,7 +179,12 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
        }
 
        public void setBeanName(String name) {
-               this.name = name;
+               if (this.name == null) {
+                       this.name = name;
+               } else {
+                       log.warn("Using explicitely set name " + this.name
+                                       + " and not bean name " + name);
+               }
        }
 
        public String getGroupId() {
@@ -146,7 +204,7 @@ public class BndWrapper implements Constants, CategorizedNameVersion,
        }
 
        public Artifact getArtifact() {
-               return new DefaultArtifact(groupId, name, "jar", version);
+               return new DefaultArtifact(groupId, name, "jar", getVersion());
        }
 
        @Override