/* * Created on Sep 28, 2006 */ package org.seqcode.gsebricks; import java.util.*; import java.io.*; import org.seqcode.genome.Genome; /** * @author tdanford * * <code>GeneFactoryLoader</code> is basically a Singleton. It reads * a properties file in the classpath and creates GeneFactory objects. * Creating a GeneFactory with <code>getFactory</code> requires a * Genome and a type; the type generally indicates the set of gene * annotations to be accessed. * * The indirection through GeneFactoryLoader and GeneFactory allows * the properties file to specify more parameters than just the type */ public class GeneFactoryLoader { public static void main(String[] args) { GeneFactoryLoader loader = new GeneFactoryLoader(); for(String genome : loader.getGenomes()) { System.out.println(genome); for(String type : loader.getTypes(genome)) { System.out.println("\t" + type); } } } private ResourceBundle gfRes; private Map<String,Map<String,GeneFactory>> factories; public GeneFactoryLoader() { gfRes = ResourceBundle.getBundle("org.seqcode.gseutils.properties.gene_factories"); factories = new HashMap<String,Map<String,GeneFactory>>(); Enumeration<String> keys = gfRes.getKeys(); while(keys.hasMoreElements()) { String key = keys.nextElement(); String[] keyArray = key.split(","); String genome = keyArray[0], type = keyArray[1]; addFactory(genome, type, gfRes.getString(key)); } } public GeneFactory 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 gfClass = loader.loadClass(pathName); GeneFactory gf = (GeneFactory)gfClass.newInstance(); if(!factories.containsKey(genome)) { factories.put(genome, new HashMap<String,GeneFactory>()); } Map<String,GeneFactory> genomeMap = factories.get(genome); genomeMap.put(type, gf); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }