All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.googlecode.gwt.test.internal.handlers.GwtTestModuleSpaceHost Maven / Gradle / Ivy

There is a newer version: 0.63
Show newest version
package com.googlecode.gwt.test.internal.handlers;

import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.linker.ArtifactSet;
import com.google.gwt.dev.CompilerContext;
import com.google.gwt.dev.PrecompileTaskOptionsImpl;
import com.google.gwt.dev.RebindCache;
import com.google.gwt.dev.cfg.ModuleDef;
import com.google.gwt.dev.cfg.Rule;
import com.google.gwt.dev.javac.CompilationState;
import com.google.gwt.dev.javac.StandardGeneratorContext;
import com.google.gwt.dev.shell.*;
import com.google.gwt.dev.util.log.speedtracer.DevModeEventType;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;

import java.io.File;
import java.util.Deque;

/**
 * Provides an environment for a {@link com.google.gwt.dev.shell.ModuleSpace} that works
 * appropriately in gwt-test-utils. Almost copied from {@link ShellModuleSpaceHost} without the need
 * of an initialized {@link CompilingClassLoader}.
 */
class GwtTestModuleSpaceHost implements ModuleSpaceHost {

    // TODO(jat): hack to try and serialize rebinds
    private static final Object rebindLock = new Object[0];

    protected final CompilationState compilationState;

    protected final File genDir;

    private final ArtifactAcceptor artifactAcceptor;

    private final TreeLogger logger;

    private final ModuleDef module;

    private final RebindCache rebindCache;

    private StandardRebindOracle2 rebindOracle;

    private ModuleSpace space;

    /**
     * @param module the module associated with the hosted module space
     */
    public GwtTestModuleSpaceHost(TreeLogger logger, CompilationState compilationState,
                                  ModuleDef module, File genDir, ArtifactAcceptor artifactAcceptor,
                                  RebindCache rebindCache) {
        this.logger = logger;
        this.compilationState = compilationState;
        this.module = module;
        this.genDir = genDir;
        this.artifactAcceptor = artifactAcceptor;
        this.rebindCache = rebindCache;
    }

    public CompilingClassLoader getClassLoader() {
        return null;
    }

    public String[] getEntryPointTypeNames() {
        checkForModuleSpace();
        return module.getEntryPointTypeNames();
    }

    public TreeLogger getLogger() {
        return logger;
    }

    /**
     * Invalidates the given source type name, so the next rebind request will generate a type again.
     */
    public void invalidateRebind(String sourceTypeName) {
        checkForModuleSpace();
        rebindOracle.invalidateRebind(sourceTypeName);
    }

    public void onModuleReady(ModuleSpace readySpace) throws UnableToCompleteException {
        this.space = readySpace;

        Event moduleSpaceHostReadyEvent = SpeedTracerLogger.start(DevModeEventType.MODULE_SPACE_HOST_READY);
        try {
            // Establish an environment for JavaScript property providers to run.
            //
            ModuleSpacePropertyOracle propOracle = new ModuleSpacePropertyOracle(
                    module.getProperties(), module.getActiveLinkerNames(), readySpace);

            // Set up the rebind oracle for the module.
            // It has to wait until now because we need to inject javascript.
            //
            Deque rules = module.getRules();
            PrecompileTaskOptionsImpl options = new PrecompileTaskOptionsImpl();
            options.setGenDir(genDir);
            CompilerContext compilerContext = new CompilerContext.Builder().module(module).options(
                    options).build();
            StandardGeneratorContext genCtx = new StandardGeneratorContext(compilerContext,
                    compilationState, new ArtifactSet(), false);

            // Only enable generator result caching if we have a valid rebindCache
            genCtx.setGeneratorResultCachingEnabled(rebindCache != null);

            rebindOracle = new StandardRebindOracle2(propOracle, rules, genCtx);
            rebindOracle.setRebindCache(rebindCache);
        } finally {
            moduleSpaceHostReadyEvent.end();
        }
    }

    public String rebind(TreeLogger logger, String sourceTypeName) throws UnableToCompleteException {
        synchronized (rebindLock) {
            checkForModuleSpace();
            return rebindOracle.rebind(logger, sourceTypeName, new ArtifactAcceptor() {
                public void accept(TreeLogger logger, ArtifactSet newlyGeneratedArtifacts)
                        throws UnableToCompleteException {
                    artifactAcceptor.accept(logger, newlyGeneratedArtifacts);
                }
            });
        }
    }

    private void checkForModuleSpace() {
        if (space == null) {
            throw new IllegalStateException("Module initialization error");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy