Clover coverage report - dom4j - 1.6.1 Coverage timestamp: ma mei 16 2005 14:23:01 GMT+01:00 FRAMES NO FRAMES |
file stats: | LOC: | 310 |  | Methods: | 13
| NCLOC: | 117 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
QNameCache.java | 77,3% | 78,6% | 76,9% | 78% |

1 |  | /*
2 |  | * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3 |  | *
4 |  | * This software is open source.
5 |  | * See the bottom of this file for the licence.
6 |  | */
7 |  |
8 |  | package org.dom4j.tree;
9 |  |
10 |  | import java.util.ArrayList;
11 |  | import java.util.Collections;
12 |  | import java.util.HashMap;
13 |  | import java.util.Iterator;
14 |  | import java.util.List;
15 |  | import java.util.Map;
16 |  | import java.util.WeakHashMap;
17 |  |
18 |  | import org.dom4j.DocumentFactory;
19 |  | import org.dom4j.Namespace;
20 |  | import org.dom4j.QName;
21 |  |
22 |  | /**
23 |  | * <p>
24 |  | * <code>QNameCache</code> caches instances of <code>QName</code> for reuse
25 |  | * both across documents and within documents.
26 |  | * </p>< < < < < < < QNameCache.java
27 |  | *
28 |  | * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
29 |  | * @version $Revision: 1.16 $ =======
30 |  | *
31 |  | * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
32 |  | * @version $Revision: 1.16 $ >>>>>>> 1.15
33 |  | */
34 |  | public class QNameCache {
35 |  | /** Cache of {@link QName}instances with no namespace */
36 |  | protected Map noNamespaceCache = Collections
37 |  | .synchronizedMap(new WeakHashMap());
38 |  |
39 |  | /**
40 |  | * Cache of {@link Map}instances indexed by namespace which contain caches
41 |  | * of {@link QName}for each name
42 |  | */
43 |  | protected Map namespaceCache = Collections
44 |  | .synchronizedMap(new WeakHashMap());
45 |  |
46 |  | /**
47 |  | * The document factory associated with new QNames instances in this cache
48 |  | * or null if no instances should be associated by default
49 |  | */
50 |  | private DocumentFactory documentFactory;
51 |  |
52 | 90 | public QNameCache() {
53 |  | }
54 |  |
55 | 544 | public QNameCache(DocumentFactory documentFactory) {
56 | 544 | this.documentFactory = documentFactory;
57 |  | }
58 |  |
59 |  | /**
60 |  | * Returns a list of all the QName instances currently used
61 |  | *
62 |  | * @return DOCUMENT ME!
63 |  | */
64 | 1 | public List getQNames() {
65 | 1 | List answer = new ArrayList();
66 | 1 | answer.addAll(noNamespaceCache.values());
67 |  |
68 | 1 | for (Iterator it = namespaceCache.values().iterator(); it.hasNext();) {
69 | 10 | Map map = (Map) it.next();
70 | 10 | answer.addAll(map.values());
71 |  | }
72 |  |
73 | 1 | return answer;
74 |  | }
75 |  |
76 |  | /**
77 |  | * DOCUMENT ME!
78 |  | *
79 |  | * @param name
80 |  | * DOCUMENT ME!
81 |  | *
82 |  | * @return the QName for the given name and no namepsace
83 |  | */
84 | 26755 | public QName get(String name) {
85 | 26755 | QName answer = null;
86 |  |
87 | 26755 | if (name != null) {
88 | 26631 | answer = (QName) noNamespaceCache.get(name);
89 |  | } else {
90 | 124 | name = "";
91 |  | }
92 |  |
93 | 26755 | if (answer == null) {
94 | 1065 | answer = createQName(name);
95 | 1065 | answer.setDocumentFactory(documentFactory);
96 | 1065 | noNamespaceCache.put(name, answer);
97 |  | }
98 |  |
99 | 26755 | return answer;
100 |  | }
101 |  |
102 |  | /**
103 |  | * DOCUMENT ME!
104 |  | *
105 |  | * @param name
106 |  | * DOCUMENT ME!
107 |  | * @param namespace
108 |  | * DOCUMENT ME!
109 |  | *
110 |  | * @return the QName for the given local name and namepsace
111 |  | */
112 | 105078 | public QName get(String name, Namespace namespace) {
113 | 105078 | Map cache = getNamespaceCache(namespace);
114 | 105078 | QName answer = null;
115 |  |
116 | 105078 | if (name != null) {
117 | 105054 | answer = (QName) cache.get(name);
118 |  | } else {
119 | 24 | name = "";
120 |  | }
121 |  |
122 | 105078 | if (answer == null) {
123 | 1595 | answer = createQName(name, namespace);
124 | 1595 | answer.setDocumentFactory(documentFactory);
125 | 1595 | cache.put(name, answer);
126 |  | }
127 |  |
128 | 105078 | return answer;
129 |  | }
130 |  |
131 |  | /**
132 |  | * DOCUMENT ME!
133 |  | *
134 |  | * @param localName
135 |  | * DOCUMENT ME!
136 |  | * @param namespace
137 |  | * DOCUMENT ME!
138 |  | * @param qName
139 |  | * DOCUMENT ME!
140 |  | *
141 |  | * @return the QName for the given local name, qualified name and namepsace
142 |  | */
143 | 0 | public QName get(String localName, Namespace namespace, String qName) {
144 | 0 | Map cache = getNamespaceCache(namespace);
145 | 0 | QName answer = null;
146 |  |
147 | 0 | if (localName != null) {
148 | 0 | answer = (QName) cache.get(localName);
149 |  | } else {
150 | 0 | localName = "";
151 |  | }
152 |  |
153 | 0 | if (answer == null) {
154 | 0 | answer = createQName(localName, namespace, qName);
155 | 0 | answer.setDocumentFactory(documentFactory);
156 | 0 | cache.put(localName, answer);
157 |  | }
158 |  |
159 | 0 | return answer;
160 |  | }
161 |  |
162 | 30 | public QName get(String qualifiedName, String uri) {
163 | 30 | int index = qualifiedName.indexOf(':');
164 |  |
165 | 30 | if (index < 0) {
166 | 26 | return get(qualifiedName, Namespace.get(uri));
167 |  | } else {
168 | 4 | String name = qualifiedName.substring(index + 1);
169 | 4 | String prefix = qualifiedName.substring(0, index);
170 |  |
171 | 4 | return get(name, Namespace.get(prefix, uri));
172 |  | }
173 |  | }
174 |  |
175 |  | /**
176 |  | * DOCUMENT ME!
177 |  | *
178 |  | * @param qname
179 |  | * DOCUMENT ME!
180 |  | *
181 |  | * @return the cached QName instance if there is one or adds the given qname
182 |  | * to the cache if not
183 |  | */
184 | 0 | public QName intern(QName qname) {
185 | 0 | return get(qname.getName(), qname.getNamespace(), qname
186 |  | .getQualifiedName());
187 |  | }
188 |  |
189 |  | /**
190 |  | * DOCUMENT ME!
191 |  | *
192 |  | * @param namespace
193 |  | * DOCUMENT ME!
194 |  | *
195 |  | * @return the cache for the given namespace. If one does not currently
196 |  | * exist it is created.
197 |  | */
198 | 105078 | protected Map getNamespaceCache(Namespace namespace) {
199 | 105078 | if (namespace == Namespace.NO_NAMESPACE) {
200 | 84795 | return noNamespaceCache;
201 |  | }
202 |  |
203 | 20283 | Map answer = null;
204 |  |
205 | 20283 | if (namespace != null) {
206 | 20283 | answer = (Map) namespaceCache.get(namespace);
207 |  | }
208 |  |
209 | 20283 | if (answer == null) {
210 | 167 | answer = createMap();
211 | 167 | namespaceCache.put(namespace, answer);
212 |  | }
213 |  |
214 | 20283 | return answer;
215 |  | }
216 |  |
217 |  | /**
218 |  | * A factory method
219 |  | *
220 |  | * @return a newly created {@link Map}instance.
221 |  | */
222 | 167 | protected Map createMap() {
223 | 167 | return Collections.synchronizedMap(new HashMap());
224 |  | }
225 |  |
226 |  | /**
227 |  | * Factory method to create a new QName object which can be overloaded to
228 |  | * create derived QName instances
229 |  | *
230 |  | * @param name
231 |  | * DOCUMENT ME!
232 |  | *
233 |  | * @return DOCUMENT ME!
234 |  | */
235 | 1065 | protected QName createQName(String name) {
236 | 1065 | return new QName(name);
237 |  | }
238 |  |
239 |  | /**
240 |  | * Factory method to create a new QName object which can be overloaded to
241 |  | * create derived QName instances
242 |  | *
243 |  | * @param name
244 |  | * DOCUMENT ME!
245 |  | * @param namespace
246 |  | * DOCUMENT ME!
247 |  | *
248 |  | * @return DOCUMENT ME!
249 |  | */
250 | 1595 | protected QName createQName(String name, Namespace namespace) {
251 | 1595 | return new QName(name, namespace);
252 |  | }
253 |  |
254 |  | /**
255 |  | * Factory method to create a new QName object which can be overloaded to
256 |  | * create derived QName instances
257 |  | *
258 |  | * @param name
259 |  | * DOCUMENT ME!
260 |  | * @param namespace
261 |  | * DOCUMENT ME!
262 |  | * @param qualifiedName
263 |  | * DOCUMENT ME!
264 |  | *
265 |  | * @return DOCUMENT ME!
266 |  | */
267 | 0 | protected QName createQName(String name, Namespace namespace,
268 |  | String qualifiedName) {
269 | 0 | return new QName(name, namespace, qualifiedName);
270 |  | }
271 |  | }
272 |  |
273 |  |
274 |  |
275 |  | /*
276 |  | * Redistribution and use of this software and associated documentation
277 |  | * ("Software"), with or without modification, are permitted provided that the
278 |  | * following conditions are met:
279 |  | *
280 |  | * 1. Redistributions of source code must retain copyright statements and
281 |  | * notices. Redistributions must also contain a copy of this document.
282 |  | *
283 |  | * 2. Redistributions in binary form must reproduce the above copyright notice,
284 |  | * this list of conditions and the following disclaimer in the documentation
285 |  | * and/or other materials provided with the distribution.
286 |  | *
287 |  | * 3. The name "DOM4J" must not be used to endorse or promote products derived
288 |  | * from this Software without prior written permission of MetaStuff, Ltd. For
289 |  | * written permission, please contact dom4j-info@metastuff.com.
290 |  | *
291 |  | * 4. Products derived from this Software may not be called "DOM4J" nor may
292 |  | * "DOM4J" appear in their names without prior written permission of MetaStuff,
293 |  | * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
294 |  | *
295 |  | * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
296 |  | *
297 |  | * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
298 |  | * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
299 |  | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
300 |  | * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
301 |  | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
302 |  | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
303 |  | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
304 |  | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
305 |  | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
306 |  | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
307 |  | * POSSIBILITY OF SUCH DAMAGE.
308 |  | *
309 |  | * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
310 |  | */