// Path: age-predictor-opennlp/src/main/java/opennlp/tools/util/featuregen/BagOfWordsFeatureGenerator.java
// public class BagOfWordsFeatureGenerator implements FeatureGenerator {
//     
//     public static final BagOfWordsFeatureGenerator INSTANCE = new BagOfWordsFeatureGenerator();
// 
//     private static List<String> stopwords = new ArrayList<String>();
//    
//     static {
// 		try {
// 		    stopwords = FileUtils.readLines(new File("props/stopwords.txt"), "utf-8");
// 		} catch (IOException e) {
// 		    stopwords = new ArrayList<String>();
// 		}
//     }
//     
//     public BagOfWordsFeatureGenerator() {
//     }
//     
//     @Override
//     public Collection<String> extractFeatures(String[] text) {
// 	
// 	Collection<String> bagOfWords = new ArrayList<String>();
// 
// 	for (String word : text) {
// 	    if (!stopwords.contains(word)) {
// 		bagOfWords.add("bow=" + word);
// 	    }
// 	}
// 
// 	return bagOfWords;
//     }
// 
// }
// 
// Path: age-predictor-opennlp/src/main/java/opennlp/tools/util/featuregen/FeatureGenerator.java
// public interface FeatureGenerator {
// 
//     /**
//      * Extract features from given text fragments
//      *
//      * @param text             the text fragments to extract features from
//      * @param extraInformation optional extra information to be used by the feature generator
//      * @return a collection of features
//      */
//     Collection<String> extractFeatures(String[] text);
// }


import opennlp.tools.tokenize.Tokenizer;
import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.BaseToolFactory;
import opennlp.tools.util.InvalidFormatException;
import opennlp.tools.util.ext.ExtensionLoader;
import opennlp.tools.util.featuregen.BagOfWordsFeatureGenerator;
import opennlp.tools.util.featuregen.FeatureGenerator;
	String[] classes = classNames.split(",");
	FeatureGenerator[] features = new FeatureGenerator[classes.length];

	for (int i = 0; i < classes.length; i++) {
	    /*
	    Class ext = Class.forName(classes[i]);
	    Field instance = ext.getDeclaredField("INSTANCE");
	    System.out.println(instance.toString());
	    
	    features[i] = (FeatureGenerator) instance.getDeclaringClass();
	    */
	    
	    features[i] = ExtensionLoader.instantiateExtension(FeatureGenerator.class,
	        classes[i]);
	   
	}
	return features;
    }
    
    public FeatureGenerator[] getFeatureGenerators() {
	if (featureGenerators == null) {
	    if (artifactProvider != null) {
		String classNames = artifactProvider
		    .getManifestProperty(FEATURE_GENERATORS);
		if (classNames != null) {
		    this.featureGenerators = loadFeatureGenerators(classNames);
		}
	    }
	    if (featureGenerators == null) { // could not load using artifact provider
		// load bag of words as default
// Path: age-predictor-opennlp/src/main/java/opennlp/tools/util/featuregen/BagOfWordsFeatureGenerator.java
// public class BagOfWordsFeatureGenerator implements FeatureGenerator {
//     
//     public static final BagOfWordsFeatureGenerator INSTANCE = new BagOfWordsFeatureGenerator();
// 
//     private static List<String> stopwords = new ArrayList<String>();
//    
//     static {
// 		try {
// 		    stopwords = FileUtils.readLines(new File("props/stopwords.txt"), "utf-8");
// 		} catch (IOException e) {
// 		    stopwords = new ArrayList<String>();
// 		}
//     }
//     
//     public BagOfWordsFeatureGenerator() {
//     }
//     
//     @Override
//     public Collection<String> extractFeatures(String[] text) {
// 	
// 	Collection<String> bagOfWords = new ArrayList<String>();
// 
// 	for (String word : text) {
// 	    if (!stopwords.contains(word)) {
// 		bagOfWords.add("bow=" + word);
// 	    }
// 	}
// 
// 	return bagOfWords;
//     }
// 
// }
// 
// Path: age-predictor-opennlp/src/main/java/opennlp/tools/util/featuregen/FeatureGenerator.java
// public interface FeatureGenerator {
// 
//     /**
//      * Extract features from given text fragments
//      *
//      * @param text             the text fragments to extract features from
//      * @param extraInformation optional extra information to be used by the feature generator
//      * @return a collection of features
//      */
//     Collection<String> extractFeatures(String[] text);
// }


// Path: age-predictor-opennlp/src/main/java/opennlp/tools/authorage/AgeClassifyFactory.java
import opennlp.tools.tokenize.Tokenizer;
import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.BaseToolFactory;
import opennlp.tools.util.InvalidFormatException;
import opennlp.tools.util.ext.ExtensionLoader;
import opennlp.tools.util.featuregen.BagOfWordsFeatureGenerator;
import opennlp.tools.util.featuregen.FeatureGenerator;

	String[] classes = classNames.split(",");
	FeatureGenerator[] features = new FeatureGenerator[classes.length];

	for (int i = 0; i < classes.length; i++) {
	    /*
	    Class ext = Class.forName(classes[i]);
	    Field instance = ext.getDeclaredField("INSTANCE");
	    System.out.println(instance.toString());
	    
	    features[i] = (FeatureGenerator) instance.getDeclaringClass();
	    */
	    
	    features[i] = ExtensionLoader.instantiateExtension(FeatureGenerator.class,
	        classes[i]);
	   
	}
	return features;
    }
    
    public FeatureGenerator[] getFeatureGenerators() {
	if (featureGenerators == null) {
	    if (artifactProvider != null) {
		String classNames = artifactProvider
		    .getManifestProperty(FEATURE_GENERATORS);
		if (classNames != null) {
		    this.featureGenerators = loadFeatureGenerators(classNames);
		}
	    }
	    if (featureGenerators == null) { // could not load using artifact provider
		// load bag of words as default
		FeatureGenerator[] def = { BagOfWordsFeatureGenerator.INSTANCE };