]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java
Improve Apache SSHD packaging
[gpl/argeo-slc.git] / org.argeo.slc.factory / src / org / argeo / slc / factory / A2Factory.java
index 5aa9d9d5370a977f6b5f178b4be2bcb674d40a15..b9c69dea3a34664cf4fdc1638c6feda3691786b2 100644 (file)
@@ -36,6 +36,7 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
+import java.util.zip.Deflater;
 
 import org.argeo.slc.DefaultCategoryNameVersion;
 import org.argeo.slc.DefaultNameVersion;
@@ -249,6 +250,8 @@ public class A2Factory {
                try (InputStream in = Files.newInputStream(mergeBnd)) {
                        mergeProps.load(in);
                }
+
+               // Version
                String m2Version = mergeProps.getProperty(SLC_ORIGIN_M2.toString());
                if (m2Version == null) {
                        logger.log(Level.WARNING, "Ignoring " + duDir + " as it is not an M2-based distribution unit");
@@ -258,6 +261,7 @@ public class A2Factory {
                        throw new IllegalStateException("Only the M2 version can be specified: " + m2Version);
                }
                m2Version = m2Version.substring(1);
+               mergeProps.put(ManifestConstants.BUNDLE_VERSION.toString(), m2Version);
 
                String artifactsStr = mergeProps.getProperty(ManifestConstants.SLC_ORIGIN_M2_MERGE.toString());
                String repoStr = mergeProps.containsKey(SLC_ORIGIN_M2_REPO.toString())
@@ -265,6 +269,8 @@ public class A2Factory {
                                : null;
 
                String bundleSymbolicName = mergeProps.getProperty(ManifestConstants.BUNDLE_SYMBOLICNAME.toString());
+               if (bundleSymbolicName == null)
+                       throw new IllegalArgumentException("Bundle-SymbolicName must be set in " + mergeBnd);
                DefaultCategoryNameVersion nameVersion = new DefaultArtifact(
                                category + ":" + bundleSymbolicName + ":" + m2Version);
                Path targetBundleDir = targetCategoryBase.resolve(bundleSymbolicName + "." + nameVersion.getBranch());
@@ -284,17 +290,23 @@ public class A2Factory {
                                entries: while ((entry = jarIn.getNextJarEntry()) != null) {
                                        if (entry.isDirectory())
                                                continue entries;
-                                       if (entry.getName().endsWith(".RSA") || entry.getName().endsWith(".SF"))
+                                       else if (entry.getName().endsWith(".RSA") || entry.getName().endsWith(".SF"))
+                                               continue entries;
+                                       else if (entry.getName().startsWith("META-INF/versions/"))
+                                               continue entries;
+                                       else if (entry.getName().startsWith("META-INF/maven/"))
+                                               continue entries;
+                                       else if (entry.getName().equals("module-info.class"))
                                                continue entries;
-                                       if (entry.getName().startsWith("META-INF/versions/"))
+                                       else if (entry.getName().equals("META-INF/NOTICE"))
                                                continue entries;
-                                       if (entry.getName().startsWith("META-INF/maven/"))
+                                       else if (entry.getName().equals("META-INF/NOTICE.txt"))
                                                continue entries;
-                                       if (entry.getName().equals("module-info.class"))
+                                       else if (entry.getName().equals("META-INF/LICENSE"))
                                                continue entries;
-                                       if (entry.getName().equals("META-INF/NOTICE"))
+                                       else if (entry.getName().equals("META-INF/LICENSE.md"))
                                                continue entries;
-                                       if (entry.getName().equals("META-INF/LICENSE"))
+                                       else if (entry.getName().equals("META-INF/LICENSE-notice.md"))
                                                continue entries;
                                        Path target = targetBundleDir.resolve(entry.getName());
                                        Files.createDirectories(target.getParent());
@@ -306,13 +318,13 @@ public class A2Factory {
                                                                out.write("\n".getBytes());
                                                                jarIn.transferTo(out);
                                                                if (logger.isLoggable(DEBUG))
-                                                                       logger.log(DEBUG, "Appended " + entry.getName());
+                                                                       logger.log(DEBUG, artifact.getArtifactId() + " - Appended " + entry.getName());
                                                        }
                                                } else if (entry.getName().startsWith("org/apache/batik/")) {
                                                        logger.log(Level.WARNING, "Skip " + entry.getName());
                                                        continue entries;
                                                } else {
-                                                       throw new IllegalStateException("File " + target + " already exists");
+                                                       throw new IllegalStateException("File " + target + " from " + artifact + " already exists");
                                                }
                                        }
                                        logger.log(Level.TRACE, () -> "Copied " + target);
@@ -322,6 +334,21 @@ public class A2Factory {
                        downloadAndProcessM2Sources(repoStr, artifact, targetBundleDir);
                }
 
+               // additional service files
+               Path servicesDir = duDir.resolve("services");
+               if (Files.exists(servicesDir)) {
+                       for (Path p : Files.newDirectoryStream(servicesDir)) {
+                               Path target = targetBundleDir.resolve("META-INF/services/").resolve(p.getFileName());
+                               try (InputStream in = Files.newInputStream(p);
+                                               OutputStream out = Files.newOutputStream(target, StandardOpenOption.APPEND);) {
+                                       out.write("\n".getBytes());
+                                       in.transferTo(out);
+                                       if (logger.isLoggable(DEBUG))
+                                               logger.log(DEBUG, "Appended " + p);
+                               }
+                       }
+               }
+
                Map<String, String> entries = new TreeMap<>();
                try (Analyzer bndAnalyzer = new Analyzer()) {
                        bndAnalyzer.setProperties(mergeProps);
@@ -342,7 +369,7 @@ public class A2Factory {
                                                && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\""))
                                        continue keys;// hack for very old classes
                                entries.put(key.toString(), value.toString());
-                               logger.log(DEBUG, () -> key + "=" + value);
+                               // logger.log(DEBUG, () -> key + "=" + value);
 
                        }
                } catch (Exception e) {
@@ -356,6 +383,13 @@ public class A2Factory {
                        String value = entries.get(key);
                        manifest.getMainAttributes().putValue(key, value);
                }
+
+//             // Use Maven version as Bundle-Version
+//             String bundleVersion = manifest.getMainAttributes().getValue(ManifestConstants.BUNDLE_VERSION.toString());
+//             if (bundleVersion == null || bundleVersion.trim().equals("0")) {
+//                     // TODO check why it is sometimes set to "0"
+//                     manifest.getMainAttributes().putValue(ManifestConstants.BUNDLE_VERSION.toString(), m2Version);
+//             }
                try (OutputStream out = Files.newOutputStream(manifestPath)) {
                        manifest.write(out);
                }
@@ -419,7 +453,7 @@ public class A2Factory {
                                                                && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\""))
                                                        continue keys;// hack for very old classes
                                                additionalEntries.put(key.toString(), value.toString());
-                                               logger.log(DEBUG, () -> key + "=" + value);
+                                               // logger.log(DEBUG, () -> key + "=" + value);
 
                                        }
                                }
@@ -450,7 +484,7 @@ public class A2Factory {
                URL sourcesUrl = MavenConventionsUtils.mavenRepoUrl(repoStr, sourcesArtifact);
                Path sourcesDownloaded = download(sourcesUrl, originBase, artifact, true);
                processM2SourceJar(sourcesDownloaded, targetBundleDir);
-               logger.log(Level.DEBUG, () -> "Processed source " + sourcesDownloaded);
+               logger.log(Level.TRACE, () -> "Processed source " + sourcesDownloaded);
 
        }
 
@@ -475,6 +509,8 @@ public class A2Factory {
                                        continue entries;
                                if (entry.getName().startsWith("module-info.java"))// skip META-INF entries
                                        continue entries;
+                               if (entry.getName().startsWith("/")) // absolute paths
+                                       continue entries;
                                Path target = targetSourceDir.resolve(entry.getName());
                                Files.createDirectories(target.getParent());
                                if (!Files.exists(target)) {
@@ -832,6 +868,28 @@ public class A2Factory {
 
        /** Create a JAR file from a directory. */
        protected Path createJar(Path bundleDir) throws IOException {
+               // Remove from source the resources already in the jar file
+//             Path srcDir = bundleDir.resolve("OSGI-OPT/src");
+//             Files.walkFileTree(srcDir, new SimpleFileVisitor<Path>() {
+//
+//                     @Override
+//                     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+//                             // always keep .java file
+//                             if (file.getFileName().toString().endsWith(".java"))
+//                                     return super.visitFile(file, attrs);
+//
+//                             Path relPath = srcDir.relativize(file);
+//                             Path bundlePath = bundleDir.resolve(relPath);
+//                             if (Files.exists(bundlePath)) {
+//                                     Files.delete(file);
+//                                     logger.log(DEBUG, () -> "Removed " + file + " from sources.");
+//                             }
+//                             return super.visitFile(file, attrs);
+//                     }
+//
+//             });
+
+               // Create the jar
                Path jarPath = bundleDir.getParent().resolve(bundleDir.getFileName() + ".jar");
                Path manifestPath = bundleDir.resolve("META-INF/MANIFEST.MF");
                Manifest manifest;
@@ -839,6 +897,7 @@ public class A2Factory {
                        manifest = new Manifest(in);
                }
                try (JarOutputStream jarOut = new JarOutputStream(Files.newOutputStream(jarPath), manifest)) {
+                       jarOut.setLevel(Deflater.DEFAULT_COMPRESSION);
                        Files.walkFileTree(bundleDir, new SimpleFileVisitor<Path>() {
 
                                @Override
@@ -867,21 +926,13 @@ public class A2Factory {
 //             factory.processSingleM2ArtifactDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache").resolve("org.apache.xml.resolver.bnd"));
 //             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache/apache-sshd"));
 //             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty"));
-//             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty-websocket"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.osgi"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp"));
-//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
-//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats"));
+               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.sdk"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats"));
-               factory.processEclipseArchive(
-                               descriptorsBase.resolve("org.argeo.tp.eclipse.equinox").resolve("eclipse-equinox"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rwt").resolve("eclipse-rwt"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rap").resolve("eclipse-rap"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-swt"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-nebula"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-equinox"));
-               factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp").resolve("eclipse-rcp"));
-               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.gis"));
                System.exit(0);
 
                // Eclipse
@@ -894,7 +945,6 @@ public class A2Factory {
                factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-equinox"));
                factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp").resolve("eclipse-rcp"));
                factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp"));
-               System.exit(0);
 
                // Maven
                factory.processCategory(descriptorsBase.resolve("org.argeo.tp.sdk"));