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
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
}
if (!fileProps.containsKey(EXPORT_PACKAGE.toString())) {
- fileProps.put(EXPORT_PACKAGE.toString(), "*");
+ fileProps.put(EXPORT_PACKAGE.toString(),
+ "*;version=\"" + fileProps.getProperty(BUNDLE_VERSION.toString()) + "\"");
}
// BND analysis
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);
}
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());
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("_");
+ String v = arr_[1].substring(0, arr_[1].length() - 4);// remove .jar
+ nameVersion = new NameVersion(arr_[0], 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);
}
}
- // 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) {
// 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.");
+ 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");