package railo.runtime.text.xml.struct; import java.lang.reflect.Method; import org.w3c.dom.Attr; import org.w3c.dom.DOMException; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.TypeInfo; import railo.runtime.exp.PageRuntimeException; import railo.runtime.op.Caster; import railo.runtime.type.Collection; import railo.runtime.type.util.ArrayUtil; /** * */ public class XMLElementStruct extends XMLNodeStruct implements Element { private Element element; /** * constructor of the class * @param element * @param caseSensitive */ protected XMLElementStruct(Element element, boolean caseSensitive) { super(element instanceof XMLElementStruct?element=((XMLElementStruct)element).getElement():element, caseSensitive); this.element=element; } @Override public String getTagName() { return element.getTagName(); } @Override public void removeAttribute(String name) throws DOMException { element.removeAttribute(name); } @Override public boolean hasAttribute(String name) { return element.hasAttribute(name); } @Override public String getAttribute(String name) { return element.getAttribute(name); } @Override public void removeAttributeNS(String namespaceURI, String localName) throws DOMException { element.removeAttributeNS(namespaceURI,localName); } @Override public void setAttribute(String name, String value) throws DOMException { element.setAttribute(name,value); } @Override public boolean hasAttributeNS(String namespaceURI, String localName) { return element.hasAttributeNS(namespaceURI,localName); } @Override public Attr getAttributeNode(String name) { return element.getAttributeNode(name); } @Override public Attr removeAttributeNode(Attr oldAttr) throws DOMException { return element.removeAttributeNode(oldAttr); } @Override public Attr setAttributeNode(Attr newAttr) throws DOMException { return element.setAttributeNode(newAttr); } @Override public Attr setAttributeNodeNS(Attr newAttr) throws DOMException { return element.setAttributeNodeNS(newAttr); } @Override public NodeList getElementsByTagName(String name) { return element.getElementsByTagName(name); } @Override public String getAttributeNS(String namespaceURI, String localName) { return element.getAttributeNS(namespaceURI,localName); } @Override public void setAttributeNS(String namespaceURI, String qualifiedName,String value) throws DOMException { element.setAttributeNS(namespaceURI,qualifiedName,value); } @Override public Attr getAttributeNodeNS(String namespaceURI, String localName) { return element.getAttributeNodeNS(namespaceURI,localName); } @Override public NodeList getElementsByTagNameNS(String namespaceURI, String localName) { return element.getElementsByTagNameNS(namespaceURI,localName); } public void setIdAttribute(String name, boolean isId) throws DOMException { // dynamic load to support jre 1.4 and 1.5 try { Method m = element.getClass().getMethod("setIdAttribute", new Class[]{name.getClass(),boolean.class}); m.invoke(element, new Object[]{name,Caster.toBoolean(isId)}); } catch (Exception e) { throw new PageRuntimeException(Caster.toPageException(e)); } } public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) throws DOMException { // dynamic load to support jre 1.4 and 1.5 try { Method m = element.getClass().getMethod("setIdAttributeNS", new Class[]{namespaceURI.getClass(),localName.getClass(),boolean.class}); m.invoke(element, new Object[]{namespaceURI,localName,Caster.toBoolean(isId)}); } catch (Exception e) { throw new PageRuntimeException(Caster.toPageException(e)); } } public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException { // dynamic load to support jre 1.4 and 1.5 try { Method m = element.getClass().getMethod("setIdAttributeNode", new Class[]{idAttr.getClass(),boolean.class}); m.invoke(element, new Object[]{idAttr,Caster.toBoolean(isId)}); } catch (Exception e) { element.setAttributeNodeNS(idAttr); } } public TypeInfo getSchemaTypeInfo() { // dynamic load to support jre 1.4 and 1.5 try { Method m = element.getClass().getMethod("getSchemaTypeInfo", new Class[]{}); return (TypeInfo) m.invoke(element, ArrayUtil.OBJECT_EMPTY); } catch (Exception e) { throw new PageRuntimeException(Caster.toPageException(e)); } } /** * @return the element */ public Element getElement() { return element; } @Override public Collection duplicate(boolean deepCopy) { return new XMLElementStruct((Element)element.cloneNode(deepCopy),caseSensitive); } @Override public Node cloneNode(boolean deep) { return new XMLElementStruct((Element)element.cloneNode(deep),caseSensitive); } }