Author: musachy Date: Fri Nov 9 09:53:40 2007 New Revision: 593608 URL: http://svn.apache.org/viewvc?rev=593608&view=rev Log: Organize the code a little bit
Added: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/FreeMarkerBundleResourceLoader.java struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/VelocityBundleResourceLoader.java Removed: 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/BundleTemplateLoader.java 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/BundleFreemarkerManager.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/DelegatingObjectFactory.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=593608&r1=593607&r2=593608&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 Fri Nov 9 09:53:40 2007 @@ -9,11 +9,15 @@ import org.osgi.framework.BundleContext; public interface BundleAccessor { - - void setBundles(Map<String,Bundle> bundles); + + 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/BundleFreemarkerManager.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleFreemarkerManager.java?rev=593608&r1=593607&r2=593608&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleFreemarkerManager.java (original) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/BundleFreemarkerManager.java Fri Nov 9 09:53:40 2007 @@ -5,6 +5,7 @@ import javax.servlet.ServletContext; +import org.apache.struts2.osgi.loaders.FreeMarkerBundleResourceLoader; import org.apache.struts2.views.freemarker.FreemarkerManager; import org.apache.struts2.views.freemarker.StrutsClassTemplateLoader; @@ -16,7 +17,11 @@ import freemarker.cache.TemplateLoader; import freemarker.cache.WebappTemplateLoader; -public class BundleFreemarkerManager extends FreemarkerManager{ +/** + * This class extends FreemarkerManager in core to add a template loader + * (that finds resources inside bundles) to MultiTemplateLoader + */ +public class BundleFreemarkerManager extends FreemarkerManager { private static final Logger LOG = LoggerFactory.getLogger(BundleFreemarkerManager.class); @Override @@ -33,7 +38,7 @@ try { templatePathLoader = new FileTemplateLoader(new File(templatePath)); } catch (IOException e) { - LOG.error("Invalid template path specified: " + e.getMessage(), e); + LOG.error("Invalid template path specified: #1",e, e.getMessage()); } } @@ -44,12 +49,12 @@ templatePathLoader, new WebappTemplateLoader(servletContext), new StrutsClassTemplateLoader(), - new BundleTemplateLoader() + new FreeMarkerBundleResourceLoader() }) : new MultiTemplateLoader(new TemplateLoader[]{ new WebappTemplateLoader(servletContext), new StrutsClassTemplateLoader(), - new BundleTemplateLoader() + new FreeMarkerBundleResourceLoader() }); } 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=593608&r1=593607&r2=593608&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 Fri Nov 9 09:53:40 2007 @@ -18,9 +18,12 @@ import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; import com.opensymphony.xwork2.util.location.Location; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; 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 { BundleConfigurationProvider prov = new BundleConfigurationProvider("struts.xml", bundle, bundleContext); Configuration config = new DefaultConfiguration("struts.xml"); @@ -51,18 +54,26 @@ return iter; } + /* + * Try to find the class (className) on this bundle. If the class it not found, + * try to find an Spring bean with that name. + */ @Override protected boolean verifyAction(String className, String name, Location loc) { try { return bundle.loadClass(className) != null; } catch (Exception e) { - //try spring + if (LOG.isDebugEnabled()) + LOG.debug("Unable to find class #1 in bundle #2", className, bundle.getSymbolicName()); + + //try to find a bean with that id try { return SpringOSGiUtil.isValidBean(bundleContext, className); } catch (Exception e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); + if (LOG.isDebugEnabled()) + LOG.debug("Unable to find bean #1", className); } + return false; } } 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=593608&r1=593607&r2=593608&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 Fri Nov 9 09:53:40 2007 @@ -44,39 +44,39 @@ this.bundleContext = bundleContext; } - public Class<?> loadClass(String name) throws ClassNotFoundException { + public Class<?> loadClass(String className) throws ClassNotFoundException { Class cls = null; - if (classToBundle.containsKey(name)) { - bundles.get(classToBundle.get(name)).loadClass(name); + if (classToBundle.containsKey(className)) { + bundles.get(classToBundle.get(className)).loadClass(className); } else { for (Entry<String,Bundle> entry : bundles.entrySet()) { try { - cls = entry.getValue().loadClass(name); + cls = entry.getValue().loadClass(className); if (cls != null) { - classToBundle.put(name, entry.getKey()); + classToBundle.put(className, entry.getKey()); } } catch (ClassNotFoundException ex) { if (LOG.isDebugEnabled()) { - LOG.debug("class not found in bundle "+entry.getValue().getSymbolicName()); + LOG.debug("class #1 not found in bundle #2", className, entry.getValue().getSymbolicName()); } } } } if (cls == null) { - //try spring + //try to find a bean with that id try { - Object bean = SpringOSGiUtil.getBean(bundleContext, name); + Object bean = SpringOSGiUtil.getBean(bundleContext, className); if (bean != null) cls = bean.getClass(); } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); + if (LOG.isDebugEnabled()) + LOG.debug("Unable to find bean #1", className); } } if (cls == null) { - throw new ClassNotFoundException("Unable to find class "+name+" in bundles"); + throw new ClassNotFoundException("Unable to find class "+className+" in bundles"); } return cls; } 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=593608&r1=593607&r2=593608&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 Fri Nov 9 09:53:40 2007 @@ -39,7 +39,7 @@ { return delegateObjectFactory.getClassInstance(className); } - catch (ClassNotFoundException cnfe) + catch (Exception e) { return bundleResourceLoader.loadClass(className); } 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=593608&r1=593607&r2=593608&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 Fri Nov 9 09:53:40 2007 @@ -25,6 +25,7 @@ import org.apache.felix.framework.cache.BundleCache; import org.apache.felix.framework.util.FelixConstants; import org.apache.felix.framework.util.StringMap; +import org.apache.struts2.osgi.loaders.VelocityBundleResourceLoader; import org.apache.struts2.views.velocity.VelocityManager; import org.apache.velocity.app.Velocity; import org.osgi.framework.Bundle; @@ -51,7 +52,7 @@ public class OsgiConfigurationProvider implements ConfigurationProvider { - private static final Logger log = LoggerFactory.getLogger(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>()); @@ -82,7 +83,7 @@ public void setVelocityManager(VelocityManager vm) { Properties props = new Properties(); props.setProperty("osgi.resource.loader.description","OSGI bundle loader"); - props.setProperty("osgi.resource.loader.class", BundleResourceLoader.class.getName()); + props.setProperty("osgi.resource.loader.class", VelocityBundleResourceLoader.class.getName()); props.setProperty(Velocity.RESOURCE_LOADER, "strutsfile,strutsclass,osgi"); vm.setVelocityProperties(props); } @@ -91,8 +92,7 @@ try { felix.stop(); } catch (BundleException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + LOG.error("Failed to stop Felix", e); } bundles = null; } @@ -114,7 +114,7 @@ for (ServiceReference ref : refs) { if (!bundleNames.contains(ref.getBundle().getSymbolicName())) { bundleNames.add(ref.getBundle().getSymbolicName()); - log.info("Loading packages from bundle "+ref.getBundle().getSymbolicName()); + LOG.info("Loading packages from bundle #1", ref.getBundle().getSymbolicName()); PackageLoader loader = (PackageLoader) bundleContext.getService(ref); for (PackageConfig pkg : loader.loadPackages(ref.getBundle(), bundleContext, objectFactory, configuration.getPackageConfigs())) { configuration.addPackageConfig(pkg.getName(), pkg); @@ -136,6 +136,8 @@ protected void loadOsgi() { //configuration properties Properties systemProperties = getProperties("default.properties"); + + //struts specific properties Properties strutsProperties = getProperties("struts-osgi.properties"); Map configMap = new StringMap(false); @@ -149,7 +151,7 @@ strutsProperties.getProperty("xwork")); Set<String> bundlePaths = new HashSet<String>(findInPackage("bundles")); - log.info("Loading Struts bundles "+bundlePaths); + LOG.info("Loading Struts bundles "+bundlePaths); StringBuilder sb = new StringBuilder(); for (String path : bundlePaths) { @@ -158,7 +160,7 @@ configMap.put(FelixConstants.AUTO_START_PROP + ".1", sb.toString()); - configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, System.getProperty("tmp.dir")); + 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"); configMap.put(FelixConstants.SERVICE_URLHANDLERS_PROP, "false"); @@ -183,12 +185,9 @@ try { Thread.sleep(500); } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + LOG.error("An error occured while waiting for bundle activation", e); } } - - } private String getSystemPackages(Properties properties) { @@ -224,29 +223,16 @@ bundleContext = context; } - public void stop(BundleContext arg0) throws Exception { - // TODO Auto-generated method stub - + public void stop(BundleContext ctx) throws Exception { } public void bundleChanged(BundleEvent evt) { - if (evt.getType() == evt.INSTALLED) { - log.debug("Installed bundle "+evt.getBundle().getSymbolicName()); + if (evt.getType() == BundleEvent.INSTALLED) { + LOG.debug("Installed bundle "+evt.getBundle().getSymbolicName()); bundles.put(evt.getBundle().getLocation(), evt.getBundle()); bundlesChanged = true; } - - // Copy out all view files - /*if (evt.getType() == evt.STARTED) { - Enumeration e = evt.getBundle().findEntries("/view/", null, true); - while (e != null && e.hasMoreElements()) { - URL url = (URL) e.nextElement(); - System.out.println("found view url: "+url); - } - } - */ } - } /** @@ -268,7 +254,7 @@ urls = Thread.currentThread().getContextClassLoader().getResources(packageName); } catch (IOException ioe) { - log.warn("Could not read package: " + packageName, ioe); + LOG.warn("Could not read package: " + packageName, ioe); return paths; } @@ -297,7 +283,7 @@ } } catch (IOException ioe) { - log.warn("could not read entries", ioe); + LOG.warn("could not read entries", ioe); } } return paths; @@ -330,10 +316,9 @@ } else if (file.getName().endsWith(".jar")) { try { - paths.add(file.toURL().toString()); + paths.add(file.toURI().toURL().toString()); } catch (MalformedURLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + LOG.error("Invalid file path", e); } } } @@ -357,12 +342,12 @@ while ( (entry = jarStream.getNextJarEntry() ) != null) { String name = entry.getName(); if (!entry.isDirectory() && name.startsWith(parent) && name.endsWith(".jar")) { - paths.add(jarfile.toURL()+"!"+entry.getName()); + paths.add(jarfile.toURI().toURL()+"!"+entry.getName()); } } } catch (IOException ioe) { - log.error("Could not search jar file '" + jarfile + "' due to an IOException", ioe); + LOG.error("Could not search jar file #1 due to an IOException", ioe, jarfile.toString()); } } Added: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/FreeMarkerBundleResourceLoader.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/FreeMarkerBundleResourceLoader.java?rev=593608&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/FreeMarkerBundleResourceLoader.java (added) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/FreeMarkerBundleResourceLoader.java Fri Nov 9 09:53:40 2007 @@ -0,0 +1,19 @@ +package org.apache.struts2.osgi.loaders; + +import java.net.URL; + +import org.apache.struts2.osgi.DefaultBundleAccessor; + +import freemarker.cache.URLTemplateLoader; + +/** + * Finds FreeMarker templates in bundles + */ +public class FreeMarkerBundleResourceLoader extends URLTemplateLoader { + + @Override + protected URL getURL(String name) { + return DefaultBundleAccessor.getInstance().loadResource(name); + } + +} Added: struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/VelocityBundleResourceLoader.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/VelocityBundleResourceLoader.java?rev=593608&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/VelocityBundleResourceLoader.java (added) +++ struts/sandbox/trunk/struts2-osgi-plugin/src/main/java/org/apache/struts2/osgi/loaders/VelocityBundleResourceLoader.java Fri Nov 9 09:53:40 2007 @@ -0,0 +1,30 @@ +package org.apache.struts2.osgi.loaders; + +import java.io.InputStream; + +import org.apache.struts2.osgi.DefaultBundleAccessor; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; + +/** + * Finds Velocity templates in bundles + */ +public class VelocityBundleResourceLoader extends ClasspathResourceLoader { + + public synchronized InputStream getResourceStream(String name) + throws ResourceNotFoundException { + if ((name == null) || (name.length() == 0)) { + throw new ResourceNotFoundException("No template name provided"); + } + + if (name.startsWith("/")) { + name = name.substring(1); + } + + try { + return DefaultBundleAccessor.getInstance().loadResourceAsStream(name); + } catch (Exception e) { + throw new ResourceNotFoundException(e.getMessage()); + } + } +}