package org.lysty.core;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.xeoh.plugins.base.PluginManager;
import net.xeoh.plugins.base.impl.PluginManagerFactory;
import org.apache.log4j.Logger;
import org.lysty.db.DBHandler;
import org.lysty.extractors.FeatureExtractor;
import org.lysty.util.Utils;
public class ExtractorManager {
private static final String EXTRACTOR_JAR_NAME = "extractor.jar";
private static final String EXTRACTORS_FOLDER = "extractors";
private static List<FeatureExtractor> extractors;
private static Map<FeatureExtractor, Long> extractorTimestamp;
static Logger logger = Logger.getLogger(ExtractorManager.class);
/**
* @return the extractors
*/
public static List<FeatureExtractor> getExtractors() {
return extractors;
}
public static Long getExtractorTimestamp(FeatureExtractor extractor) {
return extractorTimestamp.get(extractor);
}
public static void loadExtractors() {
PluginManager manager = PluginManagerFactory.createPluginManager();
extractors = new ArrayList<FeatureExtractor>();
extractorTimestamp = new HashMap<FeatureExtractor, Long>();
File file = new File(Utils.getAppDirectoryFolder(Utils.PLUGINS_FOLDER)
.getAbsolutePath() + File.separator + EXTRACTORS_FOLDER);
File[] sDirs = file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
File jarFile;
for (File sDir : sDirs) {
try {
manager = PluginManagerFactory.createPluginManager();
jarFile = new File(sDir.getAbsolutePath() + File.separator
+ EXTRACTOR_JAR_NAME);
manager.addPluginsFrom(jarFile.toURI());
FeatureExtractor extractor = manager
.getPlugin(FeatureExtractor.class);
if (extractor != null) {
extractors.add(extractor);
logger.info("Loaded extractor: " + sDir.getName());
Long timestamp = DBHandler.getInstance()
.getSetExtractorTimestamp(extractor);
extractorTimestamp.put(extractor, timestamp);
}
} catch (Exception e) {
logger.error("Failed to load extractor: " + sDir.getName(), e);
}
}
}
public static FeatureExtractor getExtractor(String className) {
for (FeatureExtractor extractor : extractors) {
if (extractor.getClass().getName().equalsIgnoreCase(className))
return extractor;
}
return null;
}
public static String[] getSupportedFormats() {
Set<String> set = new HashSet<String>();
for (FeatureExtractor extractor : extractors) {
set.addAll(extractor.getSupportedFileFormats());
}
return set.toArray(new String[set.size()]);
}
public static List<String> getSupportedFeatures() {
List<String> list = new ArrayList<String>();
for (FeatureExtractor extractor : extractors) {
list.addAll(extractor.getSupportedAttributes());
}
return list;
}
}