package nl.ipo.cds.etl;
import java.util.Arrays;
import java.util.List;
public class FeaturePipeline<InputType extends Feature, OutputType extends Feature> implements FeatureFilter<InputType, OutputType> {
private final FeatureFilter<Feature, Feature>[] filters;
@SuppressWarnings("unchecked")
public FeaturePipeline (final FeatureFilter<?, ?> ... filters) {
this.filters = (FeatureFilter<Feature, Feature>[])Arrays.copyOf (filters, filters.length);
}
@SuppressWarnings("unchecked")
public <A extends Feature, B extends Feature> FeaturePipeline (final List<FeatureFilter<A, B>> filters) {
this.filters = filters.toArray (new FeatureFilter[filters.size ()]);
}
@Override
public void processFeature (final InputType feature, final FeatureOutputStream<OutputType> outputStream, final FeatureOutputStream<Feature> errorStream) {
if (feature == null) {
throw new NullPointerException ("feature cannot be null");
}
if (outputStream == null) {
throw new NullPointerException ("outputStream cannot be null");
}
doProcessFeature (feature, outputStream, errorStream, 0);
}
private void doProcessFeature (final Feature feature, final FeatureOutputStream<OutputType> pipelineOutputStream, final FeatureOutputStream<Feature> errorStream, final int filterNumber) {
if (filterNumber >= filters.length) {
@SuppressWarnings("unchecked")
final OutputType outputFeature = (OutputType)feature;
pipelineOutputStream.writeFeature (outputFeature);
} else {
filters[filterNumber].processFeature (feature, new FeatureOutputStream<Feature> () {
@Override
public void writeFeature (final Feature f) {
doProcessFeature (f, pipelineOutputStream, errorStream, filterNumber + 1);
}
}, errorStream);
}
}
@Override
public void finish () {
for (final FeatureFilter<Feature, Feature> filter: filters) {
filter.finish();
}
}
/**
* Responsible for executing post processing on all filters.
* @return Returns true iff the post processing checks/validation completed successfully for all filters.
*/
@Override
public boolean postProcess() {
boolean success = true;
for (final FeatureFilter<Feature, Feature> filter : filters) {
success &= filter.postProcess();
}
return success;
}
}