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>