/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.segmentation.server.preference.family; import net.codjo.xml.XmlException; import net.codjo.xml.fast.ClientContentHandler; import net.codjo.xml.fast.XmlParser; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.xml.sax.InputSource; /** * Classe permettant de charger les pr�f�rences � partir d'un fichier XML. * * @version $Revision: 1.7 $ */ public class XmlPreferenceLoader { private static final Logger LOG = Logger.getLogger(XmlPreferenceLoader.class); private Map<String, XmlFamilyPreference> familyPreferences = new HashMap<String, XmlFamilyPreference>(); public void load(InputSource source) throws IOException, XmlException, BadConfigurationException { XmlParser xmlParser = new XmlParser(); PreferenceBuilder preferenceBuilder = new PreferenceBuilder(); familyPreferences = preferenceBuilder.result; xmlParser.parse(source, preferenceBuilder); for (XmlFamilyPreference preference : familyPreferences.values()) { preference.compileConfiguration(); } } int familyCount() { return familyPreferences.size(); } public XmlFamilyPreference getFamilyPreference(String familyId) { return familyPreferences.get(familyId); } /** * Construction des objets � partir du fichier XML. */ private static class PreferenceBuilder implements ClientContentHandler { private Map<String, XmlFamilyPreference> result = new HashMap<String, XmlFamilyPreference>(); private XmlFamilyPreference xmlFamilyPreference; private List<String> arguments; private List<String> functions; private DefaultConfigBuilder dcBuilder; private DefaultConfigBuilder scBuilder; private ResultConfigBuilder rcBuilder; private VarFieldBuilder varBuilder = new VarFieldBuilder(); private String classFilterName; public void startElement(String name, Map attributes) { if ("family-list".equals(name)) { return; } if ("family".equals(name)) { String id = (String)attributes.get("id"); String root = (String)attributes.get("root"); String destination = (String)attributes.get("destination"); dcBuilder = new DefaultConfigBuilder("delete-config", destination); scBuilder = new DefaultConfigBuilder("select-config", root); rcBuilder = new ResultConfigBuilder(destination); varBuilder = new VarFieldBuilder(); xmlFamilyPreference = new XmlFamilyPreference(id, root, destination); result.put(id, xmlFamilyPreference); } else if ("arguments".equals(name)) { arguments = new ArrayList<String>(); } else if ("functions".equals(name)) { functions = new ArrayList<String>(); } else if ("select-filter".equals(name)) { classFilterName = (String)attributes.get("class"); } dcBuilder.startElement(name, attributes); scBuilder.startElement(name, attributes); rcBuilder.startElement(name, attributes); varBuilder.startElement(name, attributes); } public void endElement(String name, String value) { if ("arguments".equals(name)) { xmlFamilyPreference.setArgumentNameList(arguments); } else if ("name".equals(name)) { arguments.add(value); } else if ("holder".equals(name)) { functions.add(value); } else if ("functions".equals(name)) { xmlFamilyPreference.setFunctionHolderClassList(functions); } else if ("select-filter".equals(name)) { try { RowFilter filter = (RowFilter)Class.forName(classFilterName).newInstance(); xmlFamilyPreference.setFilter(filter); } catch (Exception error) { LOG.debug("Impossible d'instancier le filtre " + classFilterName, error); } } //do nothing if: where-clause, delete-config, select-config, result-config dcBuilder.endElement(name, value); scBuilder.endElement(name, value); rcBuilder.endElement(name, value); varBuilder.endElement(name, value); if ("family".equals(name)) { xmlFamilyPreference.setDeleteConfig(dcBuilder.getConfig()); xmlFamilyPreference.setSelectConfig(scBuilder.getConfig()); xmlFamilyPreference.setResultConfig(rcBuilder.getConfig()); xmlFamilyPreference.setResultColumns(rcBuilder.getTableColumns()); xmlFamilyPreference.setVariables(varBuilder.getVariables()); } } } }