sascha@286: package de.intevation.flys.client.server.meta; sascha@286: sascha@286: import org.w3c.dom.Document; sascha@286: import org.w3c.dom.Element; sascha@286: import org.w3c.dom.Node; sascha@286: import org.w3c.dom.NodeList; sascha@813: import org.w3c.dom.Attr; sascha@813: import org.w3c.dom.NamedNodeMap; sascha@813: ingo@1367: import org.apache.log4j.Logger; sascha@286: sascha@286: import de.intevation.flys.client.shared.model.DataCageTree; sascha@286: import de.intevation.flys.client.shared.model.DataCageNode; sascha@813: import de.intevation.flys.client.shared.model.AttrList; sascha@286: sascha@286: import java.util.ArrayList; sascha@286: import java.util.Map; sascha@286: import java.util.HashMap; sascha@286: sascha@812: import de.intevation.artifacts.common.utils.XMLUtils; sascha@812: sascha@286: public class Converter sascha@286: { ingo@1367: private static final Logger logger = Logger.getLogger(Converter.class); ingo@1367: ingo@1367: sascha@286: public interface NodeConverter sascha@286: { sascha@286: DataCageNode convert(Element node, Converter converter); sascha@286: sascha@286: } // interface NodeConverter sascha@286: sascha@286: public static class NameConverter implements NodeConverter { sascha@286: public DataCageNode convert(Element node, Converter converter) { sascha@822: //System.err.println("NameConverter called"); sascha@813: DataCageNode out = new DataCageNode( sascha@813: node.getAttribute("name"), sascha@813: toAttrList(node.getAttributes())); sascha@286: converter.convertChildren(out, node); sascha@286: return out; sascha@286: } sascha@286: } // class NameConverter sascha@286: sascha@286: public static class I18NConverter implements NodeConverter { sascha@286: public DataCageNode convert(Element node, Converter converter) { sascha@822: //System.err.println("I18NConverter called"); ingo@892: ingo@892: String name = node.getLocalName(); ingo@892: String desc = node.hasAttribute("description") sascha@822: ? node.getAttribute("description") ingo@892: : "${" + name + "}"; ingo@892: sascha@286: DataCageNode out = ingo@892: new DataCageNode(name, desc, toAttrList(node.getAttributes())); ingo@892: sascha@286: converter.convertChildren(out, node); sascha@286: return out; sascha@286: } sascha@286: } // I18NConverter sascha@286: sascha@286: protected Map converters; sascha@286: sascha@286: protected void convertChildren(DataCageNode parent, Element sub) { sascha@822: //System.err.println("convertChildren called"); sascha@286: NodeList children = sub.getChildNodes(); sascha@286: for (int i = 0, N = children.getLength(); i < N; ++i) { sascha@286: Node child = children.item(i); sascha@286: if (child.getNodeType() == Node.ELEMENT_NODE) { sascha@286: String name = child.getLocalName(); sascha@286: NodeConverter converter = converters.get(name); sascha@812: if (converter == null) { sascha@812: converter = I18N_CONVERTER; sascha@286: } sascha@812: DataCageNode son = converter.convert( sascha@812: (Element)child, this); sascha@812: parent.addChild(son); sascha@286: } sascha@286: } // for all children sascha@286: } sascha@286: sascha@286: public Converter() { sascha@286: converters = new HashMap(); sascha@286: registerConverters(); sascha@286: } sascha@286: sascha@2905: public static final NodeConverter NAME_CONVERTER = new NameConverter(); sascha@2905: public static final NodeConverter I18N_CONVERTER = new I18NConverter(); sascha@812: sascha@286: protected void registerConverters() { ingo@1367: logger.debug("register converters called"); sascha@812: converters.put("river", NAME_CONVERTER); sascha@812: converters.put("gauge", NAME_CONVERTER); sascha@812: converters.put("historical", NAME_CONVERTER); sascha@812: converters.put("column", NAME_CONVERTER); sascha@286: } sascha@286: sascha@286: public DataCageTree convert(Document document) { ingo@1367: logger.debug("convert called"); sascha@812: //System.err.println(XMLUtils.toString(document)); sascha@286: sascha@286: ArrayList roots = new ArrayList(); sascha@286: NodeList nodes = document.getChildNodes(); sascha@286: for (int i = 0, N = nodes.getLength(); i < N; ++i) { sascha@286: Node node = nodes.item(i); sascha@286: if (node.getNodeType() == Node.ELEMENT_NODE) { ingo@1367: logger.debug("search for name: " + node.getLocalName()); sascha@286: NodeConverter converter = converters.get(node.getLocalName()); sascha@812: if (converter == null) { sascha@812: converter = I18N_CONVERTER; sascha@286: } sascha@812: roots.add(converter.convert((Element)node, this)); sascha@286: } sascha@286: } sascha@286: return roots.isEmpty() sascha@286: ? new DataCageTree() sascha@286: : new DataCageTree(roots.get(0)); sascha@286: } sascha@813: sascha@813: public static AttrList toAttrList(NamedNodeMap nodeMap) { sascha@813: if (nodeMap == null) { sascha@813: return null; sascha@813: } sascha@813: int N = nodeMap.getLength(); sascha@813: sascha@813: if (N == 0) { sascha@813: return null; sascha@813: } sascha@813: sascha@813: AttrList result = new AttrList(N); sascha@813: sascha@813: for (int i = 0; i < N; ++i) { sascha@813: Node node = nodeMap.item(i); sascha@813: if (node.getNodeType() == Node.ATTRIBUTE_NODE) { sascha@822: Attr attr = (Attr)node; sascha@813: String key = attr.getName(); sascha@813: String value = attr.getValue(); sascha@813: result.add(key, value); sascha@813: } sascha@813: } sascha@813: sascha@813: return result; sascha@813: } sascha@286: } sascha@286: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :