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