package org.argeo.slc.osgi.build; import java.net.URL; import java.util.SortedMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.NameVersion; import org.argeo.slc.build.Distribution; import org.argeo.slc.core.build.VersionedResourceDistribution; import org.argeo.slc.osgi.OsgiBundle; import org.eclipse.gemini.blueprint.util.OsgiBundleUtils; import org.osgi.framework.Bundle; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; public class OsgiRuntimeModularDistribution extends AbstractOsgiModularDistribution implements ResourceLoaderAware { private final static Log log = LogFactory .getLog(OsgiRuntimeModularDistribution.class); private ResourceLoader resourceLoader; protected void fillDistributions( SortedMap distributions) throws Exception { String frameworkUrl = System.getProperty("osgi.framework"); String frameworkBaseUrl = null; if (frameworkUrl != null) frameworkBaseUrl = frameworkUrl.substring(0, frameworkUrl .lastIndexOf('/')); bundles: for (Bundle bundle : getBundleContext().getBundles()) { OsgiBundle osgiBundle = new OsgiBundle(bundle); String originalLocation = bundle.getLocation(); if (OsgiBundleUtils.isSystemBundle(bundle)) { continue bundles; } String location = originalLocation; if (originalLocation.startsWith("reference:file:")) location = originalLocation.substring("reference:".length()); if (frameworkBaseUrl != null && originalLocation.startsWith("initial@reference:file:")) { location = frameworkBaseUrl + '/' + originalLocation.substring("initial@reference:file:" .length()); } try { URL url = new URL(location); Resource res = resourceLoader.getResource(url.toString()); distributions.put(osgiBundle, new VersionedResourceDistribution(osgiBundle, res)); if (log.isTraceEnabled()) log.debug("Added url " + url + " from original location " + originalLocation); } catch (Exception e) { log.warn("Cannot interpret location " + location + " of bundle " + bundle + ": " + e); } } } public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } }