/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: Xml2Config.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.config; import com.uwyn.rife.config.exceptions.ConfigErrorException; import com.uwyn.rife.ioc.HierarchicalProperties; import com.uwyn.rife.ioc.exceptions.PropertyValueException; import com.uwyn.rife.rep.Rep; import com.uwyn.rife.xml.Xml2Data; import com.uwyn.rife.xml.exceptions.XmlErrorException; import java.util.ArrayList; import java.util.HashMap; import org.xml.sax.Attributes; public class Xml2Config extends Xml2Data { private StringBuilder mCharacterDataStack = null; private String mCurrentListName = null; private String mCurrentParameterName = null; private HashMap<String, String> mParameters = null; private ArrayList<String> mFinalParameters = null; private HashMap<String, ArrayList<String>> mLists = null; private ArrayList<String> mFinalLists = null; public Xml2Config() { this(null, null, null, null); } public Xml2Config(HashMap<String, String> parameters, ArrayList<String> finalParameters, HashMap<String, ArrayList<String>> lists, ArrayList<String> finalLists) { mParameters = parameters; mFinalParameters = finalParameters; mLists = lists; mFinalLists = finalLists; if (null == mParameters) { mParameters = new HashMap<String, String>(); } if (null == mFinalParameters) { mFinalParameters = new ArrayList<String>(); } if (null == mLists) { mLists = new HashMap<String, ArrayList<String>>(); } if (null == mFinalLists) { mFinalLists = new ArrayList<String>(); } } public HashMap<String, String> getParameters() { return mParameters; } public ArrayList<String> getFinalParameters() { return mFinalParameters; } public HashMap<String, ArrayList<String>> getLists() { return mLists; } public ArrayList<String> getFinalLists() { return mFinalLists; } public void startDocument() { mCharacterDataStack = null; mCurrentListName = null; mCurrentParameterName = null; } public void endDocument() { mCharacterDataStack = null; mCurrentListName = null; mCurrentParameterName = null; } public void startElement(String namespaceURI, String localName, String qName, Attributes atts) { if (qName.equals("param") || qName.equals("item")) { mCharacterDataStack = new StringBuilder(); } if (qName.equals("config")) { // do nothing } else if (qName.equals("list")) { String name = atts.getValue("name"); if (!mFinalLists.contains(name)) { mCurrentListName = name; mLists.put(name, new ArrayList<String>()); String final_attribute = atts.getValue("final"); if (final_attribute != null && (final_attribute.equals("1") || final_attribute.equals("t") || final_attribute.equals("true"))) { mFinalLists.add(name); } } } else if (qName.equals("param")) { String name = atts.getValue("name"); if (!mFinalParameters.contains(name)) { mCurrentParameterName = name; String final_attribute = atts.getValue("final"); if (final_attribute != null && (final_attribute.equals("1") || final_attribute.equals("t") || final_attribute.equals("true"))) { mFinalParameters.add(name); } } } else if (qName.equals("item")) { } else if (qName.equals("value")) { String parameter_name = atts.getValue("name"); if (mParameters.containsKey(parameter_name)) { mCharacterDataStack.append(mParameters.get(parameter_name)); } } else if (qName.equals("property")) { String property_name = atts.getValue("name"); HierarchicalProperties properties = Rep.getProperties(); properties.contains(property_name); if (properties.contains(property_name)) { try { mCharacterDataStack.append(properties.get(property_name).getValueString()); } catch (PropertyValueException e) { throw new XmlErrorException("Error while obtain the String value of property '"+property_name+"'.", e); } } } else if (qName.equals("include")) { String included_file = atts.getValue("file"); try { new Config(included_file, getResourceFinder(), mParameters, mFinalParameters, mLists, mFinalLists); } catch (ConfigErrorException e) { throw new XmlErrorException("Error while processing the included config file '"+included_file+"'.", e); } } else { throw new XmlErrorException("Unsupport element name '"+qName+"'."); } } public void endElement(String namespaceURI, String localName, String qName) { if (qName.equals("config")) { } else if (qName.equals("param")) { if (mCurrentParameterName != null) { String parameter_name = mCurrentParameterName; mParameters.put(parameter_name, mCharacterDataStack.toString()); mCurrentParameterName = null; } mCharacterDataStack = null; } else if (qName.equals("list")) { mCurrentListName = null; } else if (qName.equals("item")) { if (mCurrentListName != null) { mLists.get(mCurrentListName).add(mCharacterDataStack.toString()); mCharacterDataStack = null; } } else if (qName.equals("value")) { } } public void characters(char[] ch, int start, int length) { if (mCharacterDataStack != null && length > 0) { mCharacterDataStack.append(String.copyValueOf(ch, start, length)); } } }