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

com.googlecode.gwt.test.internal.handlers.GwtTestGWTBridge 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.client.GWT;
import com.google.gwt.core.client.GWTBridge;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.googlecode.gwt.test.GwtCreateHandler;
import com.googlecode.gwt.test.GwtLogHandler;
import com.googlecode.gwt.test.GwtTreeLogger;
import com.googlecode.gwt.test.Mock;
import com.googlecode.gwt.test.exceptions.GwtTestDeferredBindingException;
import com.googlecode.gwt.test.exceptions.GwtTestException;
import com.googlecode.gwt.test.exceptions.GwtTestPatchException;
import com.googlecode.gwt.test.internal.AfterTestCallback;
import com.googlecode.gwt.test.internal.AfterTestCallbackManager;
import com.googlecode.gwt.test.internal.GwtConfig;
import com.googlecode.gwt.test.internal.GwtFactory;
import com.googlecode.gwt.test.internal.i18n.LocalizableResourceCreateHandler;
import com.googlecode.gwt.test.internal.resources.ClientBundleCreateHandler;
import com.googlecode.gwt.test.internal.resources.ImageBundleCreateHandler;
import com.googlecode.gwt.test.uibinder.UiBinderCreateHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * gwt-test-utils {@link GWTBridge} implementation, which manages an ordered list of
 * GwtCreateHandler where {@link GWT#create(Class)} instructions are delegated. For internal
 * use only.
 *
 * @author Gael Lazzari
 */
public class GwtTestGWTBridge extends GWTBridge implements AfterTestCallback {

    private static final GwtTestGWTBridge INSTANCE = new GwtTestGWTBridge();

    public static GwtTestGWTBridge get() {
        return INSTANCE;
    }

    private final List addedHandlers;
    private final GwtCreateHandler animationSchedulerCreateHandler;
    private final GwtCreateHandler autoBeanCreateHandler;
    private final GwtCreateHandler cellBasedWidgetImplCreateHandler;
    private final GwtCreateHandler clientBundleCreateHander;
    private final GwtCreateHandler defaultGwtCreateHandler;
    private final GwtCreateHandler deferredReplaceWithCreateHandler;
    private final GwtCreateHandler generatorCreateHandler;
    private final GwtCreateHandler htmlTableImplCreateHandler;
    private final GwtCreateHandler imageBundleCreateHandler;
    private final GwtCreateHandler localizableResourceCreateHandler;
    private GwtCreateHandler mockCreateHandler;
    private final GwtCreateHandler placeHistoryMapperCreateHandler;
    private final GwtCreateHandler resizeLayoutPanelImplCreateHandler;
    private final TestRemoteServiceCreateHandler testRemoteServiceCreateHandler;
    private final GwtCreateHandler uiBinderCreateHandler;
    private final WebXmlRemoteServiceCreateHandler webXmlRemoteServiceCreateHandler;

    private GwtTestGWTBridge() {
        // TODO : all createHandler should be singleton ?
        generatorCreateHandler = new GeneratorCreateHandler(GwtFactory.get().getCompilationState(),
                GwtFactory.get().getModuleDef());
        addedHandlers = new ArrayList();
        animationSchedulerCreateHandler = new AnimationSchedulerCreateHandler();
        autoBeanCreateHandler = new AutoBeanCreateHandler();
        cellBasedWidgetImplCreateHandler = new CellBasedWidgetImplCreateHandler();
        clientBundleCreateHander = new ClientBundleCreateHandler();
        defaultGwtCreateHandler = new DefaultGwtCreateHandler();
        deferredReplaceWithCreateHandler = new DeferredReplaceWithCreateHandler();
        htmlTableImplCreateHandler = new HTMLTableImplCreateHandler();
        imageBundleCreateHandler = new ImageBundleCreateHandler();
        localizableResourceCreateHandler = new LocalizableResourceCreateHandler();
        placeHistoryMapperCreateHandler = new PlaceHistoryMapperCreateHandler();
        resizeLayoutPanelImplCreateHandler = new ResizeLayoutPanelImplCreateHandler();
        uiBinderCreateHandler = UiBinderCreateHandler.get();
        testRemoteServiceCreateHandler = TestRemoteServiceCreateHandler.get();
        webXmlRemoteServiceCreateHandler = new WebXmlRemoteServiceCreateHandler();

        AfterTestCallbackManager.get().registerCallback(this);
    }

    public void addGwtCreateHandler(GwtCreateHandler gwtCreateHandler) {
        addedHandlers.add(0, gwtCreateHandler);
    }

    public void afterTest() throws Throwable {
        addedHandlers.clear();
        testRemoteServiceCreateHandler.reset();
        mockCreateHandler = null;
    }

    @SuppressWarnings("unchecked")
    @Override
    public  T create(Class classLiteral) {
        for (GwtCreateHandler gwtCreateHandler : getGwtCreateHandlers()) {
            try {
                Object o = gwtCreateHandler.create(classLiteral);
                if (o != null) {
                    return (T) o;
                }
            } catch (GwtTestException e) {
                throw e;
            } catch (Exception e) {
                if (e instanceof UnableToCompleteException) {
                    GwtTreeLogger.get().onUnableToCompleteError();
                }

                throw new GwtTestPatchException("Error while creating instance of '"
                        + classLiteral.getName() + "' through '"
                        + gwtCreateHandler.getClass().getName() + "' instance", e);
            }
        }

        throw new GwtTestDeferredBindingException("No declared "
                + GwtCreateHandler.class.getSimpleName()
                + " has been able to create an instance of '" + classLiteral.getName()
                + "'. You should add our own with "
                + GwtConfig.get().getModuleRunner().getClass().getSimpleName()
                + ".addGwtCreateHandler(..) method or declared your tested object with @"
                + Mock.class.getSimpleName());
    }

    @Override
    public String getVersion() {
        return "GWT by gwt-test-utils";
    }

    @Override
    public boolean isClient() {
        return true;
    }

    @Override
    public void log(String message, Throwable e) {
        GwtLogHandler logHandler = GwtConfig.get().getModuleRunner().getLogHandler();
        if (logHandler != null) {
            logHandler.log(message, e);
        }
    }

    public void setMockCreateHandler(GwtCreateHandler mockCreateHandler) {
        this.mockCreateHandler = mockCreateHandler;
    }

    private List getGwtCreateHandlers() {
        List list = new ArrayList();

        // declared @Mock objects creation
        if (mockCreateHandler != null) {
            list.add(mockCreateHandler);
        }

        // than, add all user custom createHandlers
        list.addAll(addedHandlers);

        // than, add custom deferred 'replace-with' bindings
        list.add(deferredReplaceWithCreateHandler);

        // finally, add all default gwt-test-utils createHandlers
        list.add(localizableResourceCreateHandler);
        list.add(clientBundleCreateHander);
        list.add(imageBundleCreateHandler);
        list.add(htmlTableImplCreateHandler);
        list.add(resizeLayoutPanelImplCreateHandler);
        list.add(uiBinderCreateHandler);
        list.add(testRemoteServiceCreateHandler);
        list.add(webXmlRemoteServiceCreateHandler);
        list.add(cellBasedWidgetImplCreateHandler);
        list.add(animationSchedulerCreateHandler);
        list.add(placeHistoryMapperCreateHandler);
        list.add(autoBeanCreateHandler);

        list.add(defaultGwtCreateHandler);

        list.add(generatorCreateHandler);

        return list;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy