RFR JDK-4880778

John Zavgren john.zavgren at oracle.com
Mon Feb 4 09:24:34 PST 2013


Chris:
I made the documentation change:
http://cr.openjdk.java.net/~jzavgren/4880778/webrev.03/

John
----- Original Message -----
From: chris.hegarty at oracle.com
To: john.zavgren at oracle.com
Cc: net-dev at openjdk.java.net
Sent: Monday, February 4, 2013 11:19:42 AM GMT -05:00 US/Canada Eastern
Subject: Re: RFR JDK-4880778

Thanks John,

Trivially, and unrelated to your changes but while you're there, I would 
really like to remove "are supposed to".

< * Only classes derived from URLStreamHandler are supposed to be able
< * to use this method to set the values of the URL fields.
---
 > * Only classes derived from URLStreamHandler are able to use this
 > * method to set the values of the URL fields.

It is still not great, but I think the best we can do with an old API.

-Chris.

On 04/02/2013 14:00, John Zavgren wrote:
> I posted a new webrev image:
> http://cr.openjdk.java.net/~jzavgren/4880778/webrev.02/
>
> I made two changes:
> 1.) modified the indentation that's used for the argument list of the URL class set() methods.
> 2.) changed the documentation for the set method in the URLStreamHandler class.
>
>
> ----- Original Message -----
> From: john.zavgren at oracle.com
> To: net-dev at openjdk.java.net
> Sent: Saturday, February 2, 2013 9:47:31 AM GMT -05:00 US/Canada Eastern
> Subject: RFR JDK-4880778
>
> Greetings:
>
> Please consider the following modification of our classes for handling URLs.
>
> http://cr.openjdk.java.net/~jzavgren/4880778/webrev.01/
>
> ---- background ----
> See http://java.sun.com/j2se/1.4.2/docs/api/java/net/URL.html.
> The URL class is declared final yet has two protected methods:
>
> protected void set(String protocol,
>                     String host,
>                     int port,
>                     String file,
>                     String ref)
>
> protected void set(String protocol,
>                     String host,
>                     int port,
>                     String authority,
>                     String userInfo,
>                     String path,
>                     String query,
>                     String ref)
>
>
> Since the final class can't be subclassed these methods can't be accessed.
> They could be package protected instead. (i.e. no access specifier)
> --------------------
> Solution:
> 1.) I made the set method in the URL class "package protected"
> 2.) I edited the java doc documentation to eliminate reference to the set method in the URL class from the URLStreamHandler class
>
> 3.) I wrote a test program (URLTest.java) (at the end of this message) that attempts to call the set method from a URL object...
> When there is no package statement:
>
> //package java.net;
>
> the compilation fails
> java/net/URLTest.java:28: error: set(String,String,int,String,String,String,String,String) is not public in URL; cannot be accessed from outside package
>      myURL.set("ftp", "vpn.zavgren.com", 77, "lugnut.txt", "","","","");
>           ^
> 1 error
> 4.) When there is a package statement in the source code:
>
> package java.net;
>
> the code compiles but it creates a run time error.
> jzavgren at ubuntuVM:~/code/java/URL$ java java.net.URLTest
> Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.net
>          at java.lang.ClassLoader.preDefineClass(ClassLoader.java:651)
>          at java.lang.ClassLoader.defineClass(ClassLoader.java:785)
>          at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>          at java.net.URLClassLoader.defineClass(URLClassLoader.java:442)
>          at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
>          at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
>          at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
>          at java.security.AccessController.doPrivileged(Native Method)
>          at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
>          at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
>          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
>          at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
>          at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:491)
> ----- URLTest.java -----
> package java.net;
> import java.net.*;
> import java.io.*;
> public class URLTest
> {
>    public static void main (String[]args)
>    {
>      URL myURL=null;
>        try
>      {
>        myURL = new URL ("http", "www.zavgren.com", 80, "/index.html");
>      }
>      catch (MalformedURLException mfue)
>      {
>        System.err.println (mfue);
>      }
>      System.out.printf ("The URL is: %s\n", myURL.toString ());
>      System.out.printf ("The protocol is: %s\n", myURL.getProtocol());
>      System.out.printf ("The external form is: %s\n", myURL.toExternalForm());
>      System.out.printf ("Opening connection... \n");
>      try
>      {
>      URLConnection uc = myURL.openConnection();
>      }
>      catch (IOException io)
>      {
>      }
>      myURL.set("ftp", "vpn.zavgren.com", 77, "lugnut.txt", "","","","");
>    }
> };
>
> ------------------------
> Thanks!
> John



More information about the net-dev mailing list