Introduce runtime manager
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / a2 / FsA2Source.java
index d4aa863869aa682f3aec5c92e80e8212d8042f2c..acc553d7d14b233adb9dacce510d2859840cc1a3 100644 (file)
@@ -7,8 +7,10 @@ import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
+import java.util.StringJoiner;
 import java.util.TreeMap;
 
 import org.argeo.init.osgi.OsgiBootUtils;
@@ -17,16 +19,18 @@ import org.osgi.framework.Version;
 /** A file system {@link AbstractProvisioningSource} in A2 format. */
 public class FsA2Source extends AbstractProvisioningSource implements A2Source {
        private final Path base;
-       private final Map<String, String> xOr;
+       private final Map<String, String> variantsXOr;
 
-//     public FsA2Source(Path base) {
-//             this(base, new HashMap<>());
-//     }
+       private final List<String> includes;
+       private final List<String> excludes;
 
-       public FsA2Source(Path base, Map<String, String> xOr, boolean useReference) {
-               super(useReference);
+       public FsA2Source(Path base, Map<String, String> variantsXOr, boolean usingReference, List<String> includes,
+                       List<String> excludes) {
+               super(usingReference);
                this.base = base;
-               this.xOr = new HashMap<>(xOr);
+               this.variantsXOr = new HashMap<>(variantsXOr);
+               this.includes = includes;
+               this.excludes = excludes;
        }
 
        void load() throws IOException {
@@ -44,7 +48,7 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source {
                                } else {// variants
                                        Path variantPath = null;
                                        // is it an explicit variant?
-                                       String variant = xOr.get(contributionPath.getFileName().toString());
+                                       String variant = variantsXOr.get(contributionPath.getFileName().toString());
                                        if (variant != null) {
                                                variantPath = contributionPath.resolve(variant);
                                        }
@@ -62,26 +66,34 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source {
 
                                        // a variant was found, let's collect its contributions (also common ones in its
                                        // parent)
-                                       for (Path variantContributionPath : Files.newDirectoryStream(variantPath.getParent())) {
-                                               String variantContributionId = variantContributionPath.getFileName().toString();
-                                               if (variantContributionId.contains(".")) {
-                                                       A2Contribution contribution = getOrAddContribution(variantContributionId);
-                                                       contributions.put(variantContributionPath, contribution);
+                                       if (Files.exists(variantPath.getParent())) {
+                                               for (Path variantContributionPath : Files.newDirectoryStream(variantPath.getParent())) {
+                                                       String variantContributionId = variantContributionPath.getFileName().toString();
+                                                       if (variantContributionId.contains(".")) {
+                                                               A2Contribution contribution = getOrAddContribution(variantContributionId);
+                                                               contributions.put(variantContributionPath, contribution);
+                                                       }
                                                }
                                        }
-                                       for (Path variantContributionPath : Files.newDirectoryStream(variantPath)) {
-                                               String variantContributionId = variantContributionPath.getFileName().toString();
-                                               if (variantContributionId.contains(".")) {
-                                                       A2Contribution contribution = getOrAddContribution(variantContributionId);
-                                                       contributions.put(variantContributionPath, contribution);
+                                       if (Files.exists(variantPath)) {
+                                               for (Path variantContributionPath : Files.newDirectoryStream(variantPath)) {
+                                                       String variantContributionId = variantContributionPath.getFileName().toString();
+                                                       if (variantContributionId.contains(".")) {
+                                                               A2Contribution contribution = getOrAddContribution(variantContributionId);
+                                                               contributions.put(variantContributionPath, contribution);
+                                                       }
                                                }
                                        }
                                }
                        }
                }
 
-               for (Path contributionPath : contributions.keySet()) {
+               contributions: for (Path contributionPath : contributions.keySet()) {
                        String contributionId = contributionPath.getFileName().toString();
+                       if (includes != null && !includes.contains(contributionId))
+                               continue contributions;
+                       if (excludes != null && excludes.contains(contributionId))
+                               continue contributions;
                        A2Contribution contribution = getOrAddContribution(contributionId);
                        DirectoryStream<Path> modulePaths = Files.newDirectoryStream(contributionPath);
                        modules: for (Path modulePath : modulePaths) {
@@ -119,7 +131,16 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source {
                URI baseUri = base.toUri();
                try {
                        if (baseUri.getScheme().equals("file")) {
-                               return new URI(SCHEME_A2, null, base.toString(), null);
+                               String queryPart = "";
+                               if (!getVariantsXOr().isEmpty()) {
+                                       StringJoiner sj = new StringJoiner("&");
+                                       for (String key : getVariantsXOr().keySet()) {
+                                               sj.add(key + "=" + getVariantsXOr().get(key));
+                                       }
+                                       queryPart = sj.toString();
+                               }
+                               return new URI(isUsingReference() ? SCHEME_A2_REFERENCE : SCHEME_A2, null, base.toString(), queryPart,
+                                               null);
                        } else {
                                throw new UnsupportedOperationException("Unsupported scheme " + baseUri.getScheme());
                        }
@@ -128,6 +149,10 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source {
                }
        }
 
+       protected Map<String, String> getVariantsXOr() {
+               return variantsXOr;
+       }
+
 //     public static void main(String[] args) {
 //             if (args.length == 0)
 //                     throw new IllegalArgumentException("Usage: <path to A2 base>");