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();
}
}