Package org.gwtoolbox.bean.rebind

Source Code of org.gwtoolbox.bean.rebind.BeanConfigLoader

package org.gwtoolbox.bean.rebind;

import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import org.gwtoolbox.bean.client.BeanInfoRegistryConfiguration;
import org.gwtoolbox.bean.client.annotation.AnnotationBasedBeanSelector;
import org.gwtoolbox.bean.client.annotation.BeanScan;
import org.gwtoolbox.bean.client.annotation.PatternBasedBeanSelector;
import org.gwtoolbox.bean.rebind.scan.ScannedTypeProcessor;
import org.gwtoolbox.bean.rebind.selector.AnnotationBasedSelector;
import org.gwtoolbox.bean.rebind.selector.BeanClassSelector;
import org.gwtoolbox.bean.rebind.selector.DefaultSelector;
import org.gwtoolbox.bean.rebind.selector.PatternBasedSelector;
import org.gwtoolbox.commons.generator.client.PackageResolver;
import org.gwtoolbox.commons.generator.rebind.EasyTreeLogger;
import org.gwtoolbox.commons.generator.rebind.PatternUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
* @author Uri Boness
*/
public class BeanConfigLoader implements ScannedTypeProcessor {

    private List<BeanRegistryConfig> beanRegistryConfigs = new ArrayList<BeanRegistryConfig>();

    private TypeOracle typeOracle;

    private JClassType registryConfigType;

    public BeanConfigLoader(TypeOracle typeOracle) {
        this.typeOracle = typeOracle;
        registryConfigType = typeOracle.findType(BeanInfoRegistryConfiguration.class.getName());
    }

    public void process(JClassType type) {
        if (!type.equals(registryConfigType) && type.isAssignableTo(registryConfigType)) {
            BeanRegistryConfig config = new BeanRegistryConfig();
            config.setPatterns(resolvePackageScanPatterns(type));
            config.setBeanClassSelector(resolveBeanClassSelector(type));
            beanRegistryConfigs.add(config);
        }
    }

    public void finished(EasyTreeLogger logger, GeneratorContext context) {

    }

    public List<BeanRegistryConfig> getBeanRegistryConfigs() {
        return beanRegistryConfigs;
    }

    //================================================ Helper Methods ==================================================

    private Pattern[] resolvePackageScanPatterns(JClassType type) {
        BeanScan beanScan = type.getAnnotation(BeanScan.class);
        String[] packages = beanScan.packages();
        PackageResolver packageResolver = beanScan.resolver();
        Pattern[] patterns = new Pattern[packages.length];
        int i = 0;
        for (String packageExpression : packages) {
            patterns[i++] = PatternUtils.resolvePattern(packageExpression, packageResolver);
        }
        return patterns;
    }

    private BeanClassSelector resolveBeanClassSelector(JClassType type) {
        if (type.isAnnotationPresent(PatternBasedBeanSelector.class)) {
            return new PatternBasedSelector(type.getAnnotation(PatternBasedBeanSelector.class));
        }
        if (type.isAnnotationPresent(AnnotationBasedBeanSelector.class)) {
            return new AnnotationBasedSelector(type.getAnnotation(AnnotationBasedBeanSelector.class));
        }

        // fallback on annotation based with default annotation (@Bean)
        return new DefaultSelector();
    }
}
TOP

Related Classes of org.gwtoolbox.bean.rebind.BeanConfigLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.