package org.freehep.util.parameterdatabase; import java.beans.PropertyChangeListener; import java.io.IOException; import java.io.Reader; import java.lang.reflect.Constructor; import java.util.Hashtable; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class ParameterDatabaseXMLReader extends DefaultHandler { private ParameterDatabase database; private Hashtable instanceMap; private XMLReader xml; public ParameterDatabaseXMLReader() throws SAXException, ParserConfigurationException { xml = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); xml.setContentHandler(this); xml.setDTDHandler(this); xml.setErrorHandler(this); xml.setEntityResolver(this); } public void readParameters(ParameterDatabase database, Reader reader, Hashtable instanceMap) throws SAXException, IOException { if (database == null) throw new IllegalArgumentException(); this.database = database; this.instanceMap = instanceMap; InputSource is = new InputSource(reader); xml.parse(is); } public void startElement(String namespace, String tag, String qName, Attributes atts) throws SAXException { if (tag.equals("ClassParameter")) { String className = atts.getValue("class"); String parameterName = atts.getValue("name"); String valueAsString = atts.getValue("value"); String valueTypeAsString = atts.getValue("type"); if (className != null && parameterName != null && valueAsString != null && valueTypeAsString != null) { // Setup the call parameters for a constructor which takes // a String as the only argument. Object[] parameters = new Object[1]; parameters[0] = valueAsString; Class[] parameterTypes = new Class[1]; parameterTypes[0] = String.class; try { // Construct the new value Object based on the given // String value. Class valueClass = Class.forName(valueTypeAsString); Constructor constructor = valueClass .getConstructor(parameterTypes); Object newValue = constructor.newInstance(parameters); // Get the class this parameter belongs to. Class baseClass = Class.forName(className); ClassIterator cIterator = new ClassIterator(baseClass); // We set the parameter listener to null here. It is // important that the individual classes still // register their parameters so that they can become // true listeners of these parameters. // // NOTE: this will overwrite the current values in the // database. This is done because the views must be // restored first (along with their default values). Here // we overwrite those default values with the saved ones. database.addParameter(parameterName, newValue, cIterator, null, true); } catch (NoSuchMethodException nsme) { nsme.printStackTrace(); } catch (InstantiationException ie) { ie.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } else if (tag.equals("InstanceParameter")) { Integer id = new Integer(atts.getValue("id")); String parameterName = atts.getValue("name"); String valueAsString = atts.getValue("value"); String valueTypeAsString = atts.getValue("type"); Object instance = instanceMap.get(id); if (id != null && parameterName != null && valueAsString != null && valueTypeAsString != null) { // Setup the call parameters for a constructor which takes // a String as the only argument. Object[] parameters = new Object[1]; parameters[0] = valueAsString; Class[] parameterTypes = new Class[1]; parameterTypes[0] = String.class; try { // Construct the new value Object based on the given // String value. Class valueClass = Class.forName(valueTypeAsString); Constructor constructor = valueClass .getConstructor(parameterTypes); Object newValue = constructor.newInstance(parameters); // Get the class this parameter belongs to. ClassIterator cIterator = new ClassIterator(instance); if (instance instanceof PropertyChangeListener) { PropertyChangeListener pcl = (PropertyChangeListener) instance; database.addParameter(parameterName, newValue, cIterator, pcl, true); } else { database.addParameter(parameterName, newValue, cIterator, null, true); } } catch (NoSuchMethodException nsme) { nsme.printStackTrace(); } catch (InstantiationException ie) { ie.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } } }