Workaround for badly formatted jar
[cc0/argeo-build.git] / src / org / argeo / build / Repackage.java
index c3fbcaf8850278db4fb2e67e1b2e100cf76770c5..4dc604232b6ada170fe3bd045b41e855ee67b7b5 100644 (file)
@@ -98,13 +98,14 @@ public class Repackage {
 
                List<CompletableFuture<Void>> toDos = new ArrayList<>();
                for (int i = 1; i < args.length; i++) {
-                       Path p = Paths.get(args[i]);
-                       if (sequential)
-                               factory.processCategory(p);
+                       Path categoryPath = Paths.get(args[i]);
+                       factory.cleanPreviousFailedBuild(categoryPath);
+                       if (sequential) // sequential processing happens here
+                               factory.processCategory(categoryPath);
                        else
-                               toDos.add(CompletableFuture.runAsync(() -> factory.processCategory(p)));
+                               toDos.add(CompletableFuture.runAsync(() -> factory.processCategory(categoryPath)));
                }
-               if (!sequential)
+               if (!sequential)// parallel processing
                        CompletableFuture.allOf(toDos.toArray(new CompletableFuture[toDos.size()])).join();
 
                // Summary
@@ -115,6 +116,25 @@ public class Repackage {
                logger.log(INFO, "# License summary:\n" + sb);
        }
 
+       /** Deletes remaining sub directories. */
+       void cleanPreviousFailedBuild(Path categoryPath) {
+               Path outputCategoryPath = a2Base.resolve(categoryPath);
+               if (!Files.exists(outputCategoryPath))
+                       return;
+               // clean previous failed build
+               try {
+                       for (Path subDir : Files.newDirectoryStream(outputCategoryPath, (d) -> Files.isDirectory(d))) {
+                               if (Files.exists(subDir)) {
+                                       logger.log(WARNING, "Bundle dir " + subDir
+                                                       + " already exists, probably from a previous failed build, deleting it...");
+                                       deleteDirectory(subDir);
+                               }
+                       }
+               } catch (IOException e) {
+                       logger.log(ERROR, "Cannot clean previous build", e);
+               }
+       }
+
        /** MANIFEST headers. */
        enum ManifestHeader {
                // OSGi
@@ -687,7 +707,8 @@ public class Repackage {
                                }
 
                                if (!fileProps.containsKey(EXPORT_PACKAGE.toString())) {
-                                       fileProps.put(EXPORT_PACKAGE.toString(), "*");
+                                       fileProps.put(EXPORT_PACKAGE.toString(),
+                                                       "*;version=\"" + fileProps.getProperty(BUNDLE_VERSION.toString()) + "\"");
                                }
 
                                // BND analysis
@@ -913,6 +934,10 @@ public class Repackage {
                                                                        map.put(key.toString(), commonProps.getProperty(key.toString()));
                                                                A2Origin origin = new A2Origin();
                                                                Path bundleDir = processBundleJar(file, targetCategoryBase, map, origin);
+                                                               if (bundleDir == null) {
+                                                                       logger.log(WARNING, "No bundle dir created for " + file + ", skipping...");
+                                                                       return FileVisitResult.CONTINUE;
+                                                               }
                                                                origins.put(bundleDir, origin);
                                                                logger.log(DEBUG, () -> "Processed " + file);
                                                        }
@@ -996,6 +1021,8 @@ public class Repackage {
                Manifest sourceManifest;
                try (JarInputStream jarIn = new JarInputStream(Files.newInputStream(file), false)) {
                        sourceManifest = jarIn.getManifest();
+                       if (sourceManifest == null)
+                               logger.log(WARNING, file + " has no manifest");
                        manifest = sourceManifest != null ? new Manifest(sourceManifest) : new Manifest();
 
                        String rawSourceSymbolicName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME.toString());
@@ -1018,6 +1045,16 @@ public class Repackage {
                                nameVersion = new NameVersion(ourSymbolicName, ourVersion);
                        } else {
                                nameVersion = nameVersionFromManifest(manifest);
+                               if (nameVersion == null) {
+                                       // hack for weird issue with JNA jar in Eclipse
+                                       String[] arr_ = file.getFileName().toString().split("_");
+                                       ourSymbolicName = arr_[0];
+                                       String v = arr_[1].substring(0, arr_[1].length() - 4);// remove .jar
+                                       entries.put(BUNDLE_VERSION.toString(), v);
+                                       nameVersion = new NameVersion(ourSymbolicName, v);
+                                       logger.log(WARNING, file + " has no symbolic name, trying " + nameVersion.getName() + "/"
+                                                       + nameVersion.getVersion() + " based on its name");
+                               }
                                if (ourVersion != null && !nameVersion.getVersion().equals(ourVersion)) {
                                        logger.log(WARNING,
                                                        "Original version is " + nameVersion.getVersion() + " while new version is " + ourVersion);
@@ -1029,13 +1066,7 @@ public class Repackage {
                                }
                        }
 
-                       // create bundle dir
                        bundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch());
-                       if (Files.exists(bundleDir)) {
-                               logger.log(WARNING, "Bundle dir " + bundleDir
-                                               + " already exists, probably from a previous failed build, deleting it...");
-                               deleteDirectory(bundleDir);
-                       }
 
                        // copy original MANIFEST
                        if (sourceManifest != null) {
@@ -1456,8 +1487,14 @@ public class Repackage {
 
                        // license
                        String spdxLicenseId = SPDX_LICENSE_IDENTIFIER.get(mapping);
-                       if (spdxLicenseId == null)
-                               throw new IllegalStateException("An SPDX license id must have beend defined at this stage.");
+                       if (spdxLicenseId == null) {
+                               if (jarDir.getFileName().toString().startsWith("com.sun.jna")) // FIXME understand/report why JNA's
+                                                                                                                                                               // jar is corrupted
+                                       spdxLicenseId = "LGPL-2.1-or-later OR Apache-2.0";
+                               else
+                                       throw new IllegalStateException(
+                                                       "An SPDX license id must have beend defined for " + jarDir + " at this stage.");
+                       }
                        writer.append("\nIt is redistributed under the following license:\n\n");
                        writer.append("SPDX-Identifier: " + spdxLicenseId + "\n\n");