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

com.googlecode.gwt.test.internal.GwtTranslator Maven / Gradle / Ivy

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

import com.googlecode.gwt.test.exceptions.GwtTestException;
import com.googlecode.gwt.test.exceptions.GwtTestPatchException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
import javassist.Translator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class GwtTranslator implements Translator {

    private static final Logger LOGGER = LoggerFactory.getLogger(GwtTranslator.class);

    private final ClassVisibilityModifier classVisibilityModifier;
    private final ConfigurationLoader configurationLoader;
    private final HasHTMLModifier hasHTMLModifier;
    private final HasNameModifier hasNameModifier;

    private final SerializableModifier serializableModifier;

    GwtTranslator(ConfigurationLoader configurationLoader) {
        this.configurationLoader = configurationLoader;
        this.hasHTMLModifier = new HasHTMLModifier();
        this.hasNameModifier = new HasNameModifier();
        this.classVisibilityModifier = new ClassVisibilityModifier();
        this.serializableModifier = new SerializableModifier();
    }

    public void onLoad(ClassPool pool, String className) throws NotFoundException {
        CtClass classToLoad = pool.get(className);
        patchClass(classToLoad);
    }

    public void start(ClassPool pool) throws NotFoundException {

    }

    private void applyJavaClassModifiers(CtClass ctClass) {
        try {
            // Apply internal modifiers
            serializableModifier.modify(ctClass);
            hasHTMLModifier.modify(ctClass);
            hasNameModifier.modify(ctClass);
            classVisibilityModifier.modify(ctClass);

        } catch (Exception e) {
            if (GwtTestException.class.isInstance(e)) {
                throw (GwtTestException) e;
            }

            throw new GwtTestPatchException(e);
        }

    }

    private void applyPatcher(CtClass classToPatch) {
        Patcher patcher = configurationLoader.getPatcherFactory().createPatcher(classToPatch);

        if (patcher != null) {
            LOGGER.debug("Apply '" + patcher.getClass().getName() + "'");
            try {
                GwtPatcherUtils.patch(classToPatch, patcher);
            } catch (Exception e) {
                if (GwtTestException.class.isInstance(e)) {
                    throw (GwtTestException) e;
                }

                throw new GwtTestPatchException("Error while patching class '" + classToPatch.getName()
                        + "'", e);
            }
        }
    }

    private void patchClass(CtClass classToModify) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Load class '" + classToModify.getName() + "'");
        }

        applyPatcher(classToModify);
        applyJavaClassModifiers(classToModify);
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Class '" + classToModify.getName() + "' has been loaded");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy