diff -r e12ef8061554 o.n.core/arch.xml --- a/o.n.core/arch.xml Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/arch.xml Mon Mar 12 15:45:13 2012 +0100 @@ -482,6 +482,16 @@ org.netbeans.core.Bundle to say USE_Authentication=false + + Some applications may want to proxy connections to + localhost (which by default uses direct connection in NetBeans Platform). + One can change the default by branding + org.netbeans.core.Bundle + specify something else than StaticNonProxyHosts=localhost|127.0.0.1. +

diff -r e12ef8061554 o.n.core/src/org/netbeans/core/Bundle.properties --- a/o.n.core/src/org/netbeans/core/Bundle.properties Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/src/org/netbeans/core/Bundle.properties Mon Mar 12 15:45:13 2012 +0100 @@ -185,3 +185,6 @@ # NOI18N TimableEventQueue.install=true + +# NOI18N +StaticNonProxyHosts=localhost|127.0.0.1 diff -r e12ef8061554 o.n.core/src/org/netbeans/core/GuiRunLevel.java --- a/o.n.core/src/org/netbeans/core/GuiRunLevel.java Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/src/org/netbeans/core/GuiRunLevel.java Mon Mar 12 15:45:13 2012 +0100 @@ -92,7 +92,7 @@ Splash.getInstance().increment(10); // install java.net.ProxySelector - java.net.ProxySelector.setDefault (new NbProxySelector ()); + NbProxySelector.register(); if (CLIOptions.isGui()) { //--------------------------------------------------------------------------------------------------------- diff -r e12ef8061554 o.n.core/src/org/netbeans/core/NbProxySelector.java --- a/o.n.core/src/org/netbeans/core/NbProxySelector.java Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/src/org/netbeans/core/NbProxySelector.java Mon Mar 12 15:45:13 2012 +0100 @@ -71,18 +71,13 @@ */ public final class NbProxySelector extends ProxySelector { - private ProxySelector original = null; + private final ProxySelector original; private static final Logger LOG = Logger.getLogger (NbProxySelector.class.getName ()); private static Object useSystemProxies; /** Creates a new instance of NbProxySelector */ - public NbProxySelector () { - original = ProxySelector.getDefault (); - if (original == null) { - LOG.warning ("No default system ProxySelector was found thus NetBeans ProxySelector won't delegate on it"); - } else { - LOG.fine ("Override the original ProxySelector: " + original); - } + private NbProxySelector (ProxySelector delegate) { + original = delegate; LOG.fine ("java.net.useSystemProxies has been set to " + useSystemProxies ()); LOG.fine ("In launcher was detected netbeans.system_http_proxy: " + System.getProperty ("netbeans.system_http_proxy", "N/A")); LOG.fine ("In launcher was detected netbeans.system_socks_proxy: " + System.getProperty ("netbeans.system_socks_proxy", "N/A")); @@ -90,6 +85,20 @@ copySettingsToSystem (); } + static ProxySelector create(ProxySelector delegate) { + return new NbProxySelector(delegate); + } + + static void register() { + ProxySelector prev = ProxySelector.getDefault(); + if (prev == null) { + LOG.warning("No default system ProxySelector was found thus NetBeans ProxySelector won't delegate on it"); + } else { + LOG.log(Level.FINE, "Override the original ProxySelector: {0}", prev); + } + ProxySelector.setDefault(create(prev)); + } + @Override public List select(URI uri) { List res = new ArrayList (); diff -r e12ef8061554 o.n.core/src/org/netbeans/core/ProxySettings.java --- a/o.n.core/src/org/netbeans/core/ProxySettings.java Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/src/org/netbeans/core/ProxySettings.java Mon Mar 12 15:45:13 2012 +0100 @@ -352,13 +352,35 @@ return getModifiedNonProxyHosts (getSystemNonProxyHosts ()); } + + private static String concatProxies(String... proxies) { + StringBuilder sb = new StringBuilder(); + for (String n : proxies) { + if (n == null) { + continue; + } + n = n.trim(); + if (n.isEmpty()) { + continue; + } + if (sb.length() > 0 && sb.charAt(sb.length() - 1) != '|') { + if (!n.startsWith("|")) { + sb.append('|'); + } + } + sb.append(n); + } + return sb.toString(); + } + private static String getModifiedNonProxyHosts (String systemPreset) { String fromSystem = systemPreset.replaceAll (";", "|").replaceAll (",", "|"); //NOI18N String fromUser = getPresetNonProxyHosts () == null ? "" : getPresetNonProxyHosts ().replaceAll (";", "|").replaceAll (",", "|"); //NOI18N if (Utilities.isWindows ()) { fromSystem = addReguralToNonProxyHosts (fromSystem); } - String nonProxy = fromUser + (fromUser.length () == 0 ? "" : "|") + fromSystem + (fromSystem.length () == 0 ? "" : "|") + "localhost|127.0.0.1"; // NOI18N + final String staticNonProxyHosts = NbBundle.getMessage(ProxySettings.class, "StaticNonProxyHosts"); // NOI18N + String nonProxy = concatProxies(fromUser, fromSystem, staticNonProxyHosts); // NOI18N String localhost = ""; // NOI18N try { localhost = InetAddress.getLocalHost().getHostName(); diff -r e12ef8061554 o.n.core/test/unit/src/org/netbeans/core/Bundle_te_ST.properties --- a/o.n.core/test/unit/src/org/netbeans/core/Bundle_te_ST.properties Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/test/unit/src/org/netbeans/core/Bundle_te_ST.properties Mon Mar 12 15:45:13 2012 +0100 @@ -40,3 +40,4 @@ # NOI18N TimableEventQueue.install=false +StaticNonProxyHosts= diff -r e12ef8061554 o.n.core/test/unit/src/org/netbeans/core/CanProxyToLocalhostTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/o.n.core/test/unit/src/org/netbeans/core/CanProxyToLocalhostTest.java Mon Mar 12 15:45:13 2012 +0100 @@ -0,0 +1,113 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ + +package org.netbeans.core; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.SocketAddress; +import java.net.URI; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Locale; +import org.netbeans.junit.NbTestCase; +import org.openide.util.NetworkSettings; +import org.openide.util.lookup.ServiceProvider; + +/** Check whether we can proxy to localhost. + */ +public class CanProxyToLocalhostTest extends NbTestCase { + private static String USER_PROXY_HOST = "my.webcache"; + private static int USER_PROXY_PORT = 8080; + + private ProxySelector selector; + private static URI TO_LOCALHOST; + private static URI TO_NB; + private MyPS myPS; + + public CanProxyToLocalhostTest (String name) { + super (name); + } + + @Override + protected void setUp () throws Exception { + myPS = new MyPS(); + selector = NbProxySelector.create(myPS); + TO_LOCALHOST = new URI ("http://localhost"); + TO_NB = new URI ("http://netbeans.org"); + } + + public void testNoProxyForLocalhost() { + Locale.setDefault(Locale.US); + assertEquals ("Connect TO_LOCALHOST DIRECT.", "DIRECT", selector.select (TO_LOCALHOST).get(0).toString()); + } + public void testProxyForLocalhost() { + Locale.setDefault(new Locale("te", "ST")); + assertEquals ("Connect TO_LOCALHOST provided by MyPS", "HTTP @ my.webcache:8080", selector.select (TO_LOCALHOST).get(0).toString()); + assertEquals("One call to my ps", 1, myPS.called); + } + public void testAlwaysProxyForNonLocalhost() { + Locale.setDefault(Locale.US); + assertEquals ("Connect TO_LOCALHOST DIRECT.", "HTTP @ my.webcache:8080", selector.select (TO_NB).get(0).toString()); + assertEquals("One call to my ps", 1, myPS.called); + } + + private static class MyPS extends ProxySelector { + int called; + + @Override + public List select(URI uri) { + called++; + return Collections.singletonList(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(USER_PROXY_HOST, USER_PROXY_PORT))); + } + + @Override + public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { + } + } +} diff -r e12ef8061554 o.n.core/test/unit/src/org/netbeans/core/HttpSettingsTest.java --- a/o.n.core/test/unit/src/org/netbeans/core/HttpSettingsTest.java Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/test/unit/src/org/netbeans/core/HttpSettingsTest.java Mon Mar 12 15:45:13 2012 +0100 @@ -98,7 +98,7 @@ protected void setUp () throws Exception { super.setUp (); System.setProperty ("http.nonProxyHosts", NETBEANS_ORG + ',' + NETBEANS_ORG); - ProxySelector.setDefault (new NbProxySelector ()); + NbProxySelector.register(); proxyPreferences = NbPreferences.root ().node ("/org/netbeans/core"); proxyPreferences.addPreferenceChangeListener (new PreferenceChangeListener() { public void preferenceChange(PreferenceChangeEvent arg0) { diff -r e12ef8061554 o.n.core/test/unit/src/org/netbeans/core/NonProxyHostsTest.java --- a/o.n.core/test/unit/src/org/netbeans/core/NonProxyHostsTest.java Fri Mar 09 23:54:05 2012 +0100 +++ b/o.n.core/test/unit/src/org/netbeans/core/NonProxyHostsTest.java Mon Mar 12 15:45:13 2012 +0100 @@ -90,7 +90,7 @@ System.setProperty ("netbeans.system_socks_proxy", SYSTEM_PROXY_HOST + ":" + SYSTEM_PROXY_PORT); System.setProperty ("netbeans.system_http_non_proxy_hosts", "*.other.org"); System.setProperty ("http.nonProxyHosts", "*.netbeans.org"); - ProxySelector.setDefault (new NbProxySelector ()); + NbProxySelector.register(); selector = ProxySelector.getDefault (); proxyPreferences = NbPreferences.root ().node ("/org/netbeans/core"); proxyPreferences.addPreferenceChangeListener (new PreferenceChangeListener () {