1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html;
16
17 import org.htmlunit.SgmlPage;
18 import org.w3c.dom.Attr;
19 import org.w3c.dom.TypeInfo;
20
21
22
23
24
25
26
27
28
29
30 public class DomAttr extends DomNamespaceNode implements Attr {
31
32 private String value_;
33 private boolean specified_;
34
35
36
37
38
39
40
41
42
43
44
45 public DomAttr(final SgmlPage page, final String namespaceURI, final String qualifiedName, final String value,
46 final boolean specified) {
47 super(namespaceURI, qualifiedName, page);
48 value_ = normalizeValue(value);
49 specified_ = specified;
50 }
51
52 private static String normalizeValue(final String value) {
53 if (value != null && value.isEmpty()) {
54 return DomElement.ATTRIBUTE_VALUE_EMPTY;
55 }
56 return value;
57 }
58
59
60
61
62 @Override
63 public short getNodeType() {
64 return ATTRIBUTE_NODE;
65 }
66
67
68
69
70 @Override
71 public String getNodeName() {
72 return getName();
73 }
74
75
76
77
78 @Override
79 public String getNodeValue() {
80 return getValue();
81 }
82
83
84
85
86 @Override
87 public String getName() {
88 return getQualifiedName();
89 }
90
91
92
93
94 @Override
95 public String getValue() {
96 return value_;
97 }
98
99
100
101
102 @Override
103 public void setNodeValue(final String value) {
104 setValue(value);
105 }
106
107
108
109
110 @Override
111 public void setValue(final String value) {
112 value_ = normalizeValue(value);
113 specified_ = true;
114 }
115
116
117
118
119 @Override
120 public DomElement getOwnerElement() {
121 return (DomElement) getParentNode();
122 }
123
124
125
126
127 @Override
128 public boolean getSpecified() {
129 return specified_;
130 }
131
132
133
134
135
136 @Override
137 public TypeInfo getSchemaTypeInfo() {
138 throw new UnsupportedOperationException("DomAttr.getSchemaTypeInfo is not yet implemented.");
139 }
140
141
142
143
144 @Override
145 public boolean isId() {
146 return DomElement.ID_ATTRIBUTE.equals(getNodeName());
147 }
148
149
150
151
152 @Override
153 public String toString() {
154 return getClass().getSimpleName() + "[name=" + getNodeName() + " value=" + getNodeValue() + "]";
155 }
156
157
158
159
160 @Override
161 public String getCanonicalXPath() {
162 final DomNode parent = getParentNode();
163 if (parent == null) {
164 return "/@" + getName();
165 }
166 return parent.getCanonicalXPath() + "/@" + getName();
167 }
168
169
170
171
172 @Override
173 public String getTextContent() {
174 return getNodeValue();
175 }
176
177
178
179
180 @Override
181 public void setTextContent(final String textContent) {
182 final DomElement owner = getOwnerElement();
183 final boolean mappedElement = owner != null
184 && getOwnerDocument() instanceof HtmlPage
185 && (DomElement.NAME_ATTRIBUTE.equals(getName()) || DomElement.ID_ATTRIBUTE.equals(getName()));
186
187 final HtmlPage htmlPage = mappedElement ? (HtmlPage) getPage() : null;
188
189 if (mappedElement) {
190 htmlPage.removeMappedElement(owner, false, false);
191 }
192 setValue(textContent);
193 if (mappedElement) {
194 htmlPage.addMappedElement(owner, false);
195 }
196 }
197 }