X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=src%2Forg%2Fargeo%2Fbuild%2FRepackage.java;h=7513dc5928f0ad946ff4f80a6f7ae08fa2ae58d5;hb=af5b640e4fa16c3d5ed59a1fd3b1ffcdc37bf4fb;hp=4f63c656298452cf72a27ddfc34229b19e7f3138;hpb=642b596b52a99d492cc818589c6d63cf713a33bf;p=cc0%2Fargeo-build.git diff --git a/src/org/argeo/build/Repackage.java b/src/org/argeo/build/Repackage.java index 4f63c65..7513dc5 100644 --- a/src/org/argeo/build/Repackage.java +++ b/src/org/argeo/build/Repackage.java @@ -1,6 +1,7 @@ package org.argeo.build; import static java.lang.System.Logger.Level.DEBUG; +import static java.lang.System.Logger.Level.WARNING; import static org.argeo.build.Repackage.ManifestConstants.BUNDLE_SYMBOLICNAME; import static org.argeo.build.Repackage.ManifestConstants.BUNDLE_VERSION; import static org.argeo.build.Repackage.ManifestConstants.EXPORT_PACKAGE; @@ -53,6 +54,8 @@ public class Repackage { private final static String ENV_BUILD_SOURCE_BUNDLES = "BUILD_SOURCE_BUNDLES"; + private final static boolean parallel = true; + /** Main entry point. */ public static void main(String[] args) { if (args.length < 2) { @@ -66,7 +69,10 @@ public class Repackage { List> toDos = new ArrayList<>(); for (int i = 1; i < args.length; i++) { Path p = Paths.get(args[i]); - toDos.add(CompletableFuture.runAsync(() -> factory.processCategory(p))); + if (parallel) + toDos.add(CompletableFuture.runAsync(() -> factory.processCategory(p))); + else + factory.processCategory(p); } CompletableFuture.allOf(toDos.toArray(new CompletableFuture[toDos.size()])).join(); } @@ -510,8 +516,8 @@ public class Repackage { /** Download and integrates sources for a single Maven artifact. */ protected void downloadAndProcessM2Sources(String repoStr, M2Artifact artifact, Path targetBundleDir) throws IOException { - if (sourceBundles) - return; +// if (sourceBundles) +// return; try { M2Artifact sourcesArtifact = new M2Artifact(artifact.toM2Coordinates(), "sources"); URL sourcesUrl = M2ConventionsUtils.mavenRepoUrl(repoStr, sourcesArtifact); @@ -527,7 +533,9 @@ public class Repackage { /** Integrate sources from a downloaded jar file. */ protected void processM2SourceJar(Path file, Path targetBundleDir) throws IOException { try (JarInputStream jarIn = new JarInputStream(Files.newInputStream(file), false)) { - Path targetSourceDir = targetBundleDir.resolve("OSGI-OPT/src"); + Path targetSourceDir = sourceBundles + ? targetBundleDir.getParent().resolve(targetBundleDir.toString() + ".src") + : targetBundleDir.resolve("OSGI-OPT/src"); // TODO make it less dangerous? if (Files.exists(targetSourceDir)) { @@ -641,10 +649,10 @@ public class Repackage { } } if (file.getFileName().toString().contains(".source_")) { - if (!sourceBundles) { - processEclipseSourceJar(file, targetCategoryBase); - logger.log(Level.DEBUG, () -> "Processed source " + file); - } +// if (!sourceBundles) { + processEclipseSourceJar(file, targetCategoryBase); + logger.log(Level.DEBUG, () -> "Processed source " + file); +// } } else { Map map = new HashMap<>(); @@ -660,8 +668,8 @@ public class Repackage { } }); - DirectoryStream dirs = Files.newDirectoryStream(targetCategoryBase, - (p) -> Files.isDirectory(p) && p.getFileName().toString().indexOf('.') >= 0); + DirectoryStream dirs = Files.newDirectoryStream(targetCategoryBase, (p) -> Files.isDirectory(p) + && p.getFileName().toString().indexOf('.') >= 0 && !p.getFileName().toString().endsWith(".src")); for (Path dir : dirs) { createJar(dir); } @@ -684,7 +692,9 @@ public class Repackage { NameVersion nameVersion = new NameVersion(relatedBundle[0], version); targetBundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch()); - Path targetSourceDir = targetBundleDir.resolve("OSGI-OPT/src"); + Path targetSourceDir = sourceBundles + ? targetBundleDir.getParent().resolve(targetBundleDir.toString() + ".src") + : targetBundleDir.resolve("OSGI-OPT/src"); // TODO make it less dangerous? if (Files.exists(targetSourceDir)) { @@ -996,6 +1006,50 @@ public class Repackage { }); } deleteDirectory(bundleDir); + + if (sourceBundles) { + Path bundleCategoryDir = bundleDir.getParent(); + Path sourceDir = bundleCategoryDir.resolve(bundleDir.toString() + ".src"); + if (!Files.exists(sourceDir)) { + logger.log(WARNING, sourceDir + " does not exist, skipping..."); + return jarPath; + + } + Path guessedA2Base = bundleCategoryDir.getParent(); + Path srcA2Base = guessedA2Base.getParent().resolve(guessedA2Base.getFileName() + ".src"); + Path srcJarP = srcA2Base.resolve(bundleCategoryDir.getFileName()).resolve(sourceDir.getFileName() + ".jar"); + + String bundleSymbolicName = manifest.getMainAttributes().getValue("Bundle-SymbolicName").toString(); + // in case there are additional directives + bundleSymbolicName = bundleSymbolicName.split(";")[0]; + Manifest srcManifest = new Manifest(); + srcManifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); + srcManifest.getMainAttributes().putValue("Bundle-SymbolicName", bundleSymbolicName + ".src"); + srcManifest.getMainAttributes().putValue("Bundle-Version", + manifest.getMainAttributes().getValue("Bundle-Version").toString()); + srcManifest.getMainAttributes().putValue("Eclipse-SourceBundle", + bundleSymbolicName + ";version=\"" + manifest.getMainAttributes().getValue("Bundle-Version")); + + try (JarOutputStream srcJarOut = new JarOutputStream(Files.newOutputStream(srcJarP), srcManifest)) { + srcJarOut.setLevel(Deflater.BEST_COMPRESSION); + Files.walkFileTree(sourceDir, new SimpleFileVisitor() { + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (file.getFileName().toString().equals("MANIFEST.MF")) + return super.visitFile(file, attrs); + JarEntry entry = new JarEntry( + sourceDir.relativize(file).toString().replace(File.separatorChar, '/')); + srcJarOut.putNextEntry(entry); + Files.copy(file, srcJarOut); + return super.visitFile(file, attrs); + } + + }); + } + deleteDirectory(sourceDir); + } + return jarPath; }