package nl.ipo.cds.etl.filtering;
import java.util.Properties;
import nl.idgis.commons.jobexecutor.Job;
import nl.idgis.commons.jobexecutor.JobLogger;
import nl.ipo.cds.domain.DatasetFilter;
import nl.ipo.cds.domain.FeatureType;
import nl.ipo.cds.etl.Feature;
import nl.ipo.cds.etl.FeatureFilter;
import nl.ipo.cds.etl.FeatureOutputStream;
import nl.ipo.cds.etl.GenericFeature;
import nl.ipo.cds.etl.log.LogStringBuilder;
import org.deegree.filter.Filter;
import org.deegree.filter.FilterEvaluationException;
public class DatasetFilterer implements FeatureFilter<GenericFeature, GenericFeature> {
private final Filter filter;
private final boolean valid;
private GenericFeatureXPathEvaluator xpathEvaluator = new GenericFeatureXPathEvaluator ();
public DatasetFilterer (final Job job, final FeatureType featureType, final DatasetFilter datasetFilter, final JobLogger jobLogger, final Properties properties) {
// Don't filter if there is no dataset filter:
if (datasetFilter == null) {
valid = true;
filter = null;
return;
}
// Create a logger for validation:
final LogStringBuilder<FilterExpressionValidator.MessageKey> logger = new LogStringBuilder<FilterExpressionValidator.MessageKey> ();
logger.setJobLogger (jobLogger);
logger.setProperties (properties);
// Validate the filter expression:
final FilterExpressionValidator validator = new FilterExpressionValidator (featureType, logger);
if (!validator.isValid (job, datasetFilter)) {
valid = false;
filter = null;
return;
}
// Convert the dataset filter into a deegree filter:
final FilterFactory factory = new FilterFactory (featureType);
this.filter = factory.createFilter (datasetFilter.getRootExpression ());
this.valid = true;
}
protected DatasetFilterer (final Filter filter) {
this.filter = filter;
this.valid = true;
}
public boolean isValid () {
return valid;
}
public boolean hasFilter () {
return filter != null;
}
public Filter getFilter () {
return filter;
}
@Override
public void processFeature (final GenericFeature feature, final FeatureOutputStream<GenericFeature> outputStream, final FeatureOutputStream<Feature> errorOutputStream) {
if (!isValid () || !hasFilter ()) {
outputStream.writeFeature (feature);
return;
}
try {
if (filter.evaluate (feature, xpathEvaluator)) {
outputStream.writeFeature (feature);
}
} catch (FilterEvaluationException e) {
errorOutputStream.writeFeature (feature);
}
}
@Override
public void finish () {
}
@Override
public boolean postProcess() {
return true;
}
}