public abstract class AbstractProvisioningSource implements ProvisioningSource {
protected final Map<String, A2Contribution> contributions = Collections.synchronizedSortedMap(new TreeMap<>());
+ private final boolean usingReference;
+
+ public AbstractProvisioningSource(boolean usingReference) {
+ this.usingReference = usingReference;
+ }
+
public Iterable<A2Contribution> listContributions(Object filter) {
return contributions.values();
}
@Override
public Bundle install(BundleContext bc, A2Module module) {
try {
- Path tempJar = null;
- if (module.getLocator() instanceof Path && Files.isDirectory((Path) module.getLocator()))
- tempJar = toTempJar((Path) module.getLocator());
- Bundle bundle;
- try (InputStream in = newInputStream(tempJar != null ? tempJar : module.getLocator())) {
- bundle = bc.installBundle(module.getBranch().getCoordinates(), in);
+ Object locator = module.getLocator();
+ if (usingReference && locator instanceof Path locatorPath) {
+ String referenceUrl = "reference:file:" + locatorPath.toString();
+ Bundle bundle = bc.installBundle(referenceUrl);
+ return bundle;
+ } else {
+ Path locatorPath = (Path) locator;
+ Path pathToUse;
+ if (locator instanceof Path && Files.isDirectory(locatorPath))
+ pathToUse = toTempJar(locatorPath);
+ else
+ pathToUse = locatorPath;
+ Bundle bundle;
+ try (InputStream in = newInputStream(pathToUse)) {
+ bundle = bc.installBundle(locatorPath.toAbsolutePath().toString(), in);
+ }
+
+ if (pathToUse != null)
+ Files.deleteIfExists(pathToUse);
+ return bundle;
}
- if (tempJar != null)
- Files.deleteIfExists(tempJar);
- return bundle;
} catch (BundleException | IOException e) {
throw new A2Exception("Cannot install module " + module, e);
}
@Override
public void update(Bundle bundle, A2Module module) {
try {
- Path tempJar = null;
- if (module.getLocator() instanceof Path && Files.isDirectory((Path) module.getLocator()))
- tempJar = toTempJar((Path) module.getLocator());
- try (InputStream in = newInputStream(tempJar != null ? tempJar : module.getLocator())) {
- bundle.update(in);
+ Object locator = module.getLocator();
+ if (usingReference && locator instanceof Path) {
+ try (InputStream in = newInputStream(locator)) {
+ bundle.update(in);
+ }
+ } else {
+ Path tempJar = null;
+ if (locator instanceof Path && Files.isDirectory((Path) locator))
+ tempJar = toTempJar((Path) locator);
+ try (InputStream in = newInputStream(tempJar != null ? tempJar : locator)) {
+ bundle.update(in);
+ }
+ if (tempJar != null)
+ Files.deleteIfExists(tempJar);
}
- if (tempJar != null)
- Files.deleteIfExists(tempJar);
} catch (BundleException | IOException e) {
throw new A2Exception("Cannot update module " + module, e);
}
return symbolicName;
}
+ protected boolean isUsingReference() {
+ return usingReference;
+ }
+
+ private InputStream newInputStream(Object locator) throws IOException {
+ if (locator instanceof Path) {
+ return Files.newInputStream((Path) locator);
+ } else if (locator instanceof URL) {
+ return ((URL) locator).openStream();
+ } else {
+ throw new IllegalArgumentException("Unsupported module locator type " + locator.getClass());
+ }
+ }
+
private static Manifest findManifest(Path currentPath) {
Path metaInfPath = currentPath.resolve("META-INF");
if (Files.exists(metaInfPath) && Files.isDirectory(metaInfPath)) {
}
- private InputStream newInputStream(Object locator) throws IOException {
- if (locator instanceof Path) {
- return Files.newInputStream((Path) locator);
- } else if (locator instanceof URL) {
- return ((URL) locator).openStream();
- } else {
- throw new IllegalArgumentException("Unsupported module locator type " + locator.getClass());
- }
- }
}