X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.osgi.boot%2Fsrc%2Forg%2Fargeo%2Fosgi%2Fboot%2FOsgiBoot.java;h=38da0479f6d5579742f9d00c655c35fd2c254416;hb=79e0a2a5d751c7c077e52f9ee54469656dc96a44;hp=f8bee95deea112bce179c26fecfb71a07196e389;hpb=622519b67d2ee3e22d6b402ce08c44dd9c563142;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.osgi.boot/src/org/argeo/osgi/boot/OsgiBoot.java b/org.argeo.osgi.boot/src/org/argeo/osgi/boot/OsgiBoot.java index f8bee95de..38da0479f 100644 --- a/org.argeo.osgi.boot/src/org/argeo/osgi/boot/OsgiBoot.java +++ b/org.argeo.osgi.boot/src/org/argeo/osgi/boot/OsgiBoot.java @@ -19,6 +19,8 @@ import static org.argeo.osgi.boot.OsgiBootUtils.debug; import static org.argeo.osgi.boot.OsgiBootUtils.warn; import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -30,6 +32,8 @@ import java.util.SortedMap; import java.util.StringTokenizer; import java.util.TreeMap; +import org.argeo.osgi.a2.A2Source; +import org.argeo.osgi.a2.ProvisioningManager; import org.argeo.osgi.boot.internal.springutil.AntPathMatcher; import org.argeo.osgi.boot.internal.springutil.PathMatcher; import org.argeo.osgi.boot.internal.springutil.SystemPropertyUtils; @@ -49,6 +53,8 @@ import org.osgi.framework.wiring.FrameworkWiring; */ public class OsgiBoot implements OsgiBootConstants { public final static String PROP_ARGEO_OSGI_START = "argeo.osgi.start"; + public final static String PROP_ARGEO_OSGI_SOURCES = "argeo.osgi.sources"; + public final static String PROP_ARGEO_OSGI_BUNDLES = "argeo.osgi.bundles"; public final static String PROP_ARGEO_OSGI_BASE_URL = "argeo.osgi.baseUrl"; public final static String PROP_ARGEO_OSGI_LOCAL_CACHE = "argeo.osgi.localCache"; @@ -67,9 +73,10 @@ public class OsgiBoot implements OsgiBootConstants { // public final static String EXCLUDES_SVN_PATTERN = "**/.svn/**"; // OSGi system properties - public final static String PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL = "osgi.bundles.defaultStartLevel"; - public final static String PROP_OSGI_STARTLEVEL = "osgi.startLevel"; - public final static String INSTANCE_AREA_PROP = "osgi.instance.area"; + final static String PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL = "osgi.bundles.defaultStartLevel"; + final static String PROP_OSGI_STARTLEVEL = "osgi.startLevel"; + final static String INSTANCE_AREA_PROP = "osgi.instance.area"; + final static String CONFIGURATION_AREA_PROP = "osgi.configuration.area"; // Symbolic names public final static String SYMBOLIC_NAME_OSGI_BOOT = "org.argeo.osgi.boot"; @@ -88,14 +95,38 @@ public class OsgiBoot implements OsgiBootConstants { private final BundleContext bundleContext; private final String localCache; + private final ProvisioningManager provisioningManager; + /* * INITIALIZATION */ /** Constructor */ public OsgiBoot(BundleContext bundleContext) { this.bundleContext = bundleContext; - localCache = getProperty(PROP_ARGEO_OSGI_LOCAL_CACHE, - "file://" + System.getProperty("user.home") + "/.m2/repository/"); + Path homePath = Paths.get(System.getProperty("user.home")).toAbsolutePath(); + String homeUri = homePath.toUri().toString(); + localCache = getProperty(PROP_ARGEO_OSGI_LOCAL_CACHE, homeUri + ".m2/repository/"); + + provisioningManager = new ProvisioningManager(bundleContext); + String sources = getProperty(PROP_ARGEO_OSGI_SOURCES); + if (sources == null) { + provisioningManager.registerDefaultSource(); + } else { + for (String source : sources.split(",")) { + if (source.trim().equals(A2Source.DEFAULT_A2_URI)) { + provisioningManager + .registerSource(A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/osgi"); + provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/share/osgi"); + provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/share/osgi"); + } else { + provisioningManager.registerSource(source); + } + } + } + } + + ProvisioningManager getProvisioningManager() { + return provisioningManager; } /* @@ -111,6 +142,7 @@ public class OsgiBoot implements OsgiBootConstants { .info("OSGi bootstrap starting" + (osgiInstancePath != null ? " (" + osgiInstancePath + ")" : "")); installUrls(getBundlesUrls()); installUrls(getDistributionUrls()); + provisioningManager.install(null); startBundles(); long duration = System.currentTimeMillis() - begin; OsgiBootUtils.info("OSGi bootstrap completed in " + Math.round(((double) duration) / 1000) + "s (" @@ -141,6 +173,10 @@ public class OsgiBoot implements OsgiBootConstants { System.out.println(); } + public void update() { + provisioningManager.update(); + } + /* * INSTALLATION */ @@ -214,16 +250,21 @@ public class OsgiBoot implements OsgiBootConstants { } } } catch (BundleException e) { + final String ALREADY_INSTALLED = "is already installed"; String message = e.getMessage(); if ((message.contains("Bundle \"" + SYMBOLIC_NAME_OSGI_BOOT + "\"") || message.contains("Bundle \"" + SYMBOLIC_NAME_EQUINOX + "\"")) - && message.contains("is already installed")) { + && message.contains(ALREADY_INSTALLED)) { // silent, in order to avoid warnings: we know that both // have already been installed... } else { - OsgiBootUtils.warn("Could not install bundle from " + url + ": " + message); + if (message.contains(ALREADY_INSTALLED)) { + if (OsgiBootUtils.isDebug()) + OsgiBootUtils.warn("Duplicate install from " + url + ": " + message); + } else + OsgiBootUtils.warn("Could not install bundle from " + url + ": " + message); } - if (OsgiBootUtils.debug && !message.contains("is already installed")) + if (OsgiBootUtils.debug && !message.contains(ALREADY_INSTALLED)) e.printStackTrace(); } } @@ -277,7 +318,7 @@ public class OsgiBoot implements OsgiBootConstants { }); } - public static void computeStartLevels(SortedMap> startLevels, Properties properties, + private static void computeStartLevels(SortedMap> startLevels, Properties properties, Integer defaultStartLevel) { // default (and previously, only behaviour) @@ -431,12 +472,11 @@ public class OsgiBoot implements OsgiBootConstants { * BUNDLE PATTERNS INSTALLATION */ /** - * Computes a list of URLs based on Ant-like include/exclude patterns - * defined by ${argeo.osgi.bundles} with the following format:
+ * Computes a list of URLs based on Ant-like include/exclude patterns defined by + * ${argeo.osgi.bundles} with the following format:
* /base/directory;in=*.jar;in=**;ex=org.eclipse.osgi_*;jar
* WARNING: /base/directory;in=*.jar,\ at the end of a file, - * without a new line causes a '.' to be appended with unexpected side - * effects. + * without a new line causes a '.' to be appended with unexpected side effects. */ public List getBundlesUrls() { String bundlePatterns = getProperty(PROP_ARGEO_OSGI_BUNDLES); @@ -444,7 +484,7 @@ public class OsgiBoot implements OsgiBootConstants { } /** - * Compute alist of URLs to install based on the provided patterns, with + * Compute a list of URLs to install based on the provided patterns, with * default base url */ public List getBundlesUrls(String bundlePatterns) { @@ -453,7 +493,7 @@ public class OsgiBoot implements OsgiBootConstants { } /** Implements the path matching logic */ - List getBundlesUrls(String baseUrl, String bundlePatterns) { + public List getBundlesUrls(String baseUrl, String bundlePatterns) { List urls = new ArrayList(); if (bundlePatterns == null) return urls; @@ -519,15 +559,44 @@ public class OsgiBoot implements OsgiBootConstants { return urls; DistributionBundle distributionBundle; - if (baseUrl != null && !(distributionUrl.startsWith("http") || distributionUrl.startsWith("file"))) { - // relative url - distributionBundle = new DistributionBundle(baseUrl, distributionUrl, localCache); - } else { + if (distributionUrl.startsWith("http") || distributionUrl.startsWith("file")) { distributionBundle = new DistributionBundle(distributionUrl); if (baseUrl != null) distributionBundle.setBaseUrl(baseUrl); + } else { + // relative url + if (baseUrl == null) { + baseUrl = localCache; + } + if (distributionUrl.contains(":")) { + // TODO make it safer + String[] parts = distributionUrl.trim().split(":"); + String[] categoryParts = parts[0].split("\\."); + String artifactId = parts[1]; + String version = parts[2]; + StringBuilder sb = new StringBuilder(); + for (String categoryPart : categoryParts) { + sb.append(categoryPart).append('/'); + } + sb.append(artifactId).append('/'); + sb.append(version).append('/'); + sb.append(artifactId).append('-').append(version).append(".jar"); + distributionUrl = sb.toString(); + } + + distributionBundle = new DistributionBundle(baseUrl, distributionUrl, localCache); } + // if (baseUrl != null && !(distributionUrl.startsWith("http") || + // distributionUrl.startsWith("file"))) { + // // relative url + // distributionBundle = new DistributionBundle(baseUrl, distributionUrl, + // localCache); + // } else { + // distributionBundle = new DistributionBundle(distributionUrl); + // if (baseUrl != null) + // distributionBundle.setBaseUrl(baseUrl); + // } distributionBundle.processUrl(); return distributionBundle.listUrls(); } @@ -674,6 +743,10 @@ public class OsgiBoot implements OsgiBootConstants { return bundleContext; } + public String getLocalCache() { + return localCache; + } + // public void setDefaultTimeout(long defaultTimeout) { // this.defaultTimeout = defaultTimeout; // }