package de.fub.agg2graph.gpseval.features;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* The FeatureFactory-instance can be used to create new Feature-instances based
* on a feature name.
*
* It comes with support for all built-in Features like MaxSpeedFeature,
* SegmentsFeature and so on. To register your own Feature-class use the
* registerFeatureClass methods.
*
* @see ConfigFile for example usage.
*/
public class FeatureFactory {
private static FeatureFactory instance = new FeatureFactory();
private Map<String, Class<? extends Feature>> mFeatureClasses = new HashMap<>();
private FeatureFactory() {
registerBuiltInFeatures();
}
/**
* Register the built-in Feature-classes.
*/
private void registerBuiltInFeatures() {
registerFeatureClass(AvgBearingChangeFeature.class);
registerFeatureClass(AvgPrecisionFeature.class);
registerFeatureClass(AvgVelocityFeature.class);
registerFeatureClass(AvgTransportationDistanceFeature.class);
registerFeatureClass(MaxPrecisionFeature.class);
registerFeatureClass(MaxVelocityFeature.class);
registerFeatureClass(MaxAccelerationFeature.class);
registerFeatureClass(MinPrecisionFeature.class);
registerFeatureClass(SegmentsFeature.class);
}
/**
* Returns the FeatureFactory-instance.
*
* @return
*/
public static FeatureFactory getFactory() {
return instance;
}
/**
* Register a Feature-class with the given name.
*
* @param name
* @param featureClass
*/
public void registerFeatureClass(String name, Class<? extends Feature> featureClass) {
mFeatureClasses.put(name, featureClass);
}
/**
* Register a Feature-class. The Feature's identifier will be used as name.
*
* @param featureClass
*/
public void registerFeatureClass(Class<? extends Feature> featureClass) {
mFeatureClasses.put(Feature.getFeatureIdentifier(featureClass), featureClass);
}
/**
* Get the Feature-class for the given name.
*
* @param name
* @return
*/
public Class<? extends Feature> getFeatureClass(String name) {
return mFeatureClasses.get(name);
}
/**
* Return a new Feature-instance for the given Feature-name.
*
* @param name
* @return
*/
public Feature newFeature(String name) {
Feature feature = null;
Class<? extends Feature> featureClass = mFeatureClasses.get(name);
if (featureClass != null) {
try {
feature = featureClass.newInstance();
} catch (InstantiationException | IllegalAccessException ex) {
Logger.getLogger(FeatureFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
return feature;
}
}