net.sf.extcos.internal.ComponentSelectionProcessor Maven / Gradle / Ivy
package net.sf.extcos.internal;
import static net.sf.extcos.util.Assert.iae;
import java.util.Set;
import net.sf.extcos.ComponentQuery;
import net.sf.extcos.filter.Filter;
import net.sf.extcos.resource.Resource;
import net.sf.extcos.selector.BasePackageSelector;
import net.sf.extcos.selector.ForwardingBuilder;
import net.sf.extcos.selector.Package;
import net.sf.extcos.selector.ResourceTypeSelector;
import net.sf.extcos.selector.StoreBinding;
import net.sf.extcos.selector.StoreReturning;
import net.sf.extcos.spi.QueryContext;
import net.sf.extcos.spi.ResourceResolver;
import net.sf.extcos.spi.ResourceType;
import net.sf.extcos.util.Assert;
public class ComponentSelectionProcessor {
private final ComponentQuery componentSelector;
private final ResourceTypeSelector resourceTypeSelector = new ResourceTypeSelector();
private final FilterChainBuilder filterChainBuilder = new FilterChainBuilder();
private final Set resources = new ArraySet();
private final Set filtered = new ArraySet();
private final Set> classes = new ArraySet>();
private Set resourceResolvers;
private Set resourceTypes;
private Set basePackages;
private Set storeBindings;
private StoreReturning returning;
public ComponentSelectionProcessor(final ComponentQuery componentSelector) {
Assert.notNull(componentSelector, iae());
this.componentSelector = componentSelector;
}
public Set> process() {
init();
for (Package basePackage : basePackages) {
for (ResourceResolver resourceResolver : resourceResolvers) {
resources.addAll(resourceResolver.getResources(resourceTypes,
basePackage));
}
}
if (!resources.isEmpty()) {
Filter filter = filterChainBuilder.build(storeBindings, returning,
filtered, classes);
filter.filter(resources);
for (Resource resource : filtered) {
resource.generateAndDispatchClass();
}
}
BuildContext.getInstance().reset();
QueryContext.getInstance().reset();
return classes;
}
private void init() {
componentSelector.configure(resourceTypeSelector);
resourceTypes = resourceTypeSelector.getResourceTypes();
BasePackageSelector basePackageSelector = resourceTypeSelector
.getBasePackageSelector();
basePackages = basePackageSelector.getBasePackages();
QueryContext.getInstance().setIncludeEnums(basePackageSelector.isIncludingEnums());
ForwardingBuilder forwardingBuilder = basePackageSelector
.getForwardingBuilder();
resourceResolvers = forwardingBuilder.getResourceResolvers();
if (resourceResolvers.isEmpty()) {
resourceResolvers.add(new DefaultResourceResolver());
}
storeBindings = forwardingBuilder.getStoreBindings();
returning = forwardingBuilder.getReturning();
}
}