/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.gui.preference;
import net.codjo.expression.help.FunctionHelp;
import net.codjo.mad.client.request.CommandRequest;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.client.request.Row;
import net.codjo.mad.common.structure.StructureReader;
import net.codjo.mad.gui.request.util.RequestHelper;
import net.codjo.xml.XmlException;
import net.codjo.xml.fast.ClientContentHandler;
import net.codjo.xml.fast.XmlParser;
import net.codjo.util.string.StringUtil;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.InputSource;
/**
* Classe responsable de la creation PreferenceGuiManager
*
* @version $Revision: 1.6 $
*/
public class PreferenceGuiManagerFactory {
private PreferenceGuiManager preferenceGuiManager;
public PreferenceGuiManagerFactory(StructureReader madReader)
throws RequestException, IOException, XmlException {
Row rs = RequestHelper.sendSimpleRequest(new CommandRequest("getSegmentationConfig"));
String xmlFile = rs.getField(0).getValue();
XmlParser xmlParser = new XmlParser();
DBStructureMad mad = new DBStructureMad();
mad.setMad(madReader);
ManagerBuilder builder = new ManagerBuilder(mad);
xmlParser.parse(new InputSource(new StringReader(xmlFile)), builder);
preferenceGuiManager = builder.preferenceGuiManager;
}
public PreferenceGuiManager getPreferenceGuiManager() {
return preferenceGuiManager;
}
private static class ManagerBuilder implements ClientContentHandler {
private PreferenceGui pref = null;
private PreferenceGuiManager preferenceGuiManager = new PreferenceGuiManager();
private List<FunctionHelp> help;
private DBStructureVariable variables;
private DBStructureFilter filters;
private DBStructureMad mad;
private Map<String, String> columns;
private boolean inTablesNode;
ManagerBuilder(DBStructureMad mad) {
this.mad = mad;
}
public void startElement(String name, Map attributes) {
if ("family".equals(name)) {
String id = (String)attributes.get("id");
pref = new PreferenceGui(id);
variables = new DBStructureVariable();
filters = new DBStructureFilter();
columns = new LinkedHashMap<String, String>();
}
else if ("tables".equals(name)) {
inTablesNode = true;
}
else if ("table".equals(name) && inTablesNode) {
pref.addTable((String)attributes.get("name"));
}
else if ("help".equals(name)) {
help = new ArrayList<FunctionHelp>();
}
else if ("function".equals(name)) {
String funcName = (String)attributes.get("name");
int nbArg = Integer.valueOf((String)attributes.get("arg"));
String funcHelp = (String)attributes.get("help");
help.add(new FunctionHelp(funcName, nbArg, funcHelp));
}
else if ("variable".equals(name)) {
String var = (String)attributes.get("name");
String label = (String)attributes.get("label");
variables.addVariable(var, label);
}
else if ("filter".equals(name)) {
String table = (String)attributes.get("table");
String column = (String)attributes.get("column");
filters.addFilter(table, column);
}
else if ("column".equals(name)) {
columns.put((String)attributes.get("label"), StringUtil.sqlToJavaName((String)attributes.get("value")));
}
}
public void endElement(String name, String value) {
if ("family".equals(name)) {
filters.setSubDBStructure(variables);
variables.setSubDBStructure(mad);
pref.setStructure(filters);
pref.setResultColumns(columns);
preferenceGuiManager.addPreference(pref);
pref = null;
}
else if ("help".equals(name)) {
pref.setAllFunctionsHelp(help);
}
else if ("variables".equals(name)) {
pref.addTable(DBStructureVariable.VAR_TABLE);
}
else if ("tables".equals(name)) {
inTablesNode = false;
}
else if ("requetor".equals(name)) {
pref.setResultRequetor(value);
}
}
}
}