//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.webapp;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
public class WebAppClassLoaderUrlStreamTest extends WebAppClassLoaderTest
{
public static class URLHandlers implements URLStreamHandlerFactory
{
private static final String[] STREAM_HANDLER_PREFIXES;
static
{
STREAM_HANDLER_PREFIXES = new String[]{
"sun.net.www.protocol",
"org.apache.harmony.luni.internal.net.www.protocol",
"javax.net.ssl"
};
}
private Map<String, URLStreamHandler> handlers = new HashMap<>();
private ClassLoader loader;
public URLHandlers(ClassLoader loader)
{
this.loader = loader;
}
private URLStreamHandler getBuiltInHandler(String protocol, ClassLoader classLoader)
{
URLStreamHandler handler = handlers.get(protocol);
if (handler == null)
{
for (String prefix : STREAM_HANDLER_PREFIXES)
{
String className = prefix + '.' + protocol + ".Handler";
try
{
Class<?> clazz = Class.forName(className, false, classLoader);
handler = (URLStreamHandler) clazz.newInstance();
break;
}
catch (Exception ignore)
{
ignore.printStackTrace(System.err);
}
}
if (handler != null)
{
handlers.put(protocol, handler);
}
}
if (handler == null)
{
throw new RuntimeException("Unable to find handler for protocol [" + protocol + "]");
}
return handler;
}
@Override
public URLStreamHandler createURLStreamHandler(String protocol)
{
try
{
return getBuiltInHandler(protocol, loader);
}
catch (Exception e)
{
throw new RuntimeException("Unable to create URLStreamHandler for protocol [" + protocol + "]");
}
}
}
@After
public void cleanupURLStreamHandlerFactory()
{
URLStreamHandlerUtil.setFactory(null);
}
@Before
public void init() throws Exception
{
super.init();
URLStreamHandlerUtil.setFactory(new URLHandlers(_loader));
}
}