X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=osgi%2Fruntime%2Forg.argeo.osgi.boot%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fosgi%2Fboot%2FOsgiBoot.java;h=d51c80b320a6c3e2f91d1fec285d6593da6e9d18;hb=ec6825d1c84fec39d1dbc8fb80ad4f1f8d6de8ca;hp=5ba6c8165ff3542f276b909dff9ca27e8c6b93c4;hpb=1091ad1e03298cdfd10af070bc011a2a72d08d55;p=lgpl%2Fargeo-commons.git diff --git a/osgi/runtime/org.argeo.osgi.boot/src/main/java/org/argeo/osgi/boot/OsgiBoot.java b/osgi/runtime/org.argeo.osgi.boot/src/main/java/org/argeo/osgi/boot/OsgiBoot.java index 5ba6c8165..d51c80b32 100644 --- a/osgi/runtime/org.argeo.osgi.boot/src/main/java/org/argeo/osgi/boot/OsgiBoot.java +++ b/osgi/runtime/org.argeo.osgi.boot/src/main/java/org/argeo/osgi/boot/OsgiBoot.java @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.SortedMap; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.TreeSet; @@ -43,6 +44,7 @@ import org.osgi.framework.ServiceReference; import org.osgi.service.packageadmin.ExportedPackage; import org.osgi.service.packageadmin.PackageAdmin; +/** Core component, performing basic provisioning of an OSGi runtime. */ public class OsgiBoot { public final static String SYMBOLIC_NAME_OSGI_BOOT = "org.argeo.osgi.boot"; public final static String SYMBOLIC_NAME_EQUINOX = "org.eclipse.osgi"; @@ -53,46 +55,34 @@ public class OsgiBoot { public final static String PROP_ARGEO_OSGI_BUNDLES = "argeo.osgi.bundles"; public final static String PROP_ARGEO_OSGI_LOCATIONS = "argeo.osgi.locations"; public final static String PROP_ARGEO_OSGI_BASE_URL = "argeo.osgi.baseUrl"; + /** Use org.argeo.osgi */ public final static String PROP_ARGEO_OSGI_MODULES_URL = "argeo.osgi.modulesUrl"; public final static String PROP_ARGEO_OSGI_BOOT_DEBUG = "argeo.osgi.boot.debug"; + public final static String PROP_ARGEO_OSGI_BOOT_INSTALL_IN_LEXICOGRAPHIC_ORDER = "argeo.osgi.boot.installInLexicographicOrder"; public final static String PROP_ARGEO_OSGI_BOOT_DEFAULT_TIMEOUT = "argeo.osgi.boot.defaultTimeout"; public final static String PROP_ARGEO_OSGI_BOOT_MODULES_URL_SEPARATOR = "argeo.osgi.boot.modulesUrlSeparator"; public final static String PROP_ARGEO_OSGI_BOOT_SYSTEM_PROPERTIES_FILE = "argeo.osgi.boot.systemPropertiesFile"; public final static String PROP_ARGEO_OSGI_BOOT_APPCLASS = "argeo.osgi.boot.appclass"; public final static String PROP_ARGEO_OSGI_BOOT_APPARGS = "argeo.osgi.boot.appargs"; - /** @deprecated */ - public final static String PROP_SLC_OSGI_START = "slc.osgi.start"; - /** @deprecated */ - public final static String PROP_SLC_OSGI_BUNDLES = "slc.osgi.bundles"; - /** @deprecated */ - public final static String PROP_SLC_OSGI_LOCATIONS = "slc.osgi.locations"; - /** @deprecated */ - public final static String PROP_SLC_OSGI_BASE_URL = "slc.osgi.baseUrl"; - /** @deprecated */ - public final static String PROP_SLC_OSGI_MODULES_URL = "slc.osgi.modulesUrl"; - - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_DEBUG = "slc.osgiboot.debug"; - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_DEFAULT_TIMEOUT = "slc.osgiboot.defaultTimeout"; - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_MODULES_URL_SEPARATOR = "slc.osgiboot.modulesUrlSeparator"; - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_SYSTEM_PROPERTIES_FILE = "slc.osgiboot.systemPropertiesFile"; - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_APPCLASS = "slc.osgiboot.appclass"; - /** @deprecated */ - public final static String PROP_SLC_OSGIBOOT_APPARGS = "slc.osgiboot.appargs"; - public final static String DEFAULT_BASE_URL = "reference:file:"; public final static String EXCLUDES_SVN_PATTERN = "**/.svn/**"; private boolean debug = Boolean.valueOf( - System.getProperty(PROP_ARGEO_OSGI_BOOT_DEBUG, - System.getProperty(PROP_SLC_OSGIBOOT_DEBUG, "false"))) + System.getProperty(PROP_ARGEO_OSGI_BOOT_DEBUG, "false")) .booleanValue(); + + /** + * The {@link #installUrls(List)} methods won't follow the list order but + * order the urls according to teh alphabetical order of the file names + * (last part of the URL). The goal is to stay closer from Eclipse PDE way + * of installing target platform bundles. + */ + private boolean installInLexicographicOrder = Boolean.valueOf( + System.getProperty(PROP_ARGEO_OSGI_BOOT_DEBUG, "true")) + .booleanValue();; + /** Default is 10s (set in constructor) */ private long defaultTimeout; @@ -104,12 +94,10 @@ public class OsgiBoot { public OsgiBoot(BundleContext bundleContext) { this.bundleContext = bundleContext; - defaultTimeout = Long.parseLong(OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BOOT_DEFAULT_TIMEOUT, - PROP_SLC_OSGIBOOT_DEFAULT_TIMEOUT, "10000")); - modulesUrlSeparator = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BOOT_MODULES_URL_SEPARATOR, - PROP_SLC_OSGIBOOT_MODULES_URL_SEPARATOR, ","); + defaultTimeout = Long.parseLong(OsgiBootUtils.getProperty( + PROP_ARGEO_OSGI_BOOT_DEFAULT_TIMEOUT, "10000")); + modulesUrlSeparator = OsgiBootUtils.getProperty( + PROP_ARGEO_OSGI_BOOT_MODULES_URL_SEPARATOR, ","); initSystemProperties(); } @@ -139,15 +127,7 @@ public class OsgiBoot { } - public static String removeFilePrefix(String url) { - if (url.startsWith("file:")) - return url.substring("file:".length()); - else if (url.startsWith("reference:file:")) - return url.substring("reference:file:".length()); - else - return url; - } - + /** Boot strap the OSGi runtime */ public void bootstrap() { long begin = System.currentTimeMillis(); System.out.println(); @@ -169,15 +149,15 @@ public class OsgiBoot { if (debug) { Map /* > */duplicatePackages = findPackagesExportedTwice(); if (duplicatePackages.size() > 0) { - OsgiBootUtils.debug("## Packages exported twice"); + OsgiBootUtils.info("Packages exported twice:"); Iterator it = duplicatePackages.keySet().iterator(); while (it.hasNext()) { String pkgName = it.next().toString(); - OsgiBootUtils.debug(pkgName); + OsgiBootUtils.info(pkgName); Set bdles = (Set) duplicatePackages.get(pkgName); Iterator bdlesIt = bdles.iterator(); while (bdlesIt.hasNext()) - OsgiBootUtils.debug(" " + bdlesIt.next()); + OsgiBootUtils.info(" " + bdlesIt.next()); } } } @@ -185,42 +165,71 @@ public class OsgiBoot { System.out.println(); } + /** Install the bundles at this URL list. */ public void installUrls(List urls) { Map installedBundles = getInstalledBundles(); - for (int i = 0; i < urls.size(); i++) { - String url = (String) urls.get(i); - try { - if (installedBundles.containsKey(url)) { - Bundle bundle = (Bundle) installedBundles.get(url); - // bundle.update(); - if (debug) - debug("Bundle " + bundle.getSymbolicName() - + " already installed from " + url); - } else { - Bundle bundle = bundleContext.installBundle(url); - if (debug) - debug("Installed bundle " + bundle.getSymbolicName() - + " from " + url); - } - } catch (BundleException e) { - String message = e.getMessage(); - if ((message.contains("Bundle \"" + SYMBOLIC_NAME_OSGI_BOOT - + "\"") || message.contains("Bundle \"" - + SYMBOLIC_NAME_EQUINOX + "\"")) - && message.contains("has already been 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 (debug) - e.printStackTrace(); + + if (installInLexicographicOrder) { + SortedMap map = new TreeMap(); + // reorder + for (int i = 0; i < urls.size(); i++) { + String url = (String) urls.get(i); + int index = url.lastIndexOf('/'); + String fileName; + if (index >= 0) + fileName = url.substring(index + 1); + else + fileName = url; + map.put(fileName, url); + } + + // install + Iterator keys = map.keySet().iterator(); + while (keys.hasNext()) { + Object key = keys.next(); + String url = map.get(key).toString(); + installUrl(url, installedBundles); + } + } else { + for (int i = 0; i < urls.size(); i++) { + String url = (String) urls.get(i); + installUrl(url, installedBundles); } } } + protected void installUrl(String url, Map installedBundles) { + try { + if (installedBundles.containsKey(url)) { + Bundle bundle = (Bundle) installedBundles.get(url); + // bundle.update(); + if (debug) + debug("Bundle " + bundle.getSymbolicName() + + " already installed from " + url); + } else { + Bundle bundle = bundleContext.installBundle(url); + if (debug) + debug("Installed bundle " + bundle.getSymbolicName() + + " from " + url); + } + } catch (BundleException e) { + String message = e.getMessage(); + if ((message.contains("Bundle \"" + SYMBOLIC_NAME_OSGI_BOOT + "\"") || message + .contains("Bundle \"" + SYMBOLIC_NAME_EQUINOX + "\"")) + && message.contains("has already been 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 (debug) + e.printStackTrace(); + } + } + + /** @deprecated Doesn't seem to be used anymore. */ public void installOrUpdateUrls(Map urls) { Map installedBundles = getBundles(); @@ -262,8 +271,8 @@ public class OsgiBoot { } public void startBundles() { - String bundlesToStart = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_START, PROP_SLC_OSGI_START); + String bundlesToStart = OsgiBootUtils + .getProperty(PROP_ARGEO_OSGI_START); startBundles(bundlesToStart); } @@ -296,6 +305,8 @@ public class OsgiBoot { try { try { bundle.start(); + if (debug) + debug("Bundle " + symbolicName + " started"); } catch (Exception e) { OsgiBootUtils.warn("Start of bundle " + symbolicName + " failed because of " + e @@ -342,6 +353,7 @@ public class OsgiBoot { } } + /** List packages exported twice. */ public Map findPackagesExportedTwice() { ServiceReference paSr = bundleContext .getServiceReference(PackageAdmin.class.getName()); @@ -445,23 +457,21 @@ public class OsgiBoot { } public List getLocationsUrls() { - String baseUrl = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL, + String baseUrl = OsgiBootUtils.getProperty(PROP_ARGEO_OSGI_BASE_URL, DEFAULT_BASE_URL); - String bundleLocations = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_LOCATIONS, PROP_SLC_OSGI_LOCATIONS); + String bundleLocations = OsgiBootUtils + .getProperty(PROP_ARGEO_OSGI_LOCATIONS); return getLocationsUrls(baseUrl, bundleLocations); } public List getModulesUrls() { List urls = new ArrayList(); - String modulesUrlStr = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_MODULES_URL, PROP_SLC_OSGI_MODULES_URL); + String modulesUrlStr = OsgiBootUtils + .getProperty(PROP_ARGEO_OSGI_MODULES_URL); if (modulesUrlStr == null) return urls; - String baseUrl = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL); + String baseUrl = OsgiBootUtils.getProperty(PROP_ARGEO_OSGI_BASE_URL); Map installedBundles = getBundles(); @@ -586,11 +596,10 @@ public class OsgiBoot { } public List getBundlesUrls() { - String baseUrl = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL, + String baseUrl = OsgiBootUtils.getProperty(PROP_ARGEO_OSGI_BASE_URL, DEFAULT_BASE_URL); - String bundlePatterns = OsgiBootUtils.getPropertyCompat( - PROP_ARGEO_OSGI_BUNDLES, PROP_SLC_OSGI_BUNDLES); + String bundlePatterns = OsgiBootUtils + .getProperty(PROP_ARGEO_OSGI_BUNDLES); return getBundlesUrls(baseUrl, bundlePatterns); } @@ -639,6 +648,10 @@ public class OsgiBoot { return urls; } + /* + * HIGH LEVEL UTILITIES + */ + protected void match(PathMatcher matcher, List matched, String base, String currentPath, String pattern) { if (currentPath == null) { @@ -661,9 +674,9 @@ public class OsgiBoot { return;// don't try deeper if already matched boolean ok = matcher.match(pattern, currentPath); - if (debug) - debug(currentPath + " " + (ok ? "" : " not ") - + " matched with " + pattern); + // if (debug) + // debug(currentPath + " " + (ok ? "" : " not ") + // + " matched with " + pattern); if (ok) { matched.add(fullPath); return; @@ -703,6 +716,11 @@ public class OsgiBoot { } } + /* + * LOW LEVEL UTILITIES + */ + + /** Creates an URL from a location */ protected String locationToUrl(String baseUrl, String location) { int extInd = location.lastIndexOf('.'); String ext = null; @@ -720,6 +738,15 @@ public class OsgiBoot { return (basePath + '/' + relativePath).replace('/', File.separatorChar); } + private String removeFilePrefix(String url) { + if (url.startsWith("file:")) + return url.substring("file:".length()); + else if (url.startsWith("reference:file:")) + return url.substring("reference:file:".length()); + else + return url; + } + protected void debug(Object obj) { if (debug) OsgiBootUtils.debug(obj); @@ -737,6 +764,15 @@ public class OsgiBoot { return bundleContext; } + public void setInstallInLexicographicOrder( + boolean installInAlphabeticalOrder) { + this.installInLexicographicOrder = installInAlphabeticalOrder; + } + + public boolean isInstallInLexicographicOrder() { + return installInLexicographicOrder; + } + /** Whether to exclude Subversion directories (true by default) */ public boolean isExcludeSvn() { return excludeSvn;