
org.biojavax.SimpleRichObjectBuilder Maven / Gradle / Ivy
/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
package org.biojavax;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Creates objects and returns them, and stores them in an internal
* map of singletons for reference. Takes up a lot of memory!
* @author Richard Holland
* @since 1.5
*/
public class SimpleRichObjectBuilder implements RichObjectBuilder {
private static Map objects = new HashMap();
/**
* {@inheritDoc}
* Instantiates and returns objects, that's all there is to it.
*/
public Object buildObject(Class clazz, List paramsList) {
// put the class into the hashmap if not there already
if (!objects.containsKey(clazz)) objects.put(clazz,new HashMap());
Map contents = (Map)objects.get(clazz);
// convert the params list to remove nulls as we can't process those.
List ourParamsList = new ArrayList(paramsList);
for (Iterator i = ourParamsList.iterator(); i.hasNext(); )
if (i.next()==null) i.remove();
// return the constructed object from the hashmap if there already
if (contents.containsKey(ourParamsList)) return contents.get(ourParamsList);
// otherwise build it.
try {
// Load the class
Class[] types = new Class[ourParamsList.size()];
// Find its constructor with given params
for (int i = 0; i < ourParamsList.size(); i++) {
if (ourParamsList.get(i) instanceof Set) types[i] = Set.class;
else if (ourParamsList.get(i) instanceof Map) types[i] = Map.class;
else if (ourParamsList.get(i) instanceof List) types[i] = List.class;
else types[i] = ourParamsList.get(i).getClass();
}
Constructor c = clazz.getConstructor(types);
// Instantiate it with the parameters
Object o = c.newInstance(ourParamsList.toArray());
// store it for later in the singleton map
contents.put(ourParamsList, o);
// return it
return o;
} catch (Exception e) {
StringBuffer paramsstuff = new StringBuffer();
paramsstuff.append(clazz);
paramsstuff.append("(");
for (int i = 0; i < ourParamsList.size(); i++) {
if (i>0) paramsstuff.append(",");
paramsstuff.append(ourParamsList.get(i).getClass());
}
paramsstuff.append(")");
IllegalArgumentException ie = new IllegalArgumentException("Could not find constructor for "+paramsstuff);
ie.initCause(e);
throw ie;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy