package net.refractions.linecleaner.cleansing;
import java.io.IOException;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import net.refractions.linecleaner.LoggingSystem;
import net.refractions.udig.project.internal.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.geotools.data.FeatureStore;
import org.geotools.data.Query;
import org.geotools.filter.CompareFilter;
import org.geotools.filter.FilterFactory;
import org.geotools.filter.FilterFactoryFinder;
import org.geotools.filter.FilterType;
import org.geotools.filter.IllegalFilterException;
/**
* Runs through a FeatureStore and deletes all features that are less
* than <code>minimumLength</code>.
*
* @author rgould
*
*/
public class MinimumLengthProcessor extends AbstractProcessor {
public static final double DEFAULT_MINIMUM_LENGTH = 10;
private double minimumLength;
LoggingSystem loggingSystem = LoggingSystem.getInstance();
/**
* FeatureStore is the set of data to perform the operation on.
* MinimumLength is the measurement used to determine whether a given
* feature should be allowed to continue to exist or not.
*
* If the length of a feature is less than <code>minimumLength</code> the
* feature will be erased.
*
* @param dataStore
* @param minimumLength
*/
public MinimumLengthProcessor (Map map, FeatureStore featureStore, double minimumLength) {
super(map, featureStore);
this.minimumLength = minimumLength;
}
protected void runInternal(IProgressMonitor monitor, PauseMonitor pauseMonitor) throws IOException {
if (monitor == null) monitor = new NullProgressMonitor();
monitor.beginTask("", featureStore.getCount(Query.ALL));
monitor.subTask("Removing small features");
loggingSystem.setCurrentAction(LoggingSystem.MINIMUM_LENGTH);
loggingSystem.begin();
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
CompareFilter compareFilter;
try {
compareFilter = factory.createCompareFilter(FilterType.COMPARE_LESS_THAN_EQUAL);
compareFilter.addLeftValue(new LengthExpression(monitor));
compareFilter.addRightValue(factory.createLiteralExpression(minimumLength));
} catch (IllegalFilterException e) {
throw (IOException) new IOException().initCause(e);
}
Handler handler = new Handler() {
public void publish(LogRecord record) {
System.out.println(record.getMessage());
}
public void flush() {}
public void close() throws SecurityException {}
};
Logger logger = Logger.getLogger("org.geotools.data");
Level preserve = logger.getLevel();
logger.setLevel(Level.FINEST);
logger.addHandler(handler);
Logger loggerCore = Logger.getLogger("org.geotools.core");
Level preserve2 = loggerCore.getLevel();
loggerCore.setLevel(Level.FINEST);
logger.addHandler(handler);
featureStore.removeFeatures(compareFilter);
logger.setLevel(preserve);
loggerCore.setLevel(preserve2);
loggingSystem.finish();
monitor.done();
}
}