Bug 506460 - openConnection(URL u, Proxy p) is unsupported when multiple
frameworks are running

Change-Id: I44b31638002212d08a0a47bd4d9511d88420cc3b
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
index afd4648..6d631dd 100644
--- a/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Core OSGi Tests
 Bundle-SymbolicName: org.eclipse.osgi.tests;singleton:=true
-Bundle-Version: 3.11.1.qualifier
+Bundle-Version: 3.11.2.qualifier
 Bundle-ClassPath: osgitests.jar
 Bundle-Vendor: Eclipse.org
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.osgi.tests/bundles_src/geturl/geturl/Activator.java b/bundles/org.eclipse.osgi.tests/bundles_src/geturl/geturl/Activator.java
index 665c8e6..1a17503 100644
--- a/bundles/org.eclipse.osgi.tests/bundles_src/geturl/geturl/Activator.java
+++ b/bundles/org.eclipse.osgi.tests/bundles_src/geturl/geturl/Activator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2012 IBM Corporation and others.
+ * Copyright (c) 2010, 2016 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
@@ -10,8 +10,8 @@
  *******************************************************************************/
 package geturl;
 
-import java.net.MalformedURLException;
-import java.net.URL;
+import java.io.IOException;
+import java.net.*;
 import java.security.PrivilegedAction;
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -40,8 +40,13 @@
 					throw new RuntimeException("Could not create URL from parts: " + url);
 				}
 				url.toExternalForm();
-				return Boolean.TRUE;
 
+				try {
+					url.openConnection(Proxy.NO_PROXY);
+				} catch (IOException e) {
+					// expected since our impl throws this
+				}
+				return Boolean.TRUE;
 			}
 		}, props);
 	}
diff --git a/bundles/org.eclipse.osgi.tests/pom.xml b/bundles/org.eclipse.osgi.tests/pom.xml
index 832fa0b..7b01169 100644
--- a/bundles/org.eclipse.osgi.tests/pom.xml
+++ b/bundles/org.eclipse.osgi.tests/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.osgi</groupId>
   <artifactId>org.eclipse.osgi.tests</artifactId>
-  <version>3.11.1-SNAPSHOT</version>
+  <version>3.11.2-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 
   <properties>
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
index eca187e..db9f60e 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
@@ -1241,6 +1241,11 @@
 			throw new IOException();
 		}
 
+		@Override
+		public URLConnection openConnection(URL u, Proxy p) throws IOException {
+			throw new IOException();
+		}
+
 	}
 
 	public void testURLMultiplexing01() throws BundleException {
diff --git a/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF
index e587efa..e24123a 100644
--- a/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.osgi/META-INF/MANIFEST.MF
@@ -95,7 +95,7 @@
 Bundle-Description: %systemBundle
 Bundle-Copyright: %copyright
 Bundle-Vendor: %eclipse.org
-Bundle-Version: 3.10.102.qualifier
+Bundle-Version: 3.10.103.qualifier
 Bundle-Localization: systembundle
 Bundle-DocUrl: http://www.eclipse.org
 Eclipse-ExtensibleAPI: true
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/MultiplexingURLStreamHandler.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/MultiplexingURLStreamHandler.java
index e6eff45..428f3ba 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/MultiplexingURLStreamHandler.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/MultiplexingURLStreamHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2012 Cognos Incorporated, IBM Corporation and others.
+ * Copyright (c) 2006, 2016 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
@@ -11,10 +11,12 @@
 import java.io.IOException;
 import java.lang.reflect.*;
 import java.net.*;
+import java.net.Proxy;
 import org.eclipse.osgi.framework.log.FrameworkLogEntry;
 
 public class MultiplexingURLStreamHandler extends URLStreamHandler {
 	private static Method openConnectionMethod;
+	private static Method openConnectionProxyMethod;
 	private static Method equalsMethod;
 	private static Method getDefaultPortMethod;
 	private static Method getHostAddressMethod;
@@ -38,6 +40,9 @@
 			openConnectionMethod = URLStreamHandler.class.getDeclaredMethod("openConnection", new Class[] {URL.class}); //$NON-NLS-1$
 			openConnectionMethod.setAccessible(true);
 
+			openConnectionProxyMethod = URLStreamHandler.class.getDeclaredMethod("openConnection", new Class[] {URL.class, Proxy.class}); //$NON-NLS-1$
+			openConnectionProxyMethod.setAccessible(true);
+
 			equalsMethod = URLStreamHandler.class.getDeclaredMethod("equals", new Class[] {URL.class, URL.class}); //$NON-NLS-1$
 			equalsMethod.setAccessible(true);
 
@@ -104,6 +109,24 @@
 		throw new MalformedURLException();
 	}
 
+	@Override
+	protected URLConnection openConnection(URL url, Proxy proxy) throws IOException {
+		URLStreamHandler handler = findAuthorizedURLStreamHandler(protocol);
+		if (handler != null) {
+			try {
+				return (URLConnection) openConnectionProxyMethod.invoke(handler, new Object[] {url, proxy});
+			} catch (InvocationTargetException e) {
+				if (e.getTargetException() instanceof IOException)
+					throw (IOException) e.getTargetException();
+				throw (RuntimeException) e.getTargetException();
+			} catch (Exception e) {
+				factory.container.getLogServices().log(MultiplexingURLStreamHandler.class.getName(), FrameworkLogEntry.ERROR, "openConnection", e); //$NON-NLS-1$
+				throw new RuntimeException(e.getMessage(), e);
+			}
+		}
+		throw new MalformedURLException();
+	}
+
 	protected boolean equals(URL url1, URL url2) {
 		URLStreamHandler handler = findAuthorizedURLStreamHandler(protocol);
 		if (handler != null) {
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/URLStreamHandlerProxy.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/URLStreamHandlerProxy.java
index d6351e1..1451ac1 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/URLStreamHandlerProxy.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/url/URLStreamHandlerProxy.java
@@ -224,6 +224,7 @@
 	protected URLConnection openConnection(URL u, Proxy p) throws IOException {
 		try {
 			Method openConn = realHandlerService.getClass().getMethod("openConnection", new Class[] {URL.class, Proxy.class}); //$NON-NLS-1$
+			openConn.setAccessible(true);
 			return (URLConnection) openConn.invoke(realHandlerService, new Object[] {u, p});
 		} catch (InvocationTargetException e) {
 			if (e.getTargetException() instanceof IOException)
diff --git a/bundles/org.eclipse.osgi/pom.xml b/bundles/org.eclipse.osgi/pom.xml
index b70a6ec..f1084ae 100644
--- a/bundles/org.eclipse.osgi/pom.xml
+++ b/bundles/org.eclipse.osgi/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.osgi</groupId>
   <artifactId>org.eclipse.osgi</artifactId>
-  <version>3.10.102-SNAPSHOT</version>
+  <version>3.10.103-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>