package org.seqcode.gsebricks;
import java.util.*;
import org.seqcode.genome.Genome;
public class RegionExpanderFactoryLoader<PRODUCT> {
private ResourceBundle res;
private Map<String,Map<String,RegionExpanderFactory<PRODUCT>>> factories;
public RegionExpanderFactoryLoader(String ftype) {
res = ResourceBundle.getBundle("org.seqcode.gseutils.properties."+ftype+"_factories");
factories = new HashMap<String,Map<String,RegionExpanderFactory<PRODUCT>>>();
Enumeration<String> keys = res.getKeys();
while(keys.hasMoreElements()) {
String key = keys.nextElement();
String[] keyArray = key.split(",");
String genome = keyArray[0], type = keyArray[1];
addFactory(genome, type, res.getString(key));
}
}
public RegionExpanderFactory<PRODUCT> getFactory(Genome g, String type) {
if(!factories.containsKey(g.getVersion())) { return null; }
if(!factories.get(g.getVersion()).containsKey(type)) { return null; }
return factories.get(g.getVersion()).get(type);
}
public Set<String> getGenomes() { return factories.keySet(); }
public Set<String> getTypes(Genome g) {
if(!factories.containsKey(g.getVersion())) { return new HashSet<String>(); }
return factories.get(g.getVersion()).keySet();
}
public Set<String> getTypes(String gversion) {
if(!factories.containsKey(gversion)) { return new HashSet<String>(); }
return factories.get(gversion).keySet();
}
private void addFactory(String genome, String type, String pathName) {
ClassLoader loader = ClassLoader.getSystemClassLoader();
try {
Class fClass = loader.loadClass(pathName);
RegionExpanderFactory<PRODUCT> f = (RegionExpanderFactory<PRODUCT>)fClass.newInstance();
f.setType(type);
if(!factories.containsKey(genome)) { factories.put(genome, new HashMap<String,RegionExpanderFactory<PRODUCT>>()); }
Map<String,RegionExpanderFactory<PRODUCT>> genomeMap = factories.get(genome);
genomeMap.put(type, f);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}