Synchronise all repackage downloads.
[cc0/argeo-build.git] / src / org / argeo / build / Repackage.java
index d33a55eea1f6aa35aedc9e8e7e1ceee583e5e89d..9827b06622295d6bd97673b4c34a32834df01ab7 100644 (file)
@@ -119,6 +119,8 @@ public class Repackage {
        /** 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))) {
@@ -705,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
@@ -931,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);
                                                        }
@@ -1014,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());
@@ -1036,6 +1045,8 @@ public class Repackage {
                                nameVersion = new NameVersion(ourSymbolicName, ourVersion);
                        } else {
                                nameVersion = nameVersionFromManifest(manifest);
+                               if (nameVersion == null)
+                                       throw new IllegalStateException("Could not compute name/version from Manifest");
                                if (ourVersion != null && !nameVersion.getVersion().equals(ourVersion)) {
                                        logger.log(WARNING,
                                                        "Original version is " + nameVersion.getVersion() + " while new version is " + ourVersion);
@@ -1332,15 +1343,17 @@ public class Repackage {
        }
 
        /**
-        * Effectively download. Synchronised in order to avoid downloading twice in
-        * parallel.
+        * Effectively download an archive.
         */
-       synchronized Path downloadArchive(URL url, Path dir) throws IOException {
+       Path downloadArchive(URL url, Path dir) throws IOException {
                return download(url, dir, (String) null);
        }
 
-       /** Effectively download. */
-       Path download(URL url, Path dir, String name) throws IOException {
+       /**
+        * Effectively download. Synchronised in order to avoid downloading twice in
+        * parallel.
+        */
+       synchronized Path download(URL url, Path dir, String name) throws IOException {
 
                Path dest;
                if (name == null) {