Author: musachy
Date: Mon Apr  6 00:36:32 2009
New Revision: 762192

URL: http://svn.apache.org/viewvc?rev=762192&view=rev
Log:
Add support for the Convention plugin

Added:
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleClassLoaderInterface.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiUtil.java
      - copied, changed from r761957, 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/SpringOSGiUtil.java
Removed:
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/SpringOSGiUtil.java
Modified:
    struts/sandbox/trunk/struts2-osgi-plugin/admin-bundle/pom.xml
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/FelixOsgiHost.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
    
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/resources/struts-plugin.xml

Modified: struts/sandbox/trunk/struts2-osgi-plugin/admin-bundle/pom.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/admin-bundle/pom.xml?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/admin-bundle/pom.xml (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/admin-bundle/pom.xml Mon Apr  6 
00:36:32 2009
@@ -12,7 +12,7 @@
                <dependency>
                        <groupId>org.apache.struts</groupId>
                        <artifactId>struts2-osgi-plugin</artifactId>
-                       <version>1.0-SNAPSHOT</version>
+                       <version>1.0.0-SNAPSHOT</version>
                </dependency>
         <dependency>
             <groupId>junit</groupId>

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleAccessor.java
 Mon Apr  6 00:36:32 2009
@@ -31,4 +31,5 @@
 
     ServiceReference getServiceReference(String className);
 
+    void addPackageFromBundle(Bundle bundle, String packageName);
 }

Added: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleClassLoaderInterface.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleClassLoaderInterface.java?rev=762192&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleClassLoaderInterface.java
 (added)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundleClassLoaderInterface.java
 Mon Apr  6 00:36:32 2009
@@ -0,0 +1,36 @@
+package org.apache.struts2.osgi;
+
+import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
+
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Collections;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * ClassLoaderInterface instance that delegates to the singleton of 
DefaultBundleAccessor 
+ */
+public class BundleClassLoaderInterface implements ClassLoaderInterface {
+    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        return DefaultBundleAccessor.getInstance().loadClass(name);
+    }
+
+    public URL getResource(String name) {
+        return  DefaultBundleAccessor.getInstance().loadResource(name, true);
+    }
+
+    public Enumeration<URL> getResources(String name) throws IOException {
+        return 
Collections.enumeration(DefaultBundleAccessor.getInstance().loadResources(name, 
true));
+    }
+
+    public InputStream getResourceAsStream(String name) throws IOException {
+        return DefaultBundleAccessor.getInstance().loadResourceAsStream(name);
+    }
+
+    public ClassLoaderInterface getParent() {
+        return null;
+    }
+}

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/BundlePackageLoader.java
 Mon Apr  6 00:36:32 2009
@@ -9,8 +9,10 @@
 
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.config.PackageProvider;
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.config.impl.DefaultConfiguration;
 import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
@@ -20,7 +22,7 @@
 
 public class BundlePackageLoader implements PackageLoader {
     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 {
         Configuration config = new DefaultConfiguration("struts.xml");
         ActionContext ctx = ActionContext.getContext();
@@ -43,8 +45,10 @@
         } finally {
             ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, null);
         }
+
         List<PackageConfig> list = new 
ArrayList<PackageConfig>(config.getPackageConfigs().values());
         list.removeAll(pkgConfigs.values());
+        
         return list;
     }
     
@@ -79,7 +83,7 @@
 
                 //try to find a bean with that id
                 try {
-                    return SpringOSGiUtil.isValidBean(bundleContext, 
className);
+                    return OsgiUtil.isValidBean(bundleContext, className);
                 } catch (Exception e1) {
                     if (LOG.isDebugEnabled())
                         LOG.debug("Unable to find bean [#0]", className);

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/DefaultBundleAccessor.java
 Mon Apr  6 00:36:32 2009
@@ -3,6 +3,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.net.MalformedURLException;
 import java.util.*;
 import java.util.Map.Entry;
 
@@ -18,11 +19,14 @@
 import com.opensymphony.xwork2.ActionProxy;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 
+/**
+ * Helper class that find resources and loads classes from the list of bundles
+ */
 public class DefaultBundleAccessor implements BundleAccessor {
 
     private static DefaultBundleAccessor self;
     private static final Logger LOG = 
LoggerFactory.getLogger(DefaultBundleAccessor.class);
-    
+
     private Map<String, Bundle> bundles = new HashMap<String, Bundle>();
     private BundleContext bundleContext;
     private Map<String, String> packageToBundle;
@@ -31,8 +35,7 @@
     public DefaultBundleAccessor() {
         self = this;
     }
-    
-    // todo: this is crap
+
     public static DefaultBundleAccessor getInstance() {
         return self;
     }
@@ -45,35 +48,54 @@
         return bundleContext.getServiceReference(className);
     }
 
-    public void init(Map<String,Bundle> bundles, BundleContext bundleContext, 
Map<String, String> packageToBundle) {
+    public void init(Map<String, Bundle> bundles, BundleContext bundleContext, 
Map<String, String> packageToBundle) {
         this.bundles = Collections.unmodifiableMap(bundles);
         this.bundleContext = bundleContext;
-        this.packageToBundle = Collections.unmodifiableMap(packageToBundle);
+        this.packageToBundle = packageToBundle;
         this.packagesByBundle = new HashMap<Bundle, Set<String>>();
-        for (Map.Entry<String,String> entry : packageToBundle.entrySet()) {
+        for (Map.Entry<String, String> entry : packageToBundle.entrySet()) {
             Bundle bundle = bundles.get(entry.getValue());
-            Set<String> pkgs = packagesByBundle.get(bundle);
-            if (pkgs == null) {
-                pkgs = new HashSet<String>();
-                packagesByBundle.put(bundle, pkgs);
-            }
-            pkgs.add(entry.getKey());
+            addPackageFromBundle(bundle, entry.getKey());
+        }
+    }
+
+    /**
+     *  Add as Bundle -> Package mapping 
+     * @param bundle the bundle where the package was loaded from
+     * @param packageName the anme of the loaded package
+     */
+    public void addPackageFromBundle(Bundle bundle, String packageName) {
+        this.packageToBundle.put(packageName, bundle.getSymbolicName());
+        Set<String> pkgs = packagesByBundle.get(bundle);
+        if (pkgs == null) {
+            pkgs = new HashSet<String>();
+            packagesByBundle.put(bundle, pkgs);
         }
-        this.packagesByBundle = Collections.unmodifiableMap(packagesByBundle);
+        pkgs.add(packageName);
     }
-    
+
     public Class<?> loadClass(String className) throws ClassNotFoundException {
         Class cls = null;
+
         Bundle bundle = getCurrentBundle();
         if (bundle != null) {
             cls = bundle.loadClass(className);
             LOG.debug("Located class [#0] in bundle [#1]", className, 
bundle.getSymbolicName());
         }
 
+        //try all the bundles
+        for (Bundle bundle2 : bundles.values()) {
+            try {
+                return bundle2.loadClass(className);
+            } catch (Exception ex) {
+                //ignore
+            }
+        }
+
         if (cls == null) {
             //try to find a bean with that id (hack for spring that searches 
all bundles)
             try {
-                Object bean = SpringOSGiUtil.getBean(bundleContext, className);
+                Object bean = OsgiUtil.getBean(bundleContext, className);
                 if (bean != null)
                     cls = bean.getClass();
             } catch (Exception e) {
@@ -81,9 +103,9 @@
                     LOG.debug("Unable to find bean [#0]", className);
             }
         }
-        
+
         if (cls == null) {
-            throw new ClassNotFoundException("Unable to find class 
"+className+" in bundles");
+            throw new ClassNotFoundException("Unable to find class " + 
className + " in bundles");
         }
         return cls;
     }
@@ -104,12 +126,16 @@
     }
 
     public List<URL> loadResources(String name) throws IOException {
+        return loadResources(name, false);
+    }
+
+    public List<URL> loadResources(String name, boolean translate) throws 
IOException {
         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());
+                resources.add(translate ? 
OsgiUtil.translateBundleURLToJarURL((URL) e.nextElement(), getCurrentBundle()) 
: (URL) e.nextElement());
             }
             return resources;
         }
@@ -137,10 +163,24 @@
     }
 
     public URL loadResource(String name) {
+        return loadResource(name, false);
+    }
+
+    public URL loadResource(String name, boolean translate) {
         Bundle bundle = getCurrentBundle();
         if (bundle != null) {
-            return bundle.getResource(name);
+            URL url = bundle.getResource(name);
+            try {
+                return translate ? OsgiUtil.translateBundleURLToJarURL(url, 
getCurrentBundle()) : url;
+            } catch (Exception e) {
+                if (LOG.isErrorEnabled()) {
+                    LOG.error("Unable to translate bunfle URL to jar URL", e);
+                }
+
+                return null;
+            }
         }
+
         return null;
     }
 
@@ -154,7 +194,7 @@
 
     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/plugin/src/main/java/org/apache/struts2/osgi/FelixOsgiHost.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/FelixOsgiHost.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/FelixOsgiHost.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/FelixOsgiHost.java
 Mon Apr  6 00:36:32 2009
@@ -72,6 +72,7 @@
     private List<? extends BundleActivator> extraBundleActivators;
     private boolean cleanBundleCache;
     private static Pattern versionPattern = Pattern.compile("([\\d])+[\\.-]");
+    private String startRunLevel;
 
     protected void startFelix() {
         //load properties from felix embedded file
@@ -107,7 +108,7 @@
         configProps.put(FelixConstants.SERVICE_URLHANDLERS_PROP, "false");
         configProps.put(FelixConstants.LOG_LEVEL_PROP, "4");
         configProps.put(FelixConstants.BUNDLE_CLASSPATH, ".");
-        configProps.put(FelixConstants.FRAMEWORK_BEGINNING_STARTLEVEL, "2");   
     
+        configProps.put(FelixConstants.FRAMEWORK_BEGINNING_STARTLEVEL, 
startRunLevel);        
 
         try {
             List<BundleActivator> list = new ArrayList<BundleActivator>();
@@ -210,7 +211,7 @@
      */
     private void addExportedPackages(Properties strutsConfigProps, Properties 
configProps) {
         String[] rootPackages = StringUtils.split((String) 
strutsConfigProps.get("scanning.package.includes"), ",");
-        ResourceFinder finder = new ResourceFinder(StringUtils.EMPTY, 
OsgiConfigurationProvider.class.getClassLoader());
+        ResourceFinder finder = new ResourceFinder(StringUtils.EMPTY);
         List<String> exportedPackages = new ArrayList<String>();
         //build a list of subpackages
         for (String rootPackage : rootPackages) {
@@ -327,4 +328,9 @@
     public void setCleanBundleCache(String cleanBundleCache) {
         this.cleanBundleCache = "true".equalsIgnoreCase(cleanBundleCache);
     }
+
+    @Inject("struts.osgi.startRunLevel")
+    public void setStartRunLevel(String startRunLevel) {
+        this.startRunLevel = startRunLevel;
+    }
 }

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java
 Mon Apr  6 00:36:32 2009
@@ -1,22 +1,27 @@
 package org.apache.struts2.osgi;
 
 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.PackageProvider;
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
 import org.apache.struts2.osgi.loaders.VelocityBundleResourceLoader;
 import org.apache.struts2.views.velocity.VelocityManager;
 import org.apache.velocity.app.Velocity;
+import org.apache.commons.lang.xwork.StringUtils;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Bundle;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -24,6 +29,8 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
 
 /**
  * Struts package provider that starts the OSGi container and deelgates 
package loading
@@ -90,9 +97,59 @@
             }
         }
         bundleAccessor.init(osgiHost.getBundles(), bundleContext, 
packageToBundle);
+
+        //reload container that will load configuration based on bundles (like 
convention plugin)
+        reloadExtraProviders(configuration.getContainer());
+
         bundlesChanged = false;
     }
 
+    protected void reloadExtraProviders(Container container) {
+        //these providers will be reloaded for each bundle
+        List<PackageProvider> providers = new ArrayList<PackageProvider>();
+        PackageProvider conventionPackageProvider = 
container.getInstance(PackageProvider.class, "convention.packageProvider");
+        if (conventionPackageProvider != null)
+            providers.add(conventionPackageProvider);
+
+        //init action context
+        ActionContext ctx = ActionContext.getContext();
+        if (ctx == null) {
+            ctx = new ActionContext(new HashMap());
+            ActionContext.setContext(ctx);
+        }
+
+        //reload all providers by bundle
+        for (Bundle bundle : osgiHost.getBundles().values()) {
+            try {
+                //the Convention plugin will use BundleClassLoaderInterface 
from the ActionContext to find resources
+                //and load classes
+                ctx.put(ClassLoaderInterface.CLASS_LOADER_INTERFACE, new 
BundleClassLoaderInterface());
+                ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, 
bundle.getSymbolicName());
+                
+                Object bundleActivator = 
bundle.getHeaders().get("Bundle-Activator");
+                if (bundleActivator != null && 
StringUtils.equals(StrutsActivator.class.getName(), 
bundleActivator.toString())) {                   
ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, bundle.getSymbolicName());
+                    for (PackageProvider provider : providers) {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Reloading provider [#0] for bundle 
[#1]", provider.getClass().getName(), bundle.getSymbolicName());
+                        //get the existing packages before reloading the 
provider (se we can figure out what are the new packages)
+                        Set<String> packagesBeforeLoading = new 
HashSet(configuration.getPackageConfigNames());
+                        provider.loadPackages();
+                        Set<String> packagesAfterLoading = new 
HashSet(configuration.getPackageConfigNames());
+                        packagesAfterLoading.removeAll(packagesBeforeLoading);
+                        if (!packagesAfterLoading.isEmpty()) {
+                            //add the new packages to the map of bundle -> 
package
+                            for (String packageName : packagesAfterLoading)
+                                bundleAccessor.addPackageFromBundle(bundle, 
packageName);
+                        }
+                    }
+                }
+            } finally {
+                ctx.put(BundleAccessor.CURRENT_BUNDLE_NAME, null);
+                ctx.put(ClassLoaderInterface.CLASS_LOADER_INTERFACE, null);
+            }
+        }
+    }
+
     public synchronized boolean needsReload() {
         return bundlesChanged;
     }

Copied: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiUtil.java
 (from r761957, 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/SpringOSGiUtil.java)
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiUtil.java?p2=struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiUtil.java&p1=struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/SpringOSGiUtil.java&r1=761957&r2=762192&rev=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/SpringOSGiUtil.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/OsgiUtil.java
 Mon Apr  6 00:36:32 2009
@@ -2,31 +2,54 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.MalformedURLException;
 
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Bundle;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+public class OsgiUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiUtil.class);
 
-public class SpringOSGiUtil {
     public static boolean isValidBean(BundleContext bundleContext, String 
beanId) throws InvalidSyntaxException, SecurityException, 
IllegalArgumentException, NoSuchMethodException, IllegalAccessException, 
InvocationTargetException {
         return getBean(bundleContext, beanId) != null;
     }
-    
+
     public static Object getBean(BundleContext bundleContext, String beanId) 
throws InvalidSyntaxException, SecurityException, IllegalArgumentException, 
NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         ServiceReference[] references = bundleContext.getAllServiceReferences(
-            "org.springframework.context.ApplicationContext", null);
+                "org.springframework.context.ApplicationContext", null);
         if (references != null && references.length > 0) {
             Object beanFactory = bundleContext.getService(references[0]);
             //this class and the BeanFactory service are loaded by different 
classloaders
             //so we cannot cast to a common interface (is there any other 
(nice) way of doing this?)
             return getBean(beanFactory, beanId);
         }
-        
+
         return null;
     }
-    
+
     private static Object getBean(Object beanFactory, String beanId) throws 
SecurityException, NoSuchMethodException, IllegalArgumentException, 
IllegalAccessException, InvocationTargetException {
         Method getBeanMethod = beanFactory.getClass().getMethod("getBean", 
String.class);
         return getBeanMethod.invoke(beanFactory, beanId);
     }
+
+    /**
+     * A bundle is a jar, and a bunble URL will be useless to clients, this 
method translates
+     * a URL to a resource inside a bundle from "bundle:something/path" to 
"jar:file:bundlelocation!/path"
+     */
+    public static URL translateBundleURLToJarURL(URL bundleUrl, Bundle bundle) 
throws MalformedURLException {
+        if (bundleUrl != null && 
"bundle".equalsIgnoreCase(bundleUrl.getProtocol())) {
+            StringBuilder sb = new StringBuilder("jar:");
+            sb.append(bundle.getLocation());
+            sb.append("!");
+            sb.append(bundleUrl.getFile());
+            return new URL(sb.toString());
+        }
+
+        return bundleUrl;
+    }
 }

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
 Mon Apr  6 00:36:32 2009
@@ -8,8 +8,9 @@
 
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.config.PackageProvider;
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 
 public interface PackageLoader {
-    List<PackageConfig> loadPackages(Bundle bundle, BundleContext 
bundleContext, ObjectFactory objectFactory, Map<String,PackageConfig> map) 
throws ConfigurationException;
+    List<PackageConfig> loadPackages(Bundle bundle, BundleContext 
bundleContext, ObjectFactory objectFactory, Map<String, PackageConfig> map) 
throws ConfigurationException;
 }

Modified: 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/resources/struts-plugin.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/resources/struts-plugin.xml?rev=762192&r1=762191&r2=762192&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/resources/struts-plugin.xml
 (original)
+++ 
struts/sandbox/trunk/struts2-osgi-plugin/plugin/src/main/resources/struts-plugin.xml
 Mon Apr  6 00:36:32 2009
@@ -10,11 +10,15 @@
     <bean name="osgi" type="com.opensymphony.xwork2.ObjectFactory" 
class="org.apache.struts2.osgi.DelegatingObjectFactory" />
     <bean name="osgi" type="com.opensymphony.xwork2.config.PackageProvider" 
class="org.apache.struts2.osgi.OsgiConfigurationProvider" />
     <bean name="felix" type="org.apache.struts2.osgi.OsgiHost" 
class="org.apache.struts2.osgi.FelixOsgiHost" />
+    <bean name="osgi" 
type="com.opensymphony.xwork2.util.finder.ClassLoaderInterface" 
class="org.apache.struts2.osgi.BundleClassLoaderInterface" />
     
     <constant name="struts.objectFactory" value="osgi" />
     <constant name="struts.objectFactory.delegate" value="struts" />
     <constant name="struts.freemarker.manager.classname" 
value="org.apache.struts2.osgi.BundleFreemarkerManager" />
     <constant name="struts.staticContentLoader" 
value="org.apache.struts2.osgi.loaders.StaticContentBundleResourceLoader" />
 
+    <constant name="struts.convention.action.includeJars" 
value="jar:file:.*?/bundles/.*?\.jar(!/)?" />
+
     <constant name="struts.osgi.clearBundleCache" value="true" />
+    <constant name="struts.osgi.startRunLevel" value="2" />
 </struts>


Reply via email to