blob: b7dadfcd57becfd5eca824490467c0cd4b89c3e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Cognos Incorporated, IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.osgi.framework.internal.protocol;
import java.io.IOException;
import java.lang.reflect.*;
import java.net.*;
import org.eclipse.osgi.framework.internal.core.Framework;
import org.eclipse.osgi.framework.log.FrameworkLogEntry;
public class MultiplexingURLStreamHandler extends URLStreamHandler {
private static Method openConnectionMethod;
private static Method equalsMethod;
private static Method getDefaultPortMethod;
private static Method getHostAddressMethod;
private static Method hashCodeMethod;
private static Method hostsEqualMethod;
private static Method parseURLMethod;
private static Method sameFileMethod;
private static Method setURLMethod;
private static Method toExternalFormMethod;
private static Field handlerField;
private static boolean methodsInitialized = false;
private String protocol;
private StreamHandlerFactory factory;
private static synchronized void initializeMethods(StreamHandlerFactory factory) {
if (methodsInitialized)
return;
try {
openConnectionMethod = URLStreamHandler.class.getDeclaredMethod("openConnection", new Class[] {URL.class}); //$NON-NLS-1$
openConnectionMethod.setAccessible(true);
equalsMethod = URLStreamHandler.class.getDeclaredMethod("equals", new Class[] {URL.class, URL.class}); //$NON-NLS-1$
equalsMethod.setAccessible(true);
getDefaultPortMethod = URLStreamHandler.class.getDeclaredMethod("getDefaultPort", null); //$NON-NLS-1$
getDefaultPortMethod.setAccessible(true);
getHostAddressMethod = URLStreamHandler.class.getDeclaredMethod("getHostAddress", new Class[] {URL.class}); //$NON-NLS-1$
getHostAddressMethod.setAccessible(true);
hashCodeMethod = URLStreamHandler.class.getDeclaredMethod("hashCode", new Class[] {URL.class}); //$NON-NLS-1$
hashCodeMethod.setAccessible(true);
hostsEqualMethod = URLStreamHandler.class.getDeclaredMethod("hostsEqual", new Class[] {URL.class, URL.class}); //$NON-NLS-1$
hostsEqualMethod.setAccessible(true);
parseURLMethod = URLStreamHandler.class.getDeclaredMethod("parseURL", new Class[] {URL.class, String.class, Integer.TYPE, Integer.TYPE}); //$NON-NLS-1$
parseURLMethod.setAccessible(true);
sameFileMethod = URLStreamHandler.class.getDeclaredMethod("sameFile", new Class[] {URL.class, URL.class}); //$NON-NLS-1$
sameFileMethod.setAccessible(true);
setURLMethod = URLStreamHandler.class.getDeclaredMethod("setURL", new Class[] {URL.class, String.class, String.class, Integer.TYPE, String.class, String.class, String.class, String.class, String.class}); //$NON-NLS-1$
setURLMethod.setAccessible(true);
toExternalFormMethod = URLStreamHandler.class.getDeclaredMethod("toExternalForm", new Class[] {URL.class}); //$NON-NLS-1$
toExternalFormMethod.setAccessible(true);
try {
handlerField = URL.class.getDeclaredField("handler"); //$NON-NLS-1$
} catch (NoSuchFieldException e) {
handlerField = Framework.getField(URL.class, URLStreamHandler.class, true);
if (handlerField == null)
throw e;
}
handlerField.setAccessible(true);
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "initializeMethods", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
methodsInitialized = true;
}
public MultiplexingURLStreamHandler(String protocol, StreamHandlerFactory factory) {
this.protocol = protocol;
this.factory = factory;
initializeMethods(factory);
}
protected URLConnection openConnection(URL url) throws IOException {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return (URLConnection) openConnectionMethod.invoke(handler, new Object[] {url});
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof IOException)
throw (IOException) e.getTargetException();
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "openConnection", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new MalformedURLException();
}
protected boolean equals(URL url1, URL url2) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return ((Boolean) equalsMethod.invoke(handler, new Object[] {url1, url2})).booleanValue();
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "equals", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected int getDefaultPort() {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return ((Integer) getDefaultPortMethod.invoke(handler, null)).intValue();
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "getDefaultPort", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected InetAddress getHostAddress(URL url) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return (InetAddress) getHostAddressMethod.invoke(handler, new Object[] {url});
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "hashCode", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected int hashCode(URL url) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return ((Integer) hashCodeMethod.invoke(handler, new Object[] {url})).intValue();
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "hashCode", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected boolean hostsEqual(URL url1, URL url2) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return ((Boolean) hostsEqualMethod.invoke(handler, new Object[] {url1, url2})).booleanValue();
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "hostsEqual", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected void parseURL(URL arg0, String arg1, int arg2, int arg3) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
// set the real handler for the URL
handlerField.set(arg0, handler);
parseURLMethod.invoke(handler, new Object[] {arg0, arg1, new Integer(arg2), new Integer(arg3)});
return;
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "parseURL", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected boolean sameFile(URL url1, URL url2) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return ((Boolean) sameFileMethod.invoke(handler, new Object[] {url1, url2})).booleanValue();
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "sameFile", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected void setURL(URL arg0, String arg1, String arg2, int arg3, String arg4, String arg5, String arg6, String arg7, String arg8) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
// set the real handler for the URL
handlerField.set(arg0, handler);
setURLMethod.invoke(handler, new Object[] {arg0, arg1, arg2, new Integer(arg3), arg4, arg5, arg6, arg7, arg8});
return;
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "setURL", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
protected String toExternalForm(URL url) {
URLStreamHandler handler = factory.findAuthorizedURLStreamHandler(protocol);
if (handler != null) {
try {
return (String) toExternalFormMethod.invoke(handler, new Object[] {url});
} catch (InvocationTargetException e) {
throw (RuntimeException) e.getTargetException();
} catch (Exception e) {
factory.adaptor.getFrameworkLog().log(new FrameworkLogEntry(MultiplexingURLStreamHandler.class.getName(), "toExternalForm", FrameworkLogEntry.ERROR, e, null)); //$NON-NLS-1$
throw new RuntimeException(e.getMessage(), e);
}
}
throw new IllegalStateException();
}
}