X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.init%2Fsrc%2Forg%2Fargeo%2Finit%2Fa2%2FFsA2Source.java;h=5099eed15be9509ec516a44223dc095b07114025;hb=4f53d33d6a65a123ab8f69b8580de1da2e029a0a;hp=eb00659dcb4b7db84d381a1d5f86642a6c8d215f;hpb=9fad2d8a577f017de8365265a4881dabc1e4ed3f;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java b/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java index eb00659dc..5099eed15 100644 --- a/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java +++ b/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java @@ -7,8 +7,10 @@ import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.HashMap; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; import org.argeo.init.osgi.OsgiBootUtils; import org.osgi.framework.Version; @@ -16,26 +18,72 @@ 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 Map xOr; public FsA2Source(Path base) { + this(base, new HashMap<>()); + } + + public FsA2Source(Path base, Map xOr) { this.base = base; + this.xOr = xOr; } void load() throws IOException { + SortedMap contributions = new TreeMap<>(); + DirectoryStream contributionPaths = Files.newDirectoryStream(base); - SortedSet contributions = new TreeSet<>(); contributions: for (Path contributionPath : contributionPaths) { if (Files.isDirectory(contributionPath)) { String contributionId = contributionPath.getFileName().toString(); if (A2Contribution.BOOT.equals(contributionId))// skip boot continue contributions; - A2Contribution contribution = getOrAddContribution(contributionId); - contributions.add(contribution); + if (contributionId.contains(".")) { + A2Contribution contribution = getOrAddContribution(contributionId); + contributions.put(contributionPath, contribution); + } else {// variants + Path variantPath = null; + // is it an explicit variant? + String variant = xOr.get(contributionPath.getFileName().toString()); + if (variant != null) { + variantPath = contributionPath.resolve(variant); + } + + // is there a default variant? + if (variantPath == null) { + Path defaultPath = contributionPath.resolve(A2Contribution.DEFAULT); + if (Files.exists(defaultPath)) { + variantPath = defaultPath; + } + } + + if (variantPath == null) + continue contributions; + + // 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); + } + } + for (Path variantContributionPath : Files.newDirectoryStream(variantPath)) { + String variantContributionId = variantContributionPath.getFileName().toString(); + if (variantContributionId.contains(".")) { + A2Contribution contribution = getOrAddContribution(variantContributionId); + contributions.put(variantContributionPath, contribution); + } + } + } } } - for (A2Contribution contribution : contributions) { - DirectoryStream modulePaths = Files.newDirectoryStream(base.resolve(contribution.getId())); + for (Path contributionPath : contributions.keySet()) { + String contributionId = contributionPath.getFileName().toString(); + A2Contribution contribution = getOrAddContribution(contributionId); + DirectoryStream modulePaths = Files.newDirectoryStream(contributionPath); modules: for (Path modulePath : modulePaths) { if (!Files.isDirectory(modulePath)) { // OsgiBootUtils.debug("Registering " + modulePath); @@ -57,8 +105,9 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { // try { // version = new Version(versionStr); // } catch (Exception e) { - String versionStr = readVersionFromModule(modulePath); - String componentName = readSymbolicNameFromModule(modulePath); + String[] nameVersion = readNameVersionFromModule(modulePath); + String componentName = nameVersion[0]; + String versionStr = nameVersion[1]; if (versionStr != null) { version = new Version(versionStr); } else { @@ -91,9 +140,13 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { } public static void main(String[] args) { + if (args.length == 0) + throw new IllegalArgumentException("Usage: "); try { - FsA2Source context = new FsA2Source(Paths.get( - "/home/mbaudier/dev/git/apache2/argeo-commons/dist/argeo-node/target/argeo-node-2.1.77-SNAPSHOT/share/osgi")); + Map xOr = new HashMap<>(); + xOr.put("osgi", "equinox"); + xOr.put("swt", "rap"); + FsA2Source context = new FsA2Source(Paths.get(args[0]), xOr); context.load(); context.asTree(); } catch (Exception e) {