rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java
branchclosure
changeset 1493 234fea368401
parent 1491 4a1398eff4fb
child 1495 d5dd07b45f79
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Sat Apr 26 21:30:06 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Sun Apr 27 22:40:17 2014 +0200
     1.3 @@ -19,7 +19,6 @@
     1.4  
     1.5  import java.io.IOException;
     1.6  import java.io.InputStream;
     1.7 -import java.net.URL;
     1.8  import org.apidesign.bck2brwsr.core.Exported;
     1.9  
    1.10  /** Build your own virtual machine! Use methods in this class to generate
    1.11 @@ -57,14 +56,16 @@
    1.12      private final ObfuscationLevel level;
    1.13      private final StringArray rootcls;
    1.14      private final StringArray classes;
    1.15 +    private final StringArray resources;
    1.16      private final Resources res;
    1.17      private final boolean extension;
    1.18  
    1.19 -    private Bck2Brwsr(ObfuscationLevel level, StringArray rootcls, StringArray classes, Resources resources, boolean extension) {
    1.20 +    private Bck2Brwsr(ObfuscationLevel level, StringArray rootcls, StringArray classes, StringArray resources, Resources res, boolean extension) {
    1.21          this.level = level;
    1.22          this.rootcls = rootcls;
    1.23          this.classes = classes;
    1.24 -        this.res = resources;
    1.25 +        this.resources = resources;
    1.26 +        this.res = res;
    1.27          this.extension = extension;
    1.28      }
    1.29      
    1.30 @@ -102,7 +103,7 @@
    1.31       * @since 0.5
    1.32       */
    1.33      public static Bck2Brwsr newCompiler() {
    1.34 -        return new Bck2Brwsr(ObfuscationLevel.NONE, new StringArray(), new StringArray(), null, false);
    1.35 +        return new Bck2Brwsr(ObfuscationLevel.NONE, new StringArray(), new StringArray(), new StringArray(), null, false);
    1.36      }
    1.37  
    1.38      /** Adds additional classes 
    1.39 @@ -122,7 +123,7 @@
    1.40          if (classes.length == 0) {
    1.41              return this;
    1.42          } else {
    1.43 -            return new Bck2Brwsr(level, rootcls.addAndNew(classes), this.classes, res,
    1.44 +            return new Bck2Brwsr(level, rootcls.addAndNew(classes), this.classes, resources, res,
    1.45                                   extension);
    1.46          }
    1.47      }
    1.48 @@ -142,11 +143,32 @@
    1.49          if (classes.length == 0) {
    1.50              return this;
    1.51          } else {
    1.52 -            return new Bck2Brwsr(level, rootcls, this.classes.addAndNew(classes), res,
    1.53 +            return new Bck2Brwsr(level, rootcls, this.classes.addAndNew(classes), resources, res,
    1.54                  extension);
    1.55          }
    1.56      }
    1.57      
    1.58 +    /** These resources should be made available in the compiled file in
    1.59 +     * binary form. These resources can then be loaded
    1.60 +     * by {@link ClassLoader#getResource(java.lang.String)} and similar 
    1.61 +     * methods.
    1.62 +     * 
    1.63 +     * @param resources names of the resources to be loaded by {@link Resources#get(java.lang.String)}
    1.64 +     * @return new instance of the Bck2Brwsr compiler which inherits
    1.65 +     *   all values from <code>this</code> just adds few more resource names
    1.66 +     *   for processing
    1.67 +     * @since 0.9
    1.68 +     */
    1.69 +    public Bck2Brwsr addResources(String... resources) {
    1.70 +        if (resources.length == 0) {
    1.71 +            return this;
    1.72 +        } else {
    1.73 +            return new Bck2Brwsr(level, rootcls, this.classes, 
    1.74 +                this.resources.addAndNew(resources), res, extension
    1.75 +            );
    1.76 +        }
    1.77 +    }
    1.78 +    
    1.79      /** Changes the obfuscation level for the compiler by creating new instance
    1.80       * which inherits all values from <code>this</code> and adjust the level
    1.81       * of obfuscation.
    1.82 @@ -156,7 +178,7 @@
    1.83       * @since 0.5
    1.84       */
    1.85      public Bck2Brwsr obfuscation(ObfuscationLevel level) {
    1.86 -        return new Bck2Brwsr(level, rootcls, classes, res, extension);
    1.87 +        return new Bck2Brwsr(level, rootcls, classes, resources, res, extension);
    1.88      }
    1.89      
    1.90      /** A way to change the provider of additional resources (classes) for the 
    1.91 @@ -168,7 +190,7 @@
    1.92       * @since 0.5
    1.93       */
    1.94      public Bck2Brwsr resources(Resources res) {
    1.95 -        return new Bck2Brwsr(level, rootcls, classes, res, extension);
    1.96 +        return new Bck2Brwsr(level, rootcls, classes, resources, res, extension);
    1.97      }
    1.98  
    1.99      /** Should one generate a library? By default the system generates
   1.100 @@ -183,7 +205,7 @@
   1.101       * @since 0.9
   1.102       */
   1.103      public Bck2Brwsr library(boolean library) {
   1.104 -        return new Bck2Brwsr(level, rootcls, classes, res, library);
   1.105 +        return new Bck2Brwsr(level, rootcls, classes, resources, res, library);
   1.106      }
   1.107  
   1.108      /** A way to change the provider of additional resources (classes) for the 
   1.109 @@ -205,10 +227,9 @@
   1.110       * @since 0.5
   1.111       */
   1.112      public void generate(Appendable out) throws IOException {
   1.113 -        Resources r = res != null ? res : new LdrRsrcs(Bck2Brwsr.class.getClassLoader());
   1.114          if (level != ObfuscationLevel.NONE) {
   1.115              try {
   1.116 -                ClosureWrapper.produceTo(out, level, r, rootcls, classes, extension);
   1.117 +                ClosureWrapper.produceTo(out, level, this);
   1.118                  return;
   1.119              } catch (IOException ex) {
   1.120                  throw ex;
   1.121 @@ -218,7 +239,27 @@
   1.122              }
   1.123          }
   1.124  
   1.125 -        VM.compile(out, r, rootcls, classes, extension);
   1.126 +        VM.compile(out, this);
   1.127 +    }
   1.128 +    
   1.129 +    //
   1.130 +    // Internal getters
   1.131 +    // 
   1.132 +    
   1.133 +    Resources getResources() {
   1.134 +        return res != null ? res : new LdrRsrcs(Bck2Brwsr.class.getClassLoader());
   1.135 +    }
   1.136 +    
   1.137 +    String[] allClasses() {
   1.138 +        return classes.addAndNew(rootcls.toArray()).toArray();
   1.139 +    }
   1.140 +    
   1.141 +    StringArray rootClasses() {
   1.142 +        return rootcls;
   1.143 +    }
   1.144 +    
   1.145 +    boolean isExtension() {
   1.146 +        return extension;
   1.147      }
   1.148  
   1.149      /** Provider of resources (classes and other files). The