001    package railo.runtime.text.xml.struct;
002    
003    import java.lang.reflect.Method;
004    
005    import org.w3c.dom.Attr;
006    import org.w3c.dom.DOMException;
007    import org.w3c.dom.Element;
008    import org.w3c.dom.Node;
009    import org.w3c.dom.NodeList;
010    import org.w3c.dom.TypeInfo;
011    
012    import railo.runtime.exp.PageRuntimeException;
013    import railo.runtime.op.Caster;
014    import railo.runtime.type.Collection;
015    import railo.runtime.type.util.ArrayUtil;
016    
017    
018    /**
019     * 
020     */
021    public class XMLElementStruct extends XMLNodeStruct implements Element {
022            
023            
024            private Element element;
025        
026            /**
027             * constructor of the class
028             * @param element
029             * @param caseSensitive
030             */
031            protected XMLElementStruct(Element element, boolean caseSensitive) {
032                    super(element instanceof XMLElementStruct?element=((XMLElementStruct)element).getElement():element, caseSensitive);
033            this.element=element;
034            }
035            
036            @Override
037            public String getTagName() {
038                    return element.getTagName();
039            }
040            @Override
041            public void removeAttribute(String name) throws DOMException {
042                    element.removeAttribute(name);
043            }
044            @Override
045            public boolean hasAttribute(String name) {
046                    return element.hasAttribute(name);
047            }
048            @Override
049            public String getAttribute(String name) {
050                    return element.getAttribute(name);
051            }
052            @Override
053            public void removeAttributeNS(String namespaceURI, String localName) throws DOMException {
054                    element.removeAttributeNS(namespaceURI,localName);
055            }
056            @Override
057            public void setAttribute(String name, String value) throws DOMException {
058                    element.setAttribute(name,value);
059            }
060            @Override
061            public boolean hasAttributeNS(String namespaceURI, String localName) {
062                    return element.hasAttributeNS(namespaceURI,localName);
063            }
064            @Override
065            public Attr getAttributeNode(String name) {
066                    return element.getAttributeNode(name);
067            }
068            @Override
069            public Attr removeAttributeNode(Attr oldAttr) throws DOMException {
070                    return element.removeAttributeNode(oldAttr);
071            }
072            @Override
073            public Attr setAttributeNode(Attr newAttr) throws DOMException {
074                    return element.setAttributeNode(newAttr);
075            }
076            @Override
077            public Attr setAttributeNodeNS(Attr newAttr) throws DOMException {
078                    return element.setAttributeNodeNS(newAttr);
079            }
080            @Override
081            public NodeList getElementsByTagName(String name) {
082                    return element.getElementsByTagName(name);
083            }
084            @Override
085            public String getAttributeNS(String namespaceURI, String localName) {
086                    return element.getAttributeNS(namespaceURI,localName);
087            }
088            @Override
089            public void setAttributeNS(String namespaceURI, String qualifiedName,String value) throws DOMException {
090                    element.setAttributeNS(namespaceURI,qualifiedName,value);
091            }
092            @Override
093            public Attr getAttributeNodeNS(String namespaceURI, String localName) {
094                    return element.getAttributeNodeNS(namespaceURI,localName);
095            }
096            @Override
097            public NodeList getElementsByTagNameNS(String namespaceURI, String localName) {
098                    return element.getElementsByTagNameNS(namespaceURI,localName);
099            }
100            
101        public void setIdAttribute(String name, boolean isId) throws DOMException {
102            // dynamic load to support jre 1.4 and 1.5
103                    try {
104                            Method m = element.getClass().getMethod("setIdAttribute", new Class[]{name.getClass(),boolean.class});
105                            m.invoke(element, new Object[]{name,Caster.toBoolean(isId)});
106                    } 
107                    catch (Exception e) {
108                            throw new PageRuntimeException(Caster.toPageException(e));
109                    }
110        }
111        
112        public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) throws DOMException {
113            // dynamic load to support jre 1.4 and 1.5
114                    try {
115                            Method m = element.getClass().getMethod("setIdAttributeNS", new Class[]{namespaceURI.getClass(),localName.getClass(),boolean.class});
116                            m.invoke(element, new Object[]{namespaceURI,localName,Caster.toBoolean(isId)});
117                    } 
118                    catch (Exception e) {
119                            throw new PageRuntimeException(Caster.toPageException(e));
120                    }
121        }
122        
123        public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException {
124            // dynamic load to support jre 1.4 and 1.5
125                    try {
126                            Method m = element.getClass().getMethod("setIdAttributeNode", new Class[]{idAttr.getClass(),boolean.class});
127                            m.invoke(element, new Object[]{idAttr,Caster.toBoolean(isId)});
128                    } 
129                    catch (Exception e) {
130                    element.setAttributeNodeNS(idAttr);
131                    }
132        }
133        
134            public TypeInfo getSchemaTypeInfo() {
135            // dynamic load to support jre 1.4 and 1.5
136                    try {
137                            Method m = element.getClass().getMethod("getSchemaTypeInfo", new Class[]{});
138                            return (TypeInfo) m.invoke(element, ArrayUtil.OBJECT_EMPTY);
139                    } 
140                    catch (Exception e) {
141                            throw new PageRuntimeException(Caster.toPageException(e));
142                    }
143            }
144            /**
145             * @return the element
146             */
147            public Element getElement() {
148                    return element;
149            }
150            
151            @Override
152            public Collection duplicate(boolean deepCopy) {
153                    return new XMLElementStruct((Element)element.cloneNode(deepCopy),caseSensitive);
154            }
155            
156    
157            @Override
158            public Node cloneNode(boolean deep) {
159                    return new XMLElementStruct((Element)element.cloneNode(deep),caseSensitive);
160            }
161    }