import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
import org.argeo.osgi.boot.internal.springutil.AntPathMatcher;
import org.argeo.osgi.boot.internal.springutil.PathMatcher;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
public class OsgiBoot {
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 */
/** @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"))).booleanValue();
+ System.getProperty(PROP_ARGEO_OSGI_BOOT_DEBUG,
+ System.getProperty(PROP_SLC_OSGIBOOT_DEBUG, "false")))
+ .booleanValue();
/** Default is 10s (set in constructor) */
private long defaultTimeout;
// TODO: Load additional system properties from file
// Properties additionalSystemProperties = new Properties();
-
+
}
public static String removeFilePrefix(String url) {
OsgiBootUtils.info("OSGi bootstrap completed in "
+ Math.round(((double) duration) / 1000) + "s (" + duration
+ "ms), " + bundleContext.getBundles().length + " bundles");
+
+ // display packages exported twice
+ if (debug) {
+ Map /* <String,Set<String>> */duplicatePackages = findPackagesExportedTwice();
+ if (duplicatePackages.size() > 0) {
+ OsgiBootUtils.info("Packages exported twice:");
+ Iterator it = duplicatePackages.keySet().iterator();
+ while (it.hasNext()) {
+ String pkgName = it.next().toString();
+ OsgiBootUtils.info(pkgName);
+ Set bdles = (Set) duplicatePackages.get(pkgName);
+ Iterator bdlesIt = bdles.iterator();
+ while (bdlesIt.hasNext())
+ OsgiBootUtils.info(" " + bdlesIt.next());
+ }
+ }
+ }
+
System.out.println();
}
// silent, in order to avoid warnings: we know that both
// have already been installed...
} else {
- OsgiBootUtils.warn("Could not install bundle from " + url + ": "
- + message);
+ OsgiBootUtils.warn("Could not install bundle from " + url
+ + ": " + message);
}
if (debug)
e.printStackTrace();
URL url = new URL(urlStr);
in = url.openStream();
bundle.update(in);
- OsgiBootUtils.info("Updated bundle " + moduleName + " from " + urlStr);
+ OsgiBootUtils.info("Updated bundle " + moduleName
+ + " from " + urlStr);
} catch (Exception e) {
throw new RuntimeException("Cannot update " + moduleName
+ " from " + urlStr);
debug("Installed bundle " + bundle.getSymbolicName()
+ " from " + urlStr);
} catch (BundleException e) {
- OsgiBootUtils.warn("Could not install bundle from " + urlStr + ": "
- + e.getMessage());
+ OsgiBootUtils.warn("Could not install bundle from "
+ + urlStr + ": " + e.getMessage());
}
}
}
}
public void startBundles() {
- String bundlesToStart = OsgiBootUtils.getPropertyCompat(PROP_ARGEO_OSGI_START,
- PROP_SLC_OSGI_START);
+ String bundlesToStart = OsgiBootUtils.getPropertyCompat(
+ PROP_ARGEO_OSGI_START, PROP_SLC_OSGI_START);
startBundles(bundlesToStart);
}
}
notFoundBundles.remove(symbolicName);
} catch (Exception e) {
- OsgiBootUtils.warn("Bundle " + symbolicName + " cannot be started: "
- + e.getMessage());
+ OsgiBootUtils.warn("Bundle " + symbolicName
+ + " cannot be started: " + e.getMessage());
if (debug)
e.printStackTrace();
// was found even if start failed
}
}
+ public Map findPackagesExportedTwice() {
+ ServiceReference paSr = bundleContext
+ .getServiceReference(PackageAdmin.class.getName());
+ // TODO: make a cleaner referencing
+ PackageAdmin packageAdmin = (PackageAdmin) bundleContext
+ .getService(paSr);
+
+ // find packages exported twice
+ Bundle[] bundles = bundleContext.getBundles();
+ Map /* <String,Set<String>> */exportedPackages = new TreeMap();
+ for (int i = 0; i < bundles.length; i++) {
+ Bundle bundle = bundles[i];
+ ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
+ if (pkgs != null)
+ for (int j = 0; j < pkgs.length; j++) {
+ String pkgName = pkgs[j].getName();
+ if (!exportedPackages.containsKey(pkgName)) {
+ exportedPackages.put(pkgName, new TreeSet());
+ }
+ ((Set) exportedPackages.get(pkgName)).add(bundle
+ .getSymbolicName() + "_" + bundle.getVersion());
+ }
+ }
+ Map /* <String,Set<String>> */duplicatePackages = new TreeMap();
+ Iterator it = exportedPackages.keySet().iterator();
+ while (it.hasNext()) {
+ String pkgName = it.next().toString();
+ Set bdles = (Set) exportedPackages.get(pkgName);
+ if (bdles.size() > 1)
+ duplicatePackages.put(pkgName, bdles);
+ }
+ return duplicatePackages;
+ }
+
protected void waitForBundleResolvedOrActive(long startBegin, Bundle bundle)
throws Exception {
int originalState = bundle.getState();
}
public List getLocationsUrls() {
- String baseUrl = OsgiBootUtils.getPropertyCompat(PROP_ARGEO_OSGI_BASE_URL,
- PROP_SLC_OSGI_BASE_URL, DEFAULT_BASE_URL);
- String bundleLocations = OsgiBootUtils.getPropertyCompat(PROP_ARGEO_OSGI_LOCATIONS,
- PROP_SLC_OSGI_LOCATIONS);
+ String baseUrl = OsgiBootUtils.getPropertyCompat(
+ PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL,
+ DEFAULT_BASE_URL);
+ String bundleLocations = OsgiBootUtils.getPropertyCompat(
+ PROP_ARGEO_OSGI_LOCATIONS, PROP_SLC_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.getPropertyCompat(
+ PROP_ARGEO_OSGI_MODULES_URL, PROP_SLC_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.getPropertyCompat(
+ PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL);
Map installedBundles = getBundles();
BufferedReader reader = null;
try {
URL modulesUrl = new URL(modulesUrlStr);
- reader = new BufferedReader(new InputStreamReader(modulesUrl
- .openStream()));
+ reader = new BufferedReader(new InputStreamReader(
+ modulesUrl.openStream()));
String line = null;
while ((line = reader.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line,
if (installedBundles.containsKey(moduleName)) {
Bundle bundle = (Bundle) installedBundles.get(moduleName);
- String bundleVersion = bundle.getHeaders().get(
- Constants.BUNDLE_VERSION).toString();
+ String bundleVersion = bundle.getHeaders()
+ .get(Constants.BUNDLE_VERSION).toString();
int comp = compareVersions(bundleVersion, moduleVersion);
if (comp > 0) {
OsgiBootUtils.warn("Installed version " + bundleVersion
+ moduleVersion);
} else if (comp < 0) {
urls.add(url);
- OsgiBootUtils.info("Updated bundle " + moduleName + " with version "
- + moduleVersion + " (old version was "
- + bundleVersion + ")");
+ OsgiBootUtils.info("Updated bundle " + moduleName
+ + " with version " + moduleVersion
+ + " (old version was " + bundleVersion + ")");
} else {
// do nothing
}
}
public List getBundlesUrls() {
- String baseUrl = OsgiBootUtils.getPropertyCompat(PROP_ARGEO_OSGI_BASE_URL,
- PROP_SLC_OSGI_BASE_URL, DEFAULT_BASE_URL);
- String bundlePatterns = OsgiBootUtils.getPropertyCompat(PROP_ARGEO_OSGI_BUNDLES,
- PROP_SLC_OSGI_BUNDLES);
+ String baseUrl = OsgiBootUtils.getPropertyCompat(
+ PROP_ARGEO_OSGI_BASE_URL, PROP_SLC_OSGI_BASE_URL,
+ DEFAULT_BASE_URL);
+ String bundlePatterns = OsgiBootUtils.getPropertyCompat(
+ PROP_ARGEO_OSGI_BUNDLES, PROP_SLC_OSGI_BUNDLES);
return getBundlesUrls(baseUrl, bundlePatterns);
}
File[] files = baseDir.listFiles();
if (files == null) {
- OsgiBootUtils.warn("Base dir " + baseDir + " has no children, exists="
- + baseDir.exists() + ", isDirectory="
- + baseDir.isDirectory());
+ OsgiBootUtils.warn("Base dir " + baseDir
+ + " has no children, exists=" + baseDir.exists()
+ + ", isDirectory=" + baseDir.isDirectory());
return;
}