package name.pehl.totoe.xml.client.internal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import name.pehl.totoe.commons.client.WhitespaceHandling; import name.pehl.totoe.xml.client.Attribute; import name.pehl.totoe.xml.client.Element; import name.pehl.totoe.xml.client.HasText; import name.pehl.totoe.xml.client.Node; import name.pehl.totoe.xml.client.NodeType; import com.google.gwt.core.client.JavaScriptObject; /** * @author $Author$ * @version $Date$ $Revision: 174 * $ */ public class ElementImpl extends NodeImpl implements Element { // ----------------------------------------------------------- constructors protected ElementImpl(JavaScriptObject jso) { super(jso); } // ------------------------------------------------------------- attributes @Override public Attribute getAttribute(String name) { JavaScriptObject attributeJso = getAttributeImpl(name); return NodeFactory.create(attributeJso); } private native JavaScriptObject getAttributeImpl(String name) /*-{ var element = this.@name.pehl.totoe.xml.client.internal.NodeImpl::jso; return element.getAttributeNode(name); }-*/; @Override public String getAttributeValue(String name) { Attribute attribute = getAttribute(name); if (attribute != null) { return attribute.getText(); } return null; } @Override public boolean hasAttribute(String name) { Map<String, String> values = getAttributeValues(); return values.containsKey(name); } @Override public List<Attribute> getAttributes() { List<Attribute> result = new ArrayList<Attribute>(); List<JavaScriptObject> jsos = new ArrayList<JavaScriptObject>(); getAttributesImpl(jsos); for (JavaScriptObject jso : jsos) { result.add((Attribute) NodeFactory.create(jso)); } return result; } private native void getAttributesImpl(List<JavaScriptObject> result)/*-{ var element = this.@name.pehl.totoe.xml.client.internal.NodeImpl::jso; if (element.attributes != null && element.attributes.length != 0) { for ( var i = 0; i < element.attributes.length; i++) { result.@java.util.List::add(Ljava/lang/Object;)(element.attributes[i]); } } }-*/; @Override public Map<String, String> getAttributeValues() { Map<String, String> attrributeValues = new HashMap<String, String>(); List<Attribute> attributes = getAttributes(); for (Attribute attribute : attributes) { String name = attribute.getName(); if (name != null && name.length() != 0) { attrributeValues.put(name, attribute.getText()); } } return attrributeValues; } @Override public boolean hasAttributes() { return !getAttributes().isEmpty(); } // --------------------------------------------------------------- children @Override public List<Node> getChildren() { return XmlParserUtils.getChildren(jso); } @Override public <T extends Node> List<T> getChildren(NodeType type) { return XmlParserUtils.getChildren(jso, type); } @Override public boolean hasChildren() { return XmlParserUtils.hasChildren(jso); } @Override public boolean hasChildren(NodeType type) { return XmlParserUtils.hasChildren(jso, type); } @Override public Node getFirstChild() { return XmlParserUtils.getFirstChild(jso); } @Override public Node getLastChild() { return XmlParserUtils.getLastChild(jso); } // ------------------------------------------------------------------- text /** * Returns the text of the first child in case the first child implements * {@link HasText}. In all other cases this method returns <code>null</code> * . * * @return the text of the first child in case the first child implements * {@link HasText}, <code>null</code> otherwise. * @see name.pehl.totoe.xml.client.HasText#getText() */ @Override public String getText() { return XmlParserUtils.getTextFromFirstChild(this); } @Override public String getText(WhitespaceHandling whitespaceHandling) { return XmlParserUtils.stripWhitespace(getText(), whitespaceHandling); } }