You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2007/11/07 23:41:59 UTC

svn commit: r592931 - in /struts/sandbox/trunk/struts2-osgi-plugin: ./ src/main/java/org/apache/struts2/osgi/ src/main/resources/

Author: musachy
Date: Wed Nov  7 14:41:58 2007
New Revision: 592931

URL: http://svn.apache.org/viewvc?rev=592931&view=rev
Log:
Add Spring and FreeMarker support
* The Spring support is hacky and kind of a mess right now

Modified:
    struts/sandbox/trunk/struts2-osgi-plugin/pom.xml
    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/BundleResourceLoader.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/DelegatingObjectFactory.java
    struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/OsgiConfigurationProvider.java
    struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
    struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/StrutsActivator.java
    struts/sandbox/trunk/struts2-osgi-plugin/src/main/resources/struts-plugin.xml

Modified: struts/sandbox/trunk/struts2-osgi-plugin/pom.xml
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/pom.xml?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/pom.xml (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/pom.xml Wed Nov  7 14:41:58 2007
@@ -29,10 +29,10 @@
         <dependency>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-core</artifactId>
-            <version>2.0.9</version>
-        </dependency>
- 
-         <dependency>
+            <version>2.1.1-SNAPSHOT</version>
+        </dependency>
+        
+        <dependency>
             <groupId>velocity-tools</groupId>
             <artifactId>velocity-tools</artifactId>
             <version>1.1</version>

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=592931&r1=592930&r2=592931&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 Wed Nov  7 14:41:58 2007
@@ -6,10 +6,12 @@
 import java.util.Map;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 public interface BundleAccessor {
     
     void setBundles(Map<String,Bundle> bundles);
+    void setBundleContext(BundleContext bundleContext);
     Class loadClass(String name) throws ClassNotFoundException;
     InputStream loadResourceAsStream(String name) throws IOException;
     URL loadResource(String name);

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=592931&r1=592930&r2=592931&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 Wed Nov  7 14:41:58 2007
@@ -9,6 +9,7 @@
 import java.util.Map;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.config.Configuration;
@@ -20,8 +21,8 @@
 
 public class BundlePackageLoader implements PackageLoader {
 
-    public List<PackageConfig> loadPackages(Bundle bundle, ObjectFactory objectFactory, Map<String,PackageConfig> pkgConfigs) throws ConfigurationException {
-        BundleConfigurationProvider prov = new BundleConfigurationProvider("struts.xml", bundle);
+    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);
@@ -34,10 +35,12 @@
     
     static class BundleConfigurationProvider extends XmlConfigurationProvider {
         private Bundle bundle;
+        private BundleContext bundleContext;
 
-        public BundleConfigurationProvider(String filename, Bundle bundle) { 
+        public BundleConfigurationProvider(String filename, Bundle bundle, BundleContext bundleContext) { 
             super(filename, true);
             this.bundle = bundle;
+            this.bundleContext = bundleContext;
         }
         public BundleConfigurationProvider(String filename) { super(filename); }
 
@@ -47,20 +50,22 @@
             Iterator<URL> iter = new EnumeratorIterator<URL>(e);
             return iter;
         }
+        
         @Override
-        protected boolean verifyAction(String className, String name,
-                Location loc) {
+        protected boolean verifyAction(String className, String name, Location loc) {
             try {
-                Class cls = bundle.loadClass(className);
-                return cls != null;
-            } catch (ClassNotFoundException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
+                return bundle.loadClass(className) != null;
+            } catch (Exception e) {
+                //try spring
+                try {
+                    return SpringOSGiUtil.isValidBean(bundleContext, className);
+                } catch (Exception e1) {
+                    // TODO Auto-generated catch block
+                    e1.printStackTrace();
+                }
                 return false;
             }
         }
-        
-        
     }
     
     static class EnumeratorIterator<E> implements Iterator<E> {

Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleResourceLoader.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleResourceLoader.java?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleResourceLoader.java (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleResourceLoader.java Wed Nov  7 14:41:58 2007
@@ -2,13 +2,12 @@
 
 import java.io.InputStream;
 
-import org.apache.struts2.util.ClassLoaderUtils;
-import org.apache.struts2.views.velocity.StrutsResourceLoader;
 import org.apache.velocity.exception.ResourceNotFoundException;
 import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 
-import com.opensymphony.xwork2.inject.Inject;
-
+/**
+ * Finds Velocity templates in bundles
+ */
 public class BundleResourceLoader extends ClasspathResourceLoader {
 
     public synchronized InputStream getResourceStream(String name)

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=592931&r1=592930&r2=592931&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 Wed Nov  7 14:41:58 2007
@@ -10,17 +10,20 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
 public class DefaultBundleAccessor implements BundleAccessor {
 
     private static DefaultBundleAccessor self;
-    private static final Log LOG = LogFactory.getLog(DefaultBundleAccessor.class);
+    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;
     
     public DefaultBundleAccessor() {
         self = this;
@@ -36,6 +39,11 @@
         classToBundle.clear();
     }
     
+    @Override
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+    
     public Class<?> loadClass(String name) throws ClassNotFoundException {
         Class cls = null;
         if (classToBundle.containsKey(name)) {
@@ -49,13 +57,25 @@
                     }
                 } catch (ClassNotFoundException ex) {
                     if (LOG.isDebugEnabled()) {
-                        LOG.debug("class not found in bundle "+entry.getValue().getSymbolicName(), ex);
+                        LOG.debug("class not found in bundle "+entry.getValue().getSymbolicName());
                     }
                 }
             }
         }
         
         if (cls == null) {
+            //try spring
+            try {
+                Object bean = SpringOSGiUtil.getBean(bundleContext, name);
+                if (bean != null)
+                    cls = bean.getClass();
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+        
+        if (cls == null) {
             throw new ClassNotFoundException("Unable to find class "+name+" in bundles");
         }
         return cls;
@@ -89,5 +109,4 @@
         }
         return null;
     }
-    
 }

Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DelegatingObjectFactory.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DelegatingObjectFactory.java?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DelegatingObjectFactory.java (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/DelegatingObjectFactory.java Wed Nov  7 14:41:58 2007
@@ -1,5 +1,7 @@
 package org.apache.struts2.osgi;
 
+import java.util.Map;
+
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Inject;
@@ -9,9 +11,8 @@
     private BundleAccessor bundleResourceLoader;
     
     @Inject
-    public DelegatingObjectFactory(@Inject Container container,
-                                   @Inject("struts.objectFactory.delegate") String delegate) {
-        
+    public void setDelegateObjectFactory(@Inject Container container, 
+                                         @Inject("struts.objectFactory.delegate") String delegate) {
         if (delegate == null) {
             delegate = "struts";
         }
@@ -24,6 +25,14 @@
     }
     
     
+    public boolean isNoArgConstructorRequired() {
+        return delegateObjectFactory.isNoArgConstructorRequired();
+    }
+
+    public Object buildBean(Class clazz, Map extraContext) throws Exception {
+        return delegateObjectFactory.buildBean(clazz, extraContext);
+    }
+
     @Override
     public Class getClassInstance(String className) throws ClassNotFoundException {
         try

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=592931&r1=592930&r2=592931&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 Wed Nov  7 14:41:58 2007
@@ -3,6 +3,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLDecoder;
@@ -20,8 +21,6 @@
 
 import javax.servlet.ServletContext;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.felix.framework.Felix;
 import org.apache.felix.framework.cache.BundleCache;
 import org.apache.felix.framework.util.FelixConstants;
@@ -35,8 +34,6 @@
 import org.osgi.framework.BundleException;
 import org.osgi.framework.BundleListener;
 import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
@@ -49,10 +46,12 @@
 import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.ResolverUtil.Test;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
 public class OsgiConfigurationProvider implements ConfigurationProvider {
     
-    private static final Log log = LogFactory.getLog(OsgiConfigurationProvider.class);
+    private static final Logger log = LoggerFactory.getLogger(OsgiConfigurationProvider.class);
 
     private Felix felix;
     private Map<String,Bundle> bundles = Collections.synchronizedMap(new HashMap<String,Bundle>());
@@ -66,6 +65,7 @@
     @Inject
     public void setBundleAccessor(BundleAccessor acc) {
         acc.setBundles(bundles);
+        acc.setBundleContext(bundleContext);
     }
     
     @Inject
@@ -116,7 +116,7 @@
                     bundleNames.add(ref.getBundle().getSymbolicName());
                     log.info("Loading packages from bundle "+ref.getBundle().getSymbolicName());
                     PackageLoader loader = (PackageLoader) bundleContext.getService(ref);
-                    for (PackageConfig pkg : loader.loadPackages(ref.getBundle(), objectFactory, configuration.getPackageConfigs())) {
+                    for (PackageConfig pkg : loader.loadPackages(ref.getBundle(),  bundleContext, objectFactory, configuration.getPackageConfigs())) {
                         configuration.addPackageConfig(pkg.getName(), pkg);
                     }
                 }
@@ -134,12 +134,19 @@
     }
     
     protected void loadOsgi() {
+        //configuration properties 
+        Properties systemProperties = getProperties("default.properties");
+        Properties strutsProperties = getProperties("struts-osgi.properties");
+        
         Map configMap = new StringMap(false);
+        
         configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
             "org.osgi.framework; version=1.4.0," +
             "org.osgi.service.packageadmin; version=1.2.0," +
             "org.osgi.service.startlevel; version=1.0.0," +
-            "org.osgi.service.url; version=1.0.0");
+            "org.osgi.service.url; version=1.0.0" +
+            getSystemPackages(systemProperties) + 
+            strutsProperties.getProperty("xwork"));
 
         Set<String> bundlePaths = new HashSet<String>(findInPackage("bundles"));
         log.info("Loading Struts bundles "+bundlePaths);
@@ -151,7 +158,7 @@
         
         configMap.put(FelixConstants.AUTO_START_PROP + ".1",
             sb.toString());
-        configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "/tmp/foo");//System.getProperty("tmp.dir"));
+        configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, System.getProperty("tmp.dir"));
         configMap.put(BundleCache.CACHE_DIR_PROP, "jim");
         configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
         configMap.put(FelixConstants.SERVICE_URLHANDLERS_PROP, "false");
@@ -182,6 +189,32 @@
         }
         
         
+    }
+    
+    private String getSystemPackages(Properties properties) {
+        String jreVersion = "jre-" + System.getProperty("java.version").substring(0, 3);
+        return properties.getProperty(jreVersion);
+    }
+    
+    private Properties getProperties(String fileName) {
+        URL propertiesURL = OsgiConfigurationProvider.class.getClassLoader().getResource(
+            fileName);
+        Properties properties = new Properties();
+        InputStream is = null;
+        try {
+            is = propertiesURL.openConnection().getInputStream();
+            properties.load(is);
+            is.close();
+        } catch (Exception ex2) {
+            // Try to close input stream if we have one.
+            try {
+                if (is != null)
+                    is.close();
+            } catch (IOException ex3) {
+                // Nothing we can do.
+            }
+        }
+        return properties;
     }
     
     class BundleRegistration implements BundleActivator, BundleListener {

Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/PackageLoader.java Wed Nov  7 14:41:58 2007
@@ -4,11 +4,12 @@
 import java.util.Map;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 
 public interface PackageLoader {
-    List<PackageConfig> loadPackages(Bundle bundle, 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/src/main/java/org/apache/struts2/osgi/StrutsActivator.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/StrutsActivator.java?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/StrutsActivator.java (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/StrutsActivator.java Wed Nov  7 14:41:58 2007
@@ -10,7 +10,6 @@
     public void start(final BundleContext ctx) throws Exception {
         ctx.registerService(PackageLoader.class.getName(), new BundlePackageLoader(), new Properties());
         ctx.getBundle().loadClass("org.apache.struts2.osgi.BundleAccessor");
-        ctx.getBundle().loadClass("org.twdata.osgitest.foo.FooAction");
     }
 
     public void stop(BundleContext ctx) throws Exception {

Modified: struts/sandbox/trunk/struts2-osgi-plugin/src/main/resources/struts-plugin.xml
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/resources/struts-plugin.xml?rev=592931&r1=592930&r2=592931&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-osgi-plugin/src/main/resources/struts-plugin.xml (original)
+++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/resources/struts-plugin.xml Wed Nov  7 14:41:58 2007
@@ -11,5 +11,5 @@
     
     <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" />
 </struts>