]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Repackage.java
Do not modify only when releasing
[cc0/argeo-build.git] / src / org / argeo / build / Repackage.java
index 22c6ce135e2996e98a7140a7d5a8ddc425c7eb13..d67a6759ee0f812e7d3551b62c8573a7ea911ca7 100644 (file)
@@ -40,6 +40,7 @@ import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
 import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
 import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
@@ -122,22 +123,22 @@ public class Repackage {
        final static String A2_ORIGIN = "A2-ORIGIN";
 
        /** Directory where to download archives */
-       Path originBase;
+       final Path originBase;
        /** Directory where to download Maven artifacts */
-       Path mavenBase;
+       final Path mavenBase;
 
        /** A2 repository base for binary bundles */
-       Path a2Base;
+       final Path a2Base;
        /** A2 repository base for source bundles */
-       Path a2SrcBase;
+       final Path a2SrcBase;
        /** A2 base for native components */
-       Path a2LibBase;
+       final Path a2LibBase;
        /** Location of the descriptors driving the packaging */
-       Path descriptorsBase;
+       final Path descriptorsBase;
        /** URIs of archives to download */
-       Properties uris = new Properties();
+       final Properties uris = new Properties();
        /** Mirrors for archive download. Key is URI prefix, value list of base URLs */
-       Map<String, List<String>> mirrors = new HashMap<String, List<String>>();
+       final Map<String, List<String>> mirrors = new HashMap<String, List<String>>();
 
        /** Whether sources should be packaged separately */
        final boolean sourceBundles;
@@ -244,6 +245,22 @@ public class Repackage {
                        URL url = M2ConventionsUtils.mavenRepoUrl(repoStr, artifact);
                        Path downloaded = downloadMaven(url, artifact);
 
+                       // some proprietary artifacts do not allow any modification
+                       // when releasing (with separate sources) we just copy it
+                       boolean doNotModify = Boolean.parseBoolean(
+                                       fileProps.getOrDefault(ManifestConstants.ARGEO_DO_NOT_MODIFY.toString(), "false").toString());
+                       if (doNotModify && sourceBundles) {
+                               Path unmodifiedTarget = targetCategoryBase.resolve(
+                                               fileProps.getProperty(BUNDLE_SYMBOLICNAME.toString()) + "." + artifact.getBranch() + ".jar");
+                               Files.copy(downloaded, unmodifiedTarget, StandardCopyOption.REPLACE_EXISTING);
+                               downloadAndProcessM2Sources(repoStr, artifact,
+                                               targetCategoryBase.resolve(
+                                                               fileProps.getProperty(BUNDLE_SYMBOLICNAME.toString()) + "." + artifact.getBranch()),
+                                               false);
+                               return;
+                       }
+                       
+                       // normal processing
                        A2Origin origin = new A2Origin();
                        Path targetBundleDir = processBndJar(downloaded, targetCategoryBase, fileProps, artifact, origin);
 
@@ -405,10 +422,6 @@ public class Repackage {
                                                origin.deleted.add("additional Java versions (META-INF/versions) from " + artifact);
                                                continue entries;
                                        }
-                                       if (entry.getName().equals("META-INF/DEPENDENCIES")) {
-                                               origin.deleted.add("dependency list (META-INF/DEPENDENCIES) from " + artifact);
-                                               continue entries;
-                                       }
                                        if (entry.getName().startsWith("META-INF/maven/")) {
                                                origin.deleted.add("Maven information (META-INF/maven) from " + artifact);
                                                continue entries;
@@ -417,6 +430,21 @@ public class Repackage {
                                                origin.deleted.add("cache directory (.cache) from " + artifact);
                                                continue entries;
                                        }
+                                       if (entry.getName().equals("META-INF/DEPENDENCIES")) {
+                                               origin.deleted.add("Dependencies (META-INF/DEPENDENCIES) from " + artifact);
+                                               continue entries;
+                                       }
+                                       if (entry.getName().equals("META-INF/MANIFEST.MF")) {
+                                               Path originalManifest = bundleDir.resolve(A2_ORIGIN).resolve(artifact.getGroupId())
+                                                               .resolve(artifact.getArtifactId()).resolve("MANIFEST.MF");
+                                               Files.createDirectories(originalManifest.getParent());
+                                               try (OutputStream out = Files.newOutputStream(originalManifest)) {
+                                                       Files.copy(jarIn, originalManifest);
+                                               }
+                                               origin.added.add(
+                                                               "original MANIFEST (" + bundleDir.relativize(originalManifest) + ") from " + artifact);
+                                               continue entries;
+                                       }
 
                                        if (entry.getName().endsWith("NOTICE") || entry.getName().endsWith("NOTICE.txt")
                                                        || entry.getName().endsWith("LICENSE") || entry.getName().endsWith("LICENSE.md")
@@ -515,14 +543,13 @@ public class Repackage {
        /** Generate MANIFEST using BND. */
        Path processBndJar(Path downloaded, Path targetCategoryBase, Properties fileProps, M2Artifact artifact,
                        A2Origin origin) {
-
                try {
                        Map<String, String> additionalEntries = new TreeMap<>();
-                       boolean doNotModify = Boolean.parseBoolean(
+                       boolean doNotModifyManifest = Boolean.parseBoolean(
                                        fileProps.getOrDefault(ARGEO_ORIGIN_MANIFEST_NOT_MODIFIED.toString(), "false").toString());
 
                        // Note: we always force the symbolic name
-                       if (doNotModify) {
+                       if (doNotModifyManifest) {
                                fileEntries: for (Object key : fileProps.keySet()) {
                                        if (ARGEO_ORIGIN_M2.toString().equals(key))
                                                continue fileEntries;
@@ -843,10 +870,11 @@ public class Repackage {
                        }
                        bundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch());
 
-                       if (sourceManifest != null) {
+                       if (sourceManifest != null) {// copy original MANIFEST
                                Path originalManifest = bundleDir.resolve(A2_ORIGIN).resolve("MANIFEST.MF");
+                               Files.createDirectories(originalManifest.getParent());
                                try (OutputStream out = Files.newOutputStream(originalManifest)) {
-                                       sourceManifest.write(null);
+                                       sourceManifest.write(out);
                                }
                                origin.added.add("original MANIFEST (" + bundleDir.relativize(originalManifest) + ")");
                        }
@@ -1250,6 +1278,11 @@ public class Repackage {
                 * proprietary licenses, such as JCR Day License).
                 */
                ARGEO_ORIGIN_EMBED("Argeo-Origin-Embed"), //
+               /**
+                * Do not modify original jar (may be required by some proprietary licenses,
+                * such as JCR Day License).
+                */
+               ARGEO_DO_NOT_MODIFY("Argeo-Origin-Do-Not-Modify"), //
                /**
                 * Origin (non-Maven) URI of the component. It may be anything (jar, archive,
                 * etc.).