// 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;
    
    @Override
	public void validateArtifactMap() throws InvalidFormatException {
	// nothing to validate
    }
    
    public static AgeClassifyFactory create(String subclassName, Tokenizer tokenizer,
					    FeatureGenerator[] featureGenerators) throws InvalidFormatException {
	if (subclassName == null) {
	    // will create the default factory
	    return new AgeClassifyFactory(tokenizer, featureGenerators);
	}
	try {
	    AgeClassifyFactory factory = AgeClassifyFactory.INSTANCE;
	    factory.init(tokenizer, featureGenerators);
	    return factory;
	} catch (Exception e) {
	    String msg = "Could not instantiate the " + subclassName
		+ ". The initialization throw an exception.";
	    System.err.println(msg);
	    e.printStackTrace();
	    throw new InvalidFormatException(msg, e);
	}
	
    }
    
    private FeatureGenerator[] loadFeatureGenerators(String classNames) {
	String[] classes = classNames.split(",");
	FeatureGenerator[] features = new FeatureGenerator[classes.length];

// 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;

    
    @Override
	public void validateArtifactMap() throws InvalidFormatException {
	// nothing to validate
    }
    
    public static AgeClassifyFactory create(String subclassName, Tokenizer tokenizer,
					    FeatureGenerator[] featureGenerators) throws InvalidFormatException {
	if (subclassName == null) {
	    // will create the default factory
	    return new AgeClassifyFactory(tokenizer, featureGenerators);
	}
	try {
	    AgeClassifyFactory factory = AgeClassifyFactory.INSTANCE;
	    factory.init(tokenizer, featureGenerators);
	    return factory;
	} catch (Exception e) {
	    String msg = "Could not instantiate the " + subclassName
		+ ". The initialization throw an exception.";
	    System.err.println(msg);
	    e.printStackTrace();
	    throw new InvalidFormatException(msg, e);
	}
	
    }
    
    private FeatureGenerator[] loadFeatureGenerators(String classNames) {
	String[] classes = classNames.split(",");
	FeatureGenerator[] features = new FeatureGenerator[classes.length];

	for (int i = 0; i < classes.length; i++) {