Harmony
  1. Harmony
  2. HARMONY-6059

[classlib][luni] jar URL is created with wrong protocol for URLStreamHandler

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 5.0M9
    • Component/s: None
    • Labels:
      None
    • Patch Info:
      Patch Available

      Description

      From the spec: "Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be downloaded and opened as needed".
      So what I have done follows:
      1. specified the URLStreamHandler to the jar, not the protocol as before
      2. Add the test case to the test-impl
      3. Because the I have add the a class file to the lf.jar, the size of jar file is increased. So the test size case int the JarURLConnectionTest fail. I have changed the test case.
      4. The reason that the vm above java6 is required is because the class file I have added to the lf.jar is compiled under the java 6.

      1. HARMONY-6059v2.diff
        4 kB
        Li Jing Qin
      2. lf.jar
        33 kB
        Li Jing Qin
      3. HARMONY-6059.diff
        5 kB
        Li Jing Qin

        Activity

        Hide
        Nathan Beyer added a comment -

        I've commited my changes at r735873.

        I refined it a bit further so as to eliminate the package name massaging.

        Show
        Nathan Beyer added a comment - I've commited my changes at r735873. I refined it a bit further so as to eliminate the package name massaging.
        Hide
        Li Jing Qin added a comment -

        Thanks Nathan. The test case looks fine.

        Show
        Li Jing Qin added a comment - Thanks Nathan. The test case looks fine.
        Hide
        Nathan Beyer added a comment -

        I've reworked the test a little bit and I think it's more reliable and clean. Here's what the new test method would look like. It works on Windows and I'll test it on Linux a bit later. Let me know what you guys think.

        public void test_Constructor$Ljava_net_URLLjava_lang_ClassLoaderLjava_net_URLStreamHandlerFactory() throws Exception {
        class TestFactory implements URLStreamHandlerFactory {
        public URLStreamHandler createURLStreamHandler(String protocol) {
        if ("jar".equals(protocol))

        { return new Handler(); }

        fail("Should be jar Handler. But " + protocol);
        return null;
        }

        }

        final String base = getClass().getClassLoader().getResource(
        "../" + getClass().getPackage().getName().replace('.', '/')).toExternalForm();

        final URL[] urls =

        { new URL(base + "/lf.jar") }

        ;
        final URLClassLoader ucl = new URLClassLoader(urls, null, new TestFactory());

        final URL res = ucl.findResource("swt.dll");
        assertNotNull(res);

        final URI e = new URI("jar:" + base + "/lf.jar!/swt.dll");
        final URI a = res.toURI();
        assertEquals(e, a);
        }

        Show
        Nathan Beyer added a comment - I've reworked the test a little bit and I think it's more reliable and clean. Here's what the new test method would look like. It works on Windows and I'll test it on Linux a bit later. Let me know what you guys think. public void test_Constructor$Ljava_net_URLLjava_lang_ClassLoaderLjava_net_URLStreamHandlerFactory() throws Exception { class TestFactory implements URLStreamHandlerFactory { public URLStreamHandler createURLStreamHandler(String protocol) { if ("jar".equals(protocol)) { return new Handler(); } fail("Should be jar Handler. But " + protocol); return null; } } final String base = getClass().getClassLoader().getResource( "../" + getClass().getPackage().getName().replace('.', '/')).toExternalForm(); final URL[] urls = { new URL(base + "/lf.jar") } ; final URLClassLoader ucl = new URLClassLoader(urls, null, new TestFactory()); final URL res = ucl.findResource("swt.dll"); assertNotNull(res); final URI e = new URI("jar:" + base + "/lf.jar!/swt.dll"); final URI a = res.toURI(); assertEquals(e, a); }
        Hide
        Nathan Beyer added a comment -

        Did anyone try the new test that was added with this patch on a Windows OS?

        I'm getting a failure from the following line -
        assertEquals("Failed", BASE.toString()SEP"lf.jar!"SEP"swt.dll", res.getFile());

        The error message is as follows -
        Failed expected:<...5Ctests%5Cjava%5Cnet[\lf.jar!]swt.dll> but was:<...5Ctests%5Cjava%5Cnet[/lf.jar!/]swt.dll>

        The field 'res' is a java.net.URL, so wouldn't the path separator's be normalized to '/', instead of the OS-specific separator?

        Show
        Nathan Beyer added a comment - Did anyone try the new test that was added with this patch on a Windows OS? I'm getting a failure from the following line - assertEquals("Failed", BASE.toString() SEP "lf.jar!" SEP "swt.dll", res.getFile()); The error message is as follows - Failed expected:<...5Ctests%5Cjava%5Cnet[\lf.jar!]swt.dll> but was:<...5Ctests%5Cjava%5Cnet [/lf.jar!/] swt.dll> The field 'res' is a java.net.URL, so wouldn't the path separator's be normalized to '/', instead of the OS-specific separator?
        Hide
        Jimmy, Jing Lv added a comment -

        Looks fine. I've commited at r732281, please verify.

        Show
        Jimmy, Jing Lv added a comment - Looks fine. I've commited at r732281, please verify.
        Hide
        Li Jing Qin added a comment -

        Thanks jimmy. Here is the new diff. Remove some uneccessary things.

        Show
        Li Jing Qin added a comment - Thanks jimmy. Here is the new diff. Remove some uneccessary things.
        Hide
        Jimmy, Jing Lv added a comment -

        As this is the trunk of Harmony 5, please use java 5 version classes.

        Show
        Jimmy, Jing Lv added a comment - As this is the trunk of Harmony 5, please use java 5 version classes.

          People

          • Assignee:
            Nathan Beyer
            Reporter:
            Li Jing Qin
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development