1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
/* SingletonBroker.java
* =========================================================================
* This file is part of the GrInvIn project - http://www.grinvin.org
*
* Copyright (C) 2005-2008 Universiteit Gent
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* A copy of the GNU General Public License can be found in the file
* LICENSE.txt provided with the source distribution of this program (see
* the META-INF directory in the source jar). This license can also be
* found on the GNU website at http://www.gnu.org/licenses/gpl.html.
*
* If you did not receive a copy of the GNU General Public License along
* with this program, contact the lead developer, or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.grinvin.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.grinvin.xml.XMLUtils;
import org.jdom.Element;
/**
* An object of this type keeps track of a set of singleton objects of
* type T which can be requested by id. The list of available singleton objects
* is instantiated at initialization time. An XML configuration file
* determines which objects should be instantiated.
*/
public class SingletonBroker<T> {
/**
* Maps an id to the corresponding singleton.
*/
private final Map<String,T> singletons;
/**
* Ordered list of ids.
*/
private final List<String> ids;
/**
* Instantiates a broker object and loads the corresponding objects.
* @param configPath file name in the class path of the XML file with
* the requested objects
*/
public SingletonBroker(String configPath) {
try {
this.singletons = new HashMap<String,T> ();
this.ids = new ArrayList<String> ();
Element element = XMLUtils.loadFromClassPath(configPath);
if (element != null) {
for (Object o : element.getChildren("package")) {
Element pkg = (Element)o;
String packageName = pkg.getAttributeValue("name");
for (Object obj : pkg.getChildren("id")) {
Element child = (Element)obj;
String id = child.getTextTrim();
String className = child.getAttributeValue("class");
if (className == null) {
int pos = id.lastIndexOf('.');
className = id.substring(pos+1);
}
try {
String fullClassName = packageName + "." + className;
singletons.put(id, (T)Class.forName(fullClassName).newInstance());
ids.add(id);
} catch (Exception ex) {
Logger.getLogger("org.grinvin.util")
.log(Level.WARNING,
"Failed to create singleton object '" + id + "' of type '" + className +"'",
ex);
}
}
}
}
} catch (IOException ex) {
Logger.getLogger("org.grinvin.util")
.log(Level.SEVERE, "Failed to create singleton broker", ex);
throw new RuntimeException("Unable to initialize singleton broker", ex);
}
}
/**
* Add all singleton objects to the given list.
*/
public void addToList(List<T> list) {
for (String id : ids)
list.add(singletons.get(id));
// list.addAll (singletons.values()) cannot be used because it loses the order
}
/**
* Return the list of all ids, in the form of an <code>Iterable</code>.
*/
public Iterable<String> getIds() {
return ids;
}
/**
* Return the object with the given id.
*/
public T get(String id) {
return singletons.get(id);
}
}
|