Author: markt Date: Sun Mar 6 22:12:10 2011 New Revision: 1078601 URL: http://svn.apache.org/viewvc?rev=1078601&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=26701 Provide a mechanism for users to register their own URLStreamHandlerFactory objects.
Added: tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java tomcat/trunk/java/org/apache/naming/resources/Constants.java tomcat/trunk/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java?rev=1078601&r1=1078600&r2=1078601&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java Sun Mar 6 22:12:10 2011 @@ -559,7 +559,7 @@ public class WebappLoader extends Lifecy // Register a stream handler factory for the JNDI protocol URLStreamHandlerFactory streamHandlerFactory = - new DirContextURLStreamHandlerFactory(); + DirContextURLStreamHandlerFactory.getInstance(); if (first) { first = false; try { Modified: tomcat/trunk/java/org/apache/naming/resources/Constants.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/Constants.java?rev=1078601&r1=1078600&r2=1078601&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/naming/resources/Constants.java (original) +++ tomcat/trunk/java/org/apache/naming/resources/Constants.java Sun Mar 6 22:12:10 2011 @@ -24,13 +24,5 @@ package org.apache.naming.resources; */ public final class Constants { - - public static final String PROTOCOL_HANDLER_VARIABLE = - "java.protocol.handler.pkgs"; - public static final String Package = "org.apache.naming.resources"; - - // Default namespace name - public static final String DEFAULT_NAMESPACE = "DAV:"; - } Modified: tomcat/trunk/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java?rev=1078601&r1=1078600&r2=1078601&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java (original) +++ tomcat/trunk/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java Sun Mar 6 22:12:10 2011 @@ -19,32 +19,38 @@ package org.apache.naming.resources; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; /** - * Factory for Stream handlers to a JNDI directory context. + * Factory for Stream handlers to a JNDI directory context that also supports + * users specifying additional stream handler. * * @author <a href="mailto:r...@apache.org">Remy Maucherat</a> * @version $Revision$ */ -public class DirContextURLStreamHandlerFactory - implements URLStreamHandlerFactory { +public class DirContextURLStreamHandlerFactory + implements URLStreamHandlerFactory { - - // ----------------------------------------------------------- Constructors - - - public DirContextURLStreamHandlerFactory() { - // NOOP + // Singleton + private static DirContextURLStreamHandlerFactory instance = + new DirContextURLStreamHandlerFactory(); + + public static DirContextURLStreamHandlerFactory getInstance() { + return instance; + } + + public static void addUserFactory(URLStreamHandlerFactory factory) { + instance.userFactories.add(factory); + } + + + private List<URLStreamHandlerFactory> userFactories = + new CopyOnWriteArrayList<URLStreamHandlerFactory>(); + + private DirContextURLStreamHandlerFactory() { + // Hide the default constructor } - - - // ----------------------------------------------------- Instance Variables - - - // ------------------------------------------------------------- Properties - - - // ---------------------------------------- URLStreamHandlerFactory Methods /** @@ -60,6 +66,13 @@ public class DirContextURLStreamHandlerF if (protocol.equals("jndi")) { return new DirContextURLStreamHandler(); } else { + for (URLStreamHandlerFactory factory : userFactories) { + URLStreamHandler handler = + factory.createURLStreamHandler(protocol); + if (handler != null) { + return handler; + } + } return null; } } Added: tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java?rev=1078601&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java (added) +++ tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java Sun Mar 6 22:12:10 2011 @@ -0,0 +1,78 @@ +/* + * 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.naming.resources; + +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLStreamHandler; +import java.net.URLStreamHandlerFactory; + +import junit.framework.TestCase; + +public class TestDirContextURLStreamHandlerFactory extends TestCase { + + public void testUserSuppliedFactory() throws Exception { + + URL url = null; + + // Initially unknown + try { + url = new URL("foo://www.apache.org"); + } catch (MalformedURLException ignore) { + // Ignore + } + assertNull(url); + + // Set the factory + URL.setURLStreamHandlerFactory( + DirContextURLStreamHandlerFactory.getInstance()); + + // Still unknown + try { + url = new URL("foo://www.apache.org"); + } catch (MalformedURLException ignore) { + // Ignore + } + assertNull(url); + + // Register a user factory + DirContextURLStreamHandlerFactory.addUserFactory( + new FooURLStreamHandlerFactory()); + + // Now it works + try { + url = new URL("foo://www.apache.org"); + } catch (MalformedURLException ignore) { + // Ignore + } + assertNotNull(url); + } + + public static class FooURLStreamHandlerFactory + implements URLStreamHandlerFactory { + + @Override + public URLStreamHandler createURLStreamHandler(String protocol) { + if ("foo".equals(protocol)) { + // This is good enough for this test but not for actual use + return new DirContextURLStreamHandler(); + } else { + return null; + } + } + } +} Propchange: tomcat/trunk/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1078601&r1=1078600&r2=1078601&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Sun Mar 6 22:12:10 2011 @@ -46,6 +46,10 @@ <subsection name="Catalina"> <changelog> <fix> + <bug>26701</bug>: Provide a mechanism for users to register their own + <code>URLStreamHandlerFactory</code> objects. (markt) + </fix> + <fix> <bug>50855</bug>: Fix NPE on HttpServletRequest.logout() when debug logging is enabled. (markt) </fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org