Author: mrdon Date: Mon Feb 25 02:04:17 2008 New Revision: 630785 URL: http://svn.apache.org/viewvc?rev=630785&view=rev Log: Adding code to ensure classes and resources are only resolved for the current bundle
Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java?rev=630785&r1=630784&r2=630785&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java (original) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java Mon Feb 25 02:04:17 2008 @@ -10,6 +10,8 @@ public interface BundleAccessor { + String CURRENT_BUNDLE_NAME = "__bundle_name__"; + void setBundles(Map<String, Bundle> bundles); void setBundleContext(BundleContext bundleContext); @@ -20,4 +22,5 @@ URL loadResource(String name); + void setPackageToBundleMapping(Map<String, String> packageToBundle); } Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java?rev=630785&r1=630784&r2=630785&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java (original) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java Mon Feb 25 02:04:17 2008 @@ -2,16 +2,13 @@ import java.io.IOException; import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.config.entities.PackageConfig; @@ -25,14 +22,27 @@ private static final Logger LOG = LoggerFactory.getLogger(BundlePackageLoader.class); public List<PackageConfig> loadPackages(Bundle bundle, BundleContext bundleContext, ObjectFactory objectFactory, Map<String,PackageConfig> pkgConfigs) throws ConfigurationException { - BundleConfigurationProvider prov = new BundleConfigurationProvider("struts.xml", bundle, bundleContext); Configuration config = new DefaultConfiguration("struts.xml"); - for (PackageConfig pkg : pkgConfigs.values()) { - config.addPackageConfig(pkg.getName(), pkg); + ActionContext ctx = ActionContext.getContext(); + if (ctx == null) { + ctx = new ActionContext(new HashMap()); + ActionContext.setContext(ctx); + } + + try { + // Ensure all requested classes and resources will be resolved using the current bundle + ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, bundle.getSymbolicName()); + + BundleConfigurationProvider prov = new BundleConfigurationProvider("struts.xml", bundle, bundleContext); + for (PackageConfig pkg : pkgConfigs.values()) { + config.addPackageConfig(pkg.getName(), pkg); + } + prov.setObjectFactory(objectFactory); + prov.init(config); + prov.loadPackages(); + } finally { + ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, null); } - prov.setObjectFactory(objectFactory); - prov.init(config); - prov.loadPackages(); return new ArrayList<PackageConfig>(config.getPackageConfigs().values()); } Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java?rev=630785&r1=630784&r2=630785&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java (original) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java Mon Feb 25 02:04:17 2008 @@ -15,6 +15,8 @@ import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.config.entities.ActionConfig; public class DefaultBundleAccessor implements BundleAccessor { @@ -22,9 +24,9 @@ private static final Logger LOG = LoggerFactory.getLogger(DefaultBundleAccessor.class); private Map<String, Bundle> bundles = new HashMap<String, Bundle>(); - private Map<String,String> classToBundle = new HashMap<String,String>(); private BundleContext bundleContext; - + private Map<String, String> packageToBundle; + public DefaultBundleAccessor() { self = this; } @@ -36,35 +38,22 @@ public void setBundles(Map<String,Bundle> bundles) { this.bundles = bundles; - classToBundle.clear(); } - @Override public void setBundleContext(BundleContext bundleContext) { this.bundleContext = bundleContext; } public Class<?> loadClass(String className) throws ClassNotFoundException { Class cls = null; - if (classToBundle.containsKey(className)) { - bundles.get(classToBundle.get(className)).loadClass(className); - } else { - for (Entry<String,Bundle> entry : bundles.entrySet()) { - try { - cls = entry.getValue().loadClass(className); - if (cls != null) { - classToBundle.put(className, entry.getKey()); - } - } catch (ClassNotFoundException ex) { - if (LOG.isDebugEnabled()) { - LOG.debug("class #1 not found in bundle #2", className, entry.getValue().getSymbolicName()); - } - } - } + Bundle bundle = getCurrentBundle(); + if (bundle != null) { + bundle.loadClass(className); + LOG.debug("Located class #1 in bundle #2", className, bundle.getSymbolicName()); } - + if (cls == null) { - //try to find a bean with that id + //try to find a bean with that id (hack for spring that searches all bundles) try { Object bean = SpringOSGiUtil.getBean(bundleContext, className); if (bean != null) @@ -80,31 +69,49 @@ } return cls; } - + + private Bundle getCurrentBundle() { + ActionContext ctx = ActionContext.getContext(); + String bundleName = (String) ctx.get(CURRENT_BUNDLE_NAME); + if (bundleName != null) { + ActionConfig actionConfig = ctx.getActionInvocation().getProxy().getConfig(); + bundleName = packageToBundle.get(actionConfig.getPackageName()); + } + if (bundleName != null) { + return bundles.get(bundleName); + } + return null; + } + public List<URL> loadResources(String name) throws IOException { - List<URL> resources = new ArrayList<URL>(); - for (Entry<String,Bundle> entry : bundles.entrySet()) { - Enumeration e = entry.getValue().getResources(name); + Bundle bundle = getCurrentBundle(); + if (bundle != null) { + List<URL> resources = new ArrayList<URL>(); + Enumeration e = bundle.getResources(name); while (e.hasMoreElements()) { resources.add((URL) e.nextElement()); } + return resources; } - return resources; + + return null; } public URL loadResource(String name) { - URL url = null; - for (Entry<String,Bundle> entry : bundles.entrySet()) { - url = entry.getValue().getResource(name); - if (url != null) - break; + Bundle bundle = getCurrentBundle(); + if (bundle != null) { + return bundle.getResource(name); } - return url; + return null; + } + + public void setPackageToBundleMapping(Map<String, String> packageToBundle) { + this.packageToBundle = packageToBundle; } public InputStream loadResourceAsStream(String name) throws IOException { URL url = loadResource(name); - if (url != null) { + if (url != null) { return url.openStream(); } return null; Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java?rev=630785&r1=630784&r2=630785&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java (original) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java Mon Feb 25 02:04:17 2008 @@ -58,7 +58,7 @@ private Map<String,Bundle> bundles = Collections.synchronizedMap(new HashMap<String,Bundle>()); private Configuration configuration; private BundleContext bundleContext; - private ServletContext servletContext; + private BundleAccessor bundleAccessor; private boolean bundlesChanged = false; private ObjectFactory objectFactory; @@ -67,11 +67,7 @@ public void setBundleAccessor(BundleAccessor acc) { acc.setBundles(bundles); acc.setBundleContext(bundleContext); - } - - @Inject - public void setServletContext(ServletContext ctx) { - this.servletContext = ctx; + this.bundleAccessor = acc; } @Inject @@ -109,6 +105,7 @@ } catch (InvalidSyntaxException e) { throw new ConfigurationException(e); } + Map<String,String> packageToBundle = new HashMap<String,String>(); Set bundleNames = new HashSet(); if (refs != null) { for (ServiceReference ref : refs) { @@ -118,10 +115,12 @@ PackageLoader loader = (PackageLoader) bundleContext.getService(ref); for (PackageConfig pkg : loader.loadPackages(ref.getBundle(), bundleContext, objectFactory, configuration.getPackageConfigs())) { configuration.addPackageConfig(pkg.getName(), pkg); + packageToBundle.put(pkg.getName(), ref.getBundle().getSymbolicName()); } } } } + bundleAccessor.setPackageToBundleMapping(packageToBundle); bundlesChanged = false; } @@ -158,8 +157,8 @@ sb.append(path).append(" "); } - configMap.put(FelixConstants.AUTO_START_PROP + ".1", - sb.toString()); + //configMap.put(FelixConstants.AUTO_START_PROP + ".1", + // sb.toString()); configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, System.getProperty("java.io.tmpdir")); configMap.put(BundleCache.CACHE_DIR_PROP, "jim"); configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true"); @@ -239,9 +238,7 @@ * Scans for classes starting at the package provided and descending into subpackages. * Each class is offered up to the Test as it is discovered, and if the Test returns * true the class is retained. Accumulated classes can be fetched by calling - * [EMAIL PROTECTED] #getClasses()}. * - * @param test an instance of [EMAIL PROTECTED] Test} that will be used to filter classes * @param packageName the name of the package from which to start scanning for * classes, e.g. [EMAIL PROTECTED] net.sourceforge.stripes} */ @@ -296,7 +293,6 @@ * the file is loaded and tested to see if it is acceptable according to the Test. Operates * recursively to find classes within a folder structure matching the package structure. * - * @param test a Test used to filter the classes that are discovered * @param parent the package name up to this directory in the package hierarchy. E.g. if * /classes is in the classpath and we wish to examine files in /classes/org/apache then * the values of <i>parent</i> would be <i>org/apache</i> @@ -329,7 +325,6 @@ * matching the package structure. If the File is not a JarFile or does not exist a warning * will be logged, but no error will be raised. * - * @param test a Test used to filter the classes that are discovered * @param parent the parent package under which classes must be in order to be considered * @param jarfile the jar file to be examined for classes */