Can read resources as streams
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 10 Jan 2013 20:15:11 +0100
changeset 424aef4fd91e99c
parent 423 9b5868bf56ec
child 425 af1d8e828955
Can read resources as streams
emul/src/main/java/java/lang/Class.java
vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/main/java/org/apidesign/vm4brwsr/VM.java
vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ResourcesTest.java
vmtest/src/test/resources/org/apidesign/bck2brwsr/tck/Resources.txt
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Thu Jan 10 13:09:19 2013 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Thu Jan 10 20:15:11 2013 +0100
     1.3 @@ -25,6 +25,7 @@
     1.4  
     1.5  package java.lang;
     1.6  
     1.7 +import java.io.ByteArrayInputStream;
     1.8  import org.apidesign.bck2brwsr.emul.AnnotationImpl;
     1.9  import java.io.InputStream;
    1.10  import java.lang.annotation.Annotation;
    1.11 @@ -881,13 +882,14 @@
    1.12       */
    1.13       public InputStream getResourceAsStream(String name) {
    1.14          name = resolveName(name);
    1.15 -        ClassLoader cl = getClassLoader0();
    1.16 -        if (cl==null) {
    1.17 -            // A system class.
    1.18 -            return ClassLoader.getSystemResourceAsStream(name);
    1.19 -        }
    1.20 -        return cl.getResourceAsStream(name);
    1.21 -    }
    1.22 +        byte[] arr = getResourceAsStream0(name);
    1.23 +        return arr == null ? null : new ByteArrayInputStream(arr);
    1.24 +     }
    1.25 +     
    1.26 +     @JavaScriptBody(args = "name", body = 
    1.27 +         "return (vm.loadBytes) ? vm.loadBytes(name) : null;"
    1.28 +     )
    1.29 +     private static native byte[] getResourceAsStream0(String name);
    1.30  
    1.31      /**
    1.32       * Finds a resource with a given name.  The rules for searching resources
    1.33 @@ -925,7 +927,7 @@
    1.34       */
    1.35      public java.net.URL getResource(String name) {
    1.36          name = resolveName(name);
    1.37 -        ClassLoader cl = getClassLoader0();
    1.38 +        ClassLoader cl = null;
    1.39          if (cl==null) {
    1.40              // A system class.
    1.41              return ClassLoader.getSystemResource(name);
    1.42 @@ -989,9 +991,6 @@
    1.43          throw new SecurityException();
    1.44      }
    1.45      
    1.46 -    // Package-private to allow ClassLoader access
    1.47 -    native ClassLoader getClassLoader0();    
    1.48 -
    1.49      /**
    1.50       * Returns the {@code Class} representing the component type of an
    1.51       * array.  If this class does not represent an array class this method
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Thu Jan 10 13:09:19 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Thu Jan 10 20:15:11 2013 +0100
     2.3 @@ -37,7 +37,7 @@
     2.4   *   return null; // byte[] for the resource
     2.5   * });
     2.6   * </pre>
     2.7 - * In this scenario, when a request for a unknown class is made, the loader
     2.8 + * In this scenario, when a request for an unknown class is made, the loader
     2.9   * function is asked for its byte code and the system dynamically transforms
    2.10   * it to JavaScript.
    2.11   *
     3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 10 13:09:19 2013 +0100
     3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 10 20:15:11 2013 +0100
     3.3 @@ -255,7 +255,8 @@
     3.4          final byte[] byteCodes = m.getCode();
     3.5          if (byteCodes == null) {
     3.6              out.append("  throw 'no code found for ")
     3.7 -               .append(m.getInternalSig()).append("';\n");
     3.8 +               .append(jc.getClassName()).append('.')
     3.9 +               .append(m.getName()).append("';\n");
    3.10              out.append("};");
    3.11              return;
    3.12          }
     4.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Jan 10 13:09:19 2013 +0100
     4.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Jan 10 20:15:11 2013 +0100
     4.3 @@ -124,7 +124,13 @@
     4.4              + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
     4.5              + "        load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
     4.6              + "    }\n"
     4.7 -            + "    if (args[0]) vm.loadClass = loader.loadClass;\n"
     4.8 +            + "    if (args[0]) {\n"
     4.9 +            + "      vm.loadClass = loader.loadClass;\n"
    4.10 +            + "      vm.loadBytes = function(name) {\n"
    4.11 +            + "        if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n"
    4.12 +            + "        return args[0](name);\n"
    4.13 +            + "      }\n"
    4.14 +            + "    }\n"
    4.15              + "    return loader;\n"
    4.16              + "  };\n");
    4.17          out.append("}(this));");
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ResourcesTest.java	Thu Jan 10 20:15:11 2013 +0100
     5.3 @@ -0,0 +1,32 @@
     5.4 +/*
     5.5 + * To change this template, choose Tools | Templates
     5.6 + * and open the template in the editor.
     5.7 + */
     5.8 +package org.apidesign.bck2brwsr.tck;
     5.9 +
    5.10 +import java.io.InputStream;
    5.11 +import org.apidesign.bck2brwsr.vmtest.Compare;
    5.12 +import org.apidesign.bck2brwsr.vmtest.VMTest;
    5.13 +import org.testng.annotations.Factory;
    5.14 +
    5.15 +/**
    5.16 + *
    5.17 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    5.18 + */
    5.19 +public class ResourcesTest {
    5.20 +    
    5.21 +    @Compare public String readResourceAsStream() throws Exception {
    5.22 +        InputStream is = getClass().getResourceAsStream("Resources.txt");
    5.23 +        byte[] b = new byte[30];
    5.24 +        int len = is.read(b);
    5.25 +        StringBuilder sb = new StringBuilder();
    5.26 +        for (int i = 0; i < len; i++) {
    5.27 +            sb.append((char)b[i]);
    5.28 +        }
    5.29 +        return sb.toString();
    5.30 +    }
    5.31 +    
    5.32 +    @Factory public static Object[] create() {
    5.33 +        return VMTest.create(ResourcesTest.class);
    5.34 +    }
    5.35 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/vmtest/src/test/resources/org/apidesign/bck2brwsr/tck/Resources.txt	Thu Jan 10 20:15:11 2013 +0100
     6.3 @@ -0,0 +1,1 @@
     6.4 +Ahoj