package com.google.gwt.dist; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.log4j.Logger; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.dev.ArgProcessorBase; import com.google.gwt.dev.util.arg.ArgHandlerLogLevel; import com.google.gwt.dev.util.arg.ArgHandlerModuleName; import com.google.gwt.dev.util.arg.ArgHandlerTreeLoggerFlag; import com.google.gwt.dev.util.arg.ArgHandlerWorkDirRequired; import com.google.gwt.dist.compiler.Precompile; import com.google.gwt.dist.compiler.communicator.Communicator; import com.google.gwt.dist.compiler.communicator.Distributor; import com.google.gwt.dist.compiler.impl.SessionManagerImpl; import com.google.gwt.dist.linker.Link; import com.google.gwt.dist.util.ZipCompressor; import com.google.gwt.dist.util.ZipDecompressor; import com.google.gwt.dist.util.arg.ArgHandlerGWTClassPath; import com.google.gwt.dist.util.arg.ArgHandlerNodes; import com.google.gwt.dist.util.arg.ArgHandlerUUIDFile; import com.google.gwt.dist.util.options.DistCompilePermsOptions; import com.google.gwt.dist.util.options.DistCompilePermsOptionsImpl; import com.google.gwt.dist.util.options.DistCompilerOptions; import com.google.gwt.dist.util.options.LinkOptionsImpl; import com.google.gwt.dist.util.options.PrecompileOptionsImpl; public class Application { /** * As the name suggests, DistCompilerArgProcessor is used to process * arguments passed through command line. */ static class DistCompilerArgProcessor extends ArgProcessorBase { public DistCompilerArgProcessor(DistCompilerOptions options) { registerHandler(new ArgHandlerLogLevel(options)); registerHandler(new ArgHandlerTreeLoggerFlag(options)); registerHandler(new ArgHandlerWorkDirRequired(options)); registerHandler(new ArgHandlerGWTClassPath(options)); registerHandler(new ArgHandlerNodes(options)); registerHandler(new ArgHandlerUUIDFile(options)); registerHandler(new ArgHandlerModuleName(options) { @Override public String getPurpose() { return super.getPurpose() + " to compile"; } }); } @Override protected String getName() { return DistCompilerArgProcessor.class.getName(); } } private Communicator communicator; private ZipCompressor compressor; private ZipDecompressor decompressor; private Distributor distributor; private TreeLogger treeLogger; private static final Logger logger = Logger.getLogger(Application.class); public Application(Communicator communicator, ZipCompressor compressor, ZipDecompressor decompressor, Distributor distributor, TreeLogger treeLogger) { this.communicator = communicator; this.compressor = compressor; this.decompressor = decompressor; this.distributor = distributor; this.treeLogger = treeLogger; } public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); Application app = (Application) appContext.getBean("application"); DistCompilerOptions options = (DistCompilerOptions) appContext .getBean("distOptions"); if (new DistCompilerArgProcessor(options).processArgs(args)) { app.start(options); } } public void start(DistCompilerOptions options) { List<Node> nodes = options.getNodes(); List<SessionManager> sessionManagers = new ArrayList<SessionManager>(); PrecompileOptionsImpl precompileOptions = new PrecompileOptionsImpl( options); Precompile precompile = new Precompile(precompileOptions); long compileStart = System.currentTimeMillis(); precompile.run(treeLogger); int permsToCompile[] = getPermsToCompile(precompileOptions.getWorkDir()); DistCompilePermsOptions compilePermsOptions = new DistCompilePermsOptionsImpl( options); compilePermsOptions.setPermsToCompile(permsToCompile); Map<Node, int[]> distributionMatrix = distributor.distribute( compilePermsOptions.getPermsToCompile(), nodes); for (Node n : nodes) { DistCompilePermsOptions customizedCompilePermsOptions = new DistCompilePermsOptionsImpl( options); customizedCompilePermsOptions.setPermsToCompile(distributionMatrix .get(n)); sessionManagers.add(new SessionManagerImpl(communicator, n, customizedCompilePermsOptions, compressor, decompressor)); } while (!allSessionManagersFinished(sessionManagers)) { for (SessionManager sm : sessionManagers) { if (!sm.isFinished()) { sm.start(); } } try { Thread.sleep(5000); } catch (InterruptedException e) { } } LinkOptionsImpl linkOptions = new LinkOptionsImpl(options); Link link = new Link(linkOptions); link.run(treeLogger); long compileFinish = System.currentTimeMillis(); long delta = compileFinish - compileStart; // treeLogger.log(TreeLogger.INFO, "Compilation succeeded -- " // + String.format("%.3f", delta / 1000d) + "s"); logger.info("Compilation succeeded -- " + String.format("%.3f", delta / 1000d) + "s"); } /** * Check if correct settings are present. * * @param settings * Settings to be checked. * @return True if correct settings were present. False otherwise. */ protected boolean validUUID(AgentsSettings settings) { if (settings.getUUID().equals("")) { settings.setUUID(UUID.randomUUID().toString()); return false; } return true; } protected boolean allSessionManagersFinished( List<SessionManager> sessionManagers) { boolean finished = true; for (SessionManager s : sessionManagers) { if (s.isFinished() == Boolean.valueOf(false)) { finished = false; } } return finished; } /** * Reads how many permutations are there to be compiled. * * @param dir * Directory to which percompile step has emitted its output. * @return int array which contains permutations which should be compiled. */ private int[] getPermsToCompile(File dir) { return new int[] { 0, 1, 2, 3, 4, 5 }; } }