From: markt Date: Sun, 6 Mar 2011 22:12:10 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=26701 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=e38e3aac341ca509d1fed0d7e78ff55005d751bd;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=26701 Provide a mechanism for users to register their own URLStreamHandlerFactory objects. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1078601 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/loader/WebappLoader.java b/java/org/apache/catalina/loader/WebappLoader.java index 446c1dc69..9bd5a7f22 100644 --- a/java/org/apache/catalina/loader/WebappLoader.java +++ b/java/org/apache/catalina/loader/WebappLoader.java @@ -559,7 +559,7 @@ public class WebappLoader extends LifecycleMBeanBase // Register a stream handler factory for the JNDI protocol URLStreamHandlerFactory streamHandlerFactory = - new DirContextURLStreamHandlerFactory(); + DirContextURLStreamHandlerFactory.getInstance(); if (first) { first = false; try { diff --git a/java/org/apache/naming/resources/Constants.java b/java/org/apache/naming/resources/Constants.java index dd004e415..48d21a376 100644 --- a/java/org/apache/naming/resources/Constants.java +++ b/java/org/apache/naming/resources/Constants.java @@ -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:"; - } diff --git a/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java b/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java index 54f9da88c..8886a8e00 100644 --- a/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java +++ b/java/org/apache/naming/resources/DirContextURLStreamHandlerFactory.java @@ -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 Remy Maucherat * @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 userFactories = + new CopyOnWriteArrayList(); + + private DirContextURLStreamHandlerFactory() { + // Hide the default constructor } - - - // ----------------------------------------------------- Instance Variables - - - // ------------------------------------------------------------- Properties - - - // ---------------------------------------- URLStreamHandlerFactory Methods /** @@ -60,6 +66,13 @@ public class DirContextURLStreamHandlerFactory if (protocol.equals("jndi")) { return new DirContextURLStreamHandler(); } else { + for (URLStreamHandlerFactory factory : userFactories) { + URLStreamHandler handler = + factory.createURLStreamHandler(protocol); + if (handler != null) { + return handler; + } + } return null; } } diff --git a/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java b/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java new file mode 100644 index 000000000..eda3f964c --- /dev/null +++ b/test/org/apache/naming/resources/TestDirContextURLStreamHandlerFactory.java @@ -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; + } + } + } +} diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index d5641f802..1f58b10c7 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -46,6 +46,10 @@ + 26701: Provide a mechanism for users to register their own + URLStreamHandlerFactory objects. (markt) + + 50855: Fix NPE on HttpServletRequest.logout() when debug logging is enabled. (markt)