package org.argeo.slc.lib.detached;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.slc.SlcException;
import org.osgi.framework.BundleContext;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ResourceLoaderAware;
+import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.osgi.context.BundleContextAware;
private String xmlapisBundleName = "com.springsource.org.apache.xmlcommons";
private String xercesBundleName = "com.springsource.org.apache.xerces";
+ private List<String> excludeBundleNames = new ArrayList<String>();
+ private List<String> includeBundleUrls = new ArrayList<String>();
+
/**
* Required by Spring for JDK 1.4. see
* http://forum.springsource.org/showthread.php?t=74555
else
getClasspath().add(osgiFramework);
+ StringBuffer osgiBundles = new StringBuffer("");
StringBuffer osgiLocations = new StringBuffer("");
bundles: for (Bundle bundle : bundleContext.getBundles()) {
String name = bundle.getSymbolicName();
+ if (excludeBundleNames.contains(name)) {
+ if (log.isDebugEnabled())
+ log.debug("Exclude bundle " + name);
+ continue bundles;// skip excluded
+ }
+
+ String originalLocation = bundle.getLocation();
+ if (log.isTraceEnabled())
+ log.trace("Original location of bundle " + name + ": "
+ + originalLocation);
+ String location = removeInitialReference(originalLocation);
+
// Special bundles
if (osgibootBundleName.equals(name))
- getClasspath().add(findOsgiboot(bundle));
+ getClasspath().add(asResource(location));
else if (equinoxBundleName.equals(name))
continue bundles;// skip framework
else if (xmlapisBundleName.equals(name) && prependXmlJars)
- getPBootClasspath().add(asResource(bundle.getLocation()));
+ getPBootClasspath().add(asResource(location));
else if (xercesBundleName.equals(name) && prependXmlJars)
- getPBootClasspath().add(asResource(bundle.getLocation()));
+ getPBootClasspath().add(asResource(location));
+
+ if (location.startsWith("file:")) {
+ File file = new File(location.substring("file:".length()));
+ if (osgiLocations.length() != 0)
+ osgiLocations.append(File.pathSeparatorChar);
+ location = file.getPath().replace('/', File.separatorChar);
+ osgiLocations.append(location);
+ if (log.isTraceEnabled())
+ log.trace("Added bundle " + name
+ + " to slc.osgi.locations: " + location);
+ } else {
+ if (osgiBundles.length() != 0)
+ osgiBundles.append(',');
+ location = location.replace('/', File.separatorChar);
+ osgiBundles.append(location);
+ if (log.isTraceEnabled())
+ log.trace("Added bundle " + name + " to osgi.bundles: "
+ + location);
+ }
+ }
- if (osgiLocations.length() != 0)
- osgiLocations.append(',');
- osgiLocations.append(bundle.getLocation());
+ for (String url : includeBundleUrls) {
+ if (osgiBundles.length() != 0)
+ osgiBundles.append(',');
+ osgiBundles.append(url);
+ if (log.isDebugEnabled())
+ log.debug("Include url" + url);
}
getSystemProperties().setProperty("osgi.bundles",
+ osgiBundles.toString());
+ getSystemProperties().setProperty("slc.osgi.locations",
osgiLocations.toString());
}
- protected Resource findOsgiboot(Bundle bundle) {
- String location = bundle.getLocation();
+ protected String removeInitialReference(String location) {
if (location.startsWith("initial@reference:file:"))
- location = System.getProperty("osgi.install.area") + "/../"
+ location = System.getProperty("osgi.install.area")
+ location.substring("initial@reference:file:".length());
if (location.charAt(location.length() - 1) == '/')
location.substring(0, location.length() - 1);
- return asResource(location);
+ return location;
}
protected Resource asResource(String location) {
- Resource res = resourceLoader.getResource(location);
+ // Resource res = resourceLoader.getResource(location);
+
+ final Resource res;
+ if (location.startsWith("file:")) {
+ File file = new File(location.substring("file:".length()));
+ if (!file.exists())
+ throw new SlcException("File " + file + " does not exist");
+
+ try {
+ res = new FileSystemResource(file.getCanonicalFile());
+ } catch (IOException e) {
+ throw new SlcException("Cannot create resource based on "
+ + file, e);
+ }
+ } else
+ res = resourceLoader.getResource(location);
+
if (log.isDebugEnabled())
log.debug("Converted " + location + " to " + res);
return res;
this.prependXmlJars = prependXmlJars;
}
+ public void setExcludeBundleNames(List<String> excludeBundleNames) {
+ this.excludeBundleNames = excludeBundleNames;
+ }
+
+ public void setIncludeBundleUrls(List<String> includeBundleUrls) {
+ this.includeBundleUrls = includeBundleUrls;
+ }
+
}