001 /*
002 * Copyright (c) 2007 Henri Sivonen
003 * Copyright (c) 2008 Mozilla Foundation
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a
006 * copy of this software and associated documentation files (the "Software"),
007 * to deal in the Software without restriction, including without limitation
008 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
009 * and/or sell copies of the Software, and to permit persons to whom the
010 * Software is furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
018 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
020 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
021 * DEALINGS IN THE SOFTWARE.
022 */
023
024 package nu.validator.saxtree;
025
026 import java.util.List;
027
028 import org.xml.sax.Attributes;
029 import org.xml.sax.Locator;
030 import org.xml.sax.SAXException;
031 import org.xml.sax.helpers.AttributesImpl;
032
033 /**
034 * An element.
035 * @version $Id$
036 * @author hsivonen
037 */
038 public final class Element extends ParentNode {
039
040 /**
041 * The namespace URI.
042 */
043 private final String uri;
044
045 /**
046 * The local name.
047 */
048 private final String localName;
049
050 /**
051 * The qualified name.
052 */
053 private final String qName;
054
055 /**
056 * The attributes.
057 */
058 private final Attributes attributes;
059
060 /**
061 * The namespace prefix mappings.
062 */
063 private final List<PrefixMapping> prefixMappings;
064
065 /**
066 * The contructor.
067 * @param locator the locator.
068 * @param uri the namespace URI
069 * @param localName the local name
070 * @param qName the qualified name
071 * @param atts the attributes
072 * @param retainAttributes <code>true</code> to retain the attributes instead of copying
073 * @param prefixMappings the prefix mappings
074 */
075 public Element(Locator locator, String uri, String localName, String qName,
076 Attributes atts, boolean retainAttributes,
077 List<PrefixMapping> prefixMappings) {
078 super(locator);
079 this.uri = uri;
080 this.localName = localName;
081 this.qName = qName;
082 if (retainAttributes) {
083 this.attributes = atts;
084 } else {
085 this.attributes = new AttributesImpl(atts);
086 }
087 this.prefixMappings = prefixMappings;
088 }
089
090 /**
091 *
092 * @see nu.validator.saxtree.Node#visit(nu.validator.saxtree.TreeParser)
093 */
094 @Override
095 void visit(TreeParser treeParser) throws SAXException {
096 if (prefixMappings != null) {
097 for (PrefixMapping mapping : prefixMappings) {
098 treeParser.startPrefixMapping(mapping.getPrefix(),
099 mapping.getUri(), this);
100 }
101 }
102 treeParser.startElement(uri, localName, qName, attributes, this);
103 }
104
105 /**
106 * @see nu.validator.saxtree.Node#revisit(nu.validator.saxtree.TreeParser)
107 */
108 @Override
109 void revisit(TreeParser treeParser) throws SAXException {
110 treeParser.endElement(uri, localName, qName, endLocator);
111 if (prefixMappings != null) {
112 for (PrefixMapping mapping : prefixMappings) {
113 treeParser.endPrefixMapping(mapping.getPrefix(), endLocator);
114 }
115 }
116 }
117
118 /**
119 * Returns the attributes.
120 *
121 * @return the attributes
122 */
123 public Attributes getAttributes() {
124 return attributes;
125 }
126
127 /**
128 * Returns the localName.
129 *
130 * @return the localName
131 */
132 public String getLocalName() {
133 return localName;
134 }
135
136 /**
137 * Returns the prefixMappings.
138 *
139 * @return the prefixMappings
140 */
141 public List<PrefixMapping> getPrefixMappings() {
142 return prefixMappings;
143 }
144
145 /**
146 * Returns the qName.
147 *
148 * @return the qName
149 */
150 public String getQName() {
151 return qName;
152 }
153
154 /**
155 * Returns the uri.
156 *
157 * @return the uri
158 */
159 public String getUri() {
160 return uri;
161 }
162
163 /**
164 *
165 * @see nu.validator.saxtree.Node#getNodeType()
166 */
167 @Override
168 public NodeType getNodeType() {
169 return NodeType.ELEMENT;
170 }
171
172 }