1 16 package com.google.gwt.dev.shell; 17 18 import com.google.gwt.core.ext.TreeLogger; 19 import com.google.gwt.core.ext.UnableToCompleteException; 20 import com.google.gwt.core.ext.typeinfo.TypeOracle; 21 import com.google.gwt.dev.cfg.ModuleDef; 22 import com.google.gwt.dev.cfg.ModuleDefLoader; 23 import com.google.gwt.dev.cfg.Rules; 24 import com.google.gwt.dev.jdt.ByteCodeCompiler; 25 import com.google.gwt.dev.jdt.RebindOracle; 26 import com.google.gwt.dev.jdt.SourceOracle; 27 28 import java.io.File ; 29 import java.util.HashMap ; 30 import java.util.Map ; 31 32 36 public class ShellModuleSpaceHost implements ModuleSpaceHost { 37 38 private static Map byteCodeCompilersByModule = new HashMap (); 39 40 protected final File genDir; 41 42 protected final TypeOracle typeOracle; 43 44 private CompilingClassLoader classLoader; 45 46 private final TreeLogger logger; 47 48 private final ModuleDef module; 49 50 private final File outDir; 51 52 private RebindOracle rebindOracle; 53 54 private ModuleSpace space; 55 56 59 public ShellModuleSpaceHost(TreeLogger logger, TypeOracle typeOracle, 60 ModuleDef module, File genDir, File outDir) { 61 this.logger = logger; 62 this.typeOracle = typeOracle; 63 this.module = module; 64 this.genDir = genDir; 65 66 this.outDir = new File (outDir, module.getName()); 69 } 70 71 public CompilingClassLoader getClassLoader() { 72 checkForModuleSpace(); 73 return classLoader; 74 } 75 76 public String [] getEntryPointTypeNames() { 77 checkForModuleSpace(); 78 return module.getEntryPointTypeNames(); 79 } 80 81 public TreeLogger getLogger() { 82 return logger; 83 } 84 85 public void onModuleReady(ModuleSpace readySpace) 86 throws UnableToCompleteException { 87 this.space = readySpace; 88 89 SourceOracle srcOracle = new HostedModeSourceOracle(typeOracle); 93 94 ByteCodeCompiler compiler = getOrCreateByteCodeCompiler(srcOracle); 97 98 ModuleSpacePropertyOracle propOracle = new ModuleSpacePropertyOracle( 101 module.getProperties(), readySpace); 102 103 Rules rules = module.getRules(); 107 rebindOracle = new StandardRebindOracle(typeOracle, propOracle, rules, 108 genDir, outDir, module.getCacheManager()); 109 110 classLoader = new CompilingClassLoader(logger, compiler, typeOracle); 122 } 123 124 public String rebind(TreeLogger rebindLogger, String sourceTypeName) 125 throws UnableToCompleteException { 126 checkForModuleSpace(); 127 return rebindOracle.rebind(rebindLogger, sourceTypeName); 128 } 129 130 ByteCodeCompiler getOrCreateByteCodeCompiler(SourceOracle srcOracle) { 131 ByteCodeCompiler compiler; 132 synchronized (byteCodeCompilersByModule) { 133 compiler = (ByteCodeCompiler) byteCodeCompilersByModule.get(module); 134 if (compiler == null) { 135 compiler = new ByteCodeCompiler(srcOracle, module.getCacheManager()); 136 if (ModuleDefLoader.getEnableCachingModules()) { 137 byteCodeCompilersByModule.put(module, compiler); 138 } 139 } 140 } 141 return compiler; 142 } 143 144 private void checkForModuleSpace() { 145 if (space == null) { 146 throw new IllegalStateException ("Module initialization error"); 147 } 148 } 149 } 150 | Popular Tags |