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;
/** A file system {@link AbstractProvisioningSource} in A2 format. */
public class FsA2Source extends AbstractProvisioningSource implements A2Source {
private final Path base;
+ private Map<String, String> xOr;
public FsA2Source(Path base) {
+ this(base, new HashMap<>());
+ }
+
+ public FsA2Source(Path base, Map<String, String> xOr) {
this.base = base;
+ this.xOr = xOr;
}
void load() throws IOException {
+ SortedMap<Path, A2Contribution> contributions = new TreeMap<>();
+
DirectoryStream<Path> contributionPaths = Files.newDirectoryStream(base);
- SortedSet<A2Contribution> 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<Path> modulePaths = Files.newDirectoryStream(base.resolve(contribution.getId()));
+ for (Path contributionPath : contributions.keySet()) {
+ String contributionId = contributionPath.getFileName().toString();
+ A2Contribution contribution = getOrAddContribution(contributionId);
+ DirectoryStream<Path> modulePaths = Files.newDirectoryStream(contributionPath);
modules: for (Path modulePath : modulePaths) {
if (!Files.isDirectory(modulePath)) {
// OsgiBootUtils.debug("Registering " + modulePath);
// 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 {
}
public static void main(String[] args) {
+ if (args.length == 0)
+ throw new IllegalArgumentException("Usage: <path to A2 base>");
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<String, String> 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) {