package org.argeo.osgi.boot.a2;
-import java.io.InputStream;
+import java.io.File;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.osgi.launch.EquinoxFactory;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.framework.launch.Framework;
-import org.osgi.framework.launch.FrameworkFactory;
import org.osgi.framework.wiring.FrameworkWiring;
+/** Loads provisioning sources into an OSGi context. */
public class ProvisioningManager {
BundleContext bc;
OsgiContext osgiContext;
URI u = new URI(uri);
if ("a2".equals(u.getScheme())) {
if (u.getHost() == null || "".equals(u.getHost())) {
- Path base = Paths.get(u.getPath());
+ String baseStr = u.getPath();
+ if (File.separatorChar == '\\') {// MS Windows
+ baseStr = baseStr.substring(1).replace('/', File.separatorChar);
+ }
+ Path base = Paths.get(baseStr);
FsA2Source source = new FsA2Source(base);
source.load();
addSource(source);
Path frameworkPath = Paths.get(frameworkLocationUri);
if (frameworkPath.getParent().getFileName().toString().equals(A2Contribution.BOOT)) {
Path base = frameworkPath.getParent().getParent();
- URI baseUri = new URI("a2", null, null, 0, base.toString(), null, null);
+ String baseStr = base.toString();
+ if (File.separatorChar == '\\')// MS Windows
+ baseStr = '/' + baseStr.replace(File.separatorChar, '/');
+ URI baseUri = new URI("a2", null, null, 0, baseStr, null, null);
registerSource(baseUri.toString());
OsgiBootUtils.info("Registered " + baseUri + " as default source");
return true;
Version moduleVersion = module.getVersion();
A2Branch osgiBranch = osgiContext.findBranch(module.getBranch().getComponent().getId(), moduleVersion);
if (osgiBranch == null) {
- Bundle bundle = bc.installBundle(module.getBranch().getCoordinates(),
- moduleSource.newInputStream(module.getLocator()));
+// Bundle bundle = bc.installBundle(module.getBranch().getCoordinates(),
+// moduleSource.newInputStream(module.getLocator()));
+ Bundle bundle = moduleSource.install(bc, module);
if (OsgiBootUtils.isDebug())
OsgiBootUtils.debug("Installed bundle " + bundle.getLocation() + " with version " + moduleVersion);
return bundle;
int compare = moduleVersion.compareTo(lastOsgiModule.getVersion());
if (compare > 0) {// update
Bundle bundle = (Bundle) lastOsgiModule.getLocator();
- bundle.update(moduleSource.newInputStream(module.getLocator()));
+// bundle.update(moduleSource.newInputStream(module.getLocator()));
+ moduleSource.update(bundle, module);
OsgiBootUtils.info("Updated bundle " + bundle.getLocation() + " to version " + moduleVersion);
return bundle;
}
}
} catch (Exception e) {
- OsgiBootUtils.error("Could not install module " + module, e);
+ OsgiBootUtils.error("Could not install module " + module + ": " + e.getMessage(), e);
}
return null;
}
Version moduleVersion = module.getVersion();
int compare = moduleVersion.compareTo(version);
if (compare > 0) {// update
- try (InputStream in = source.newInputStream(module.getLocator())) {
- bundle.update(in);
+ try {
+ source.update(bundle, module);
+// bundle.update(in);
String fragmentHost = bundle.getHeaders().get(Constants.FRAGMENT_HOST);
if (fragmentHost != null)
fragmentsUpdated = true;
return updatedBundles;
}
- private static Framework launch() {
- // start OSGi
- FrameworkFactory frameworkFactory = new EquinoxFactory();
+ public static void main(String[] args) {
Map<String, String> configuration = new HashMap<>();
configuration.put("osgi.console", "2323");
- Framework framework = frameworkFactory.newFramework(configuration);
- try {
- framework.start();
- } catch (BundleException e) {
- throw new OsgiBootException("Cannot start OSGi framework", e);
- }
- return framework;
- }
-
- public static void main(String[] args) {
- Framework framework = launch();
+ Framework framework = OsgiBootUtils.launch(new EquinoxFactory(), configuration);
try {
ProvisioningManager pm = new ProvisioningManager(framework.getBundleContext());
FsA2Source context = new FsA2Source(Paths.get(