Author: ddewolf Date: Thu Nov 2 11:57:00 2006 New Revision: 470495 URL: http://svn.apache.org/viewvc?view=rev&rev=470495 Log: Adding enhanced application context to provide classpath resource loading
Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java (with props) struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/ struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/ struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java (with props) Modified: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesApplicationContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesApplicationContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesApplicationContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/util/TilesUtilImpl.java Modified: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesApplicationContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesApplicationContext.java?view=diff&rev=470495&r1=470494&r2=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesApplicationContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesApplicationContext.java Thu Nov 2 11:57:00 2006 @@ -20,6 +20,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Map; +import java.util.Set; +import java.io.IOException; /** * Defines a set of methods which tiles use to communicate to @@ -54,7 +56,7 @@ * @return the first located resource which matches the given path. * @throws java.net.MalformedURLException if the path is malformed */ - URL getResource(String path) throws MalformedURLException; + URL getResource(String path) throws IOException; /** * Return a URL for the application resource mapped to the specified path. @@ -63,5 +65,5 @@ * @return all resources which match the given path. * @throws java.net.MalformedURLException if the url is illegal */ - URL[] getResources(String path) throws MalformedURLException; + Set<URL> getResources(String path) throws IOException; } Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java?view=auto&rev=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java (added) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java Thu Nov 2 11:57:00 2006 @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.context.enhanced; + +import org.apache.tiles.TilesApplicationContext; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.Log; + +import java.util.*; +import java.net.URL; +import java.io.IOException; + +/** + * ApplicationContext decorator used to provide + * enhancements to the standard context. + * + * Specifically, it provides: + * <ul> + * <li>Ability to load resources from the classpath</li> + * <li>Ability to retrieve multiple resources of the same name</li> + * </ul> + * + * Future features will include: + * <ul> + * <li>Ability to utilize wildcards in resource pathcs</li> + * </ul> + * + * @since Tiles 2.0 + * @version $Rev$ + * + */ +public class EnhancedTilesApplicationContext implements TilesApplicationContext { + + private static final Log LOG = + LogFactory.getLog(EnhancedTilesApplicationContext.class); + + private TilesApplicationContext rootContext; + + public EnhancedTilesApplicationContext(TilesApplicationContext rootContext) { + this.rootContext = rootContext; + } + + public Map<String, Object> getApplicationScope() { + return rootContext.getApplicationScope(); + } + + public Map<String, String> getInitParams() { + return rootContext.getInitParams(); + } + + public URL getResource(String path) throws IOException { + URL rootUrl = rootContext.getResource(path); + if(rootUrl == null) { + Set<URL> resources = getResources(path); + if(resources.size() > 0) { + rootUrl = resources.toArray(new URL[resources.size()])[0]; + } + } + return rootUrl; + } + + public Set<URL> getResources(String path) throws IOException { + Set<URL> resources = new HashSet<URL>(); + resources.addAll(rootContext.getResources(path)); + resources.addAll(searchResources(getClass().getClassLoader(), path)); + + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + if(contextLoader != null) { + resources.addAll(searchResources(contextLoader, path)); + } + + return resources; + } + + protected Set<URL> searchResources(ClassLoader loader, String path) { + Set<URL> resources = new HashSet<URL>(); + try { + Enumeration<URL> e = loader.getResources(path); + while(e.hasMoreElements()) { + resources.add(e.nextElement()); + } + } catch (IOException e) { + LOG.warn("Unable to retrieved resources from classloader: "+loader, e); + } + return resources; + } +} Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContext.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesApplicationContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesApplicationContext.java?view=diff&rev=470495&r1=470494&r2=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesApplicationContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesApplicationContext.java Thu Nov 2 11:57:00 2006 @@ -27,6 +27,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Map; +import java.util.Set; +import java.util.HashSet; /** * Portlet-based TilesApplicationContext implementation. @@ -122,8 +124,10 @@ return context.getResource(path); } - public URL[] getResources(String path) throws MalformedURLException { - return new URL[]{context.getResource(path)}; + public Set<URL> getResources(String path) throws MalformedURLException { + HashSet<URL> set = new HashSet<URL>(); + set.add(getResource(path)); + return set; } public TilesRequestContext createRequestContext(Object request, Object response) { Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesApplicationContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesApplicationContext.java?view=diff&rev=470495&r1=470494&r2=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesApplicationContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesApplicationContext.java Thu Nov 2 11:57:00 2006 @@ -27,6 +27,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Map; +import java.util.Set; +import java.util.HashSet; /** * Servlet-bsed implementation of the TilesApplicationContext interface. @@ -83,8 +85,10 @@ return servletContext.getResource(path); } - public URL[] getResources(String path) throws MalformedURLException { - return new URL[]{servletContext.getResource(path)}; + public Set<URL> getResources(String path) throws MalformedURLException { + HashSet<URL> urls = new HashSet<URL>(); + urls.add(getResource(path)); + return urls; } public ServletContext getServletContext() { Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java?view=diff&rev=470495&r1=470494&r2=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java Thu Nov 2 11:57:00 2006 @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.StringTokenizer; +import java.io.IOException; /** * Basic implementation of the tiles container interface. @@ -97,7 +98,7 @@ definitionsFactory.addSource(resourceUrl); } } - } catch (MalformedURLException e) { + } catch (IOException e) { throw new DefinitionsFactoryException("Unable to parse definitions from " + resourceString, e); } Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/util/TilesUtilImpl.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/util/TilesUtilImpl.java?view=diff&rev=470495&r1=470494&r2=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/util/TilesUtilImpl.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/util/TilesUtilImpl.java Thu Nov 2 11:57:00 2006 @@ -205,7 +205,7 @@ String filename = (String) filenames.get(i); factory.addSource(applicationContext.getResource(filename)); } - } catch (MalformedURLException e) { + } catch (IOException e) { throw new DefinitionsFactoryException("Problem with filename URL: ", e); } Added: struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java?view=auto&rev=470495 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java (added) +++ struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java Thu Nov 2 11:57:00 2006 @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.context.enhanced; + +import junit.framework.TestCase; +import org.apache.tiles.TilesApplicationContext; +import org.easymock.EasyMock; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Vector; +import java.util.HashSet; + + +public class EnhancedTilesApplicationContextTest extends TestCase { + + private TilesApplicationContext root; + private EnhancedTilesApplicationContext context; + + public void setUp() { + root = EasyMock.createMock(TilesApplicationContext.class); + context = new EnhancedTilesApplicationContext(root); + } + + public void testGetResources() throws IOException { + ClassLoader original = Thread.currentThread().getContextClassLoader(); + try { + String url = "test.properties"; + HashSet<URL> set = new HashSet<URL>(); + URL u = new URL("file://tiles/test.properties"); + set.add(u); + EasyMock.expect(root.getResources(url)).andReturn(set); + EasyMock.replay(root); + Thread.currentThread().setContextClassLoader(new MockClassLoader()); + + assertEquals(4, context.getResources("test.properties").size()); + EasyMock.verify(root); + } + finally { + Thread.currentThread().setContextClassLoader(original); + } + } + + public class MockClassLoader extends ClassLoader { + + private Vector<URL> resources; + + public MockClassLoader() throws MalformedURLException { + resources = new Vector<URL>(); + resources.add(new URL("file://tiles/test/test.properties")); + resources.add(new URL("file://tiles/two/test.properties")); + resources.add(new URL("file://tiles/three/test.properties")); + } + + public Enumeration<URL> findResources(String path) { + return resources.elements(); + } + } + + +} Propchange: struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/context/enhanced/EnhancedTilesApplicationContextTest.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev