KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > xml2 > NamespaceContextImpl


1 /*
2  * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
3  *
4  * This file is part of Resin(R) Open Source
5  *
6  * Each copy or derived work must preserve the copyright notice and this
7  * notice unmodified.
8  *
9  * Resin Open Source is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Resin Open Source is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17  * of NON-INFRINGEMENT. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Resin Open Source; if not, write to the
22  *
23  * Free Software Foundation, Inc.
24  * 59 Temple Place, Suite 330
25  * Boston, MA 02111-1307 USA
26  *
27  * @author Adam Megacz
28  */

29
30 package com.caucho.xml2;
31
32 import com.caucho.vfs.WriteStream;
33
34 import javax.xml.XMLConstants JavaDoc;
35 import javax.xml.namespace.NamespaceContext JavaDoc;
36 import javax.xml.namespace.QName JavaDoc;
37 import java.io.IOException JavaDoc;
38 import java.util.ArrayList JavaDoc;
39 import java.util.HashMap JavaDoc;
40 import java.util.Iterator JavaDoc;
41 import java.util.Map JavaDoc;
42
43 /**
44  * Maintains a stack of namespace contexts
45  */

46 public class NamespaceContextImpl
47 {
48   // The current namespace bindings
49
private final HashMap JavaDoc<String JavaDoc,NamespaceBinding> _bindings
50     = new HashMap JavaDoc<String JavaDoc,NamespaceBinding>();
51
52   // The stack of element bindings
53
private ElementBinding []_stack = new ElementBinding[32];
54   private int _stackTop;
55
56   private NamespaceBinding _nullEltBinding;
57   private NamespaceBinding _nullAttrBinding;
58
59   private int _uniqueId = 0;
60   private int _version = 0;
61
62   NamespaceContextImpl()
63   {
64     _nullEltBinding = new NamespaceBinding(null, null, 0);
65     _nullAttrBinding = new NamespaceBinding(null, null, 0);
66     
67     _stackTop = 1;
68   }
69
70   /**
71    * Creates a new subcontext and enters it
72    */

73   public void push(SaxIntern.Entry entry)
74   {
75     ElementBinding elt = _stack[_stackTop];
76     
77     if (elt == null) {
78       elt = new ElementBinding();
79       _stack[_stackTop] = elt;
80     }
81     
82     _stackTop++;
83
84     elt.setName(entry);
85   }
86
87   /**
88    * deletes the current context and enters its parent
89    */

90   public void pop(SaxIntern.Entry entry)
91   {
92     ElementBinding eltBinding = _stack[--_stackTop];
93
94     if (eltBinding != null) {
95       ArrayList JavaDoc<Decl> oldBinding = eltBinding.getOldBindingList();
96
97       for (int i = 0; oldBinding != null && i < oldBinding.size(); i++) {
98     Decl decl = oldBinding.get(i);
99     NamespaceBinding binding = decl.getBinding();
100
101     _version++;
102     
103     binding.setUri(decl.getOldUri());
104     binding.setVersion(_version);
105       }
106
107       eltBinding.clear();
108     }
109   }
110
111   public int getDepth()
112   {
113     return _stackTop - 1;
114   }
115
116   /**
117    * declares a new namespace prefix in the current context
118    */

119   public void declare(String JavaDoc prefix, String JavaDoc uri)
120   {
121     NamespaceBinding binding = getElementNamespace(prefix);
122
123     ElementBinding eltBinding = _stack[_stackTop - 1];
124
125     if (eltBinding == null) {
126       eltBinding = new ElementBinding();
127       
128       _stack[_stackTop - 1] = eltBinding;
129     }
130
131     eltBinding.addOldBinding(binding, prefix, binding.getUri(), uri);
132
133     _version++;
134     binding.setUri(uri);
135     binding.setVersion(_version);
136   }
137
138   /**
139    * declares a new namespace prefix in the current context; the
140    * auto-allocated prefix is returned
141    */

142   public String JavaDoc declare(String JavaDoc uri)
143   {
144     String JavaDoc prefix = "ns"+ _uniqueId++;
145     
146     declare(prefix, uri);
147     
148     return prefix;
149   }
150
151   /**
152    * looks up the prefix, returns the uri it corresponds to
153    */

154   public String JavaDoc getUri(String JavaDoc prefix)
155   {
156     NamespaceBinding binding = _bindings.get(prefix);
157
158     if (binding != null)
159       return binding.getUri();
160     else
161       return null;
162   }
163
164   public String JavaDoc getNamespaceURI(String JavaDoc prefix)
165   {
166     NamespaceBinding binding = _bindings.get(prefix);
167
168     if (binding != null)
169       return binding.getUri();
170
171     String JavaDoc uri = null;
172     
173     if (XMLConstants.XML_NS_PREFIX.equals(prefix))
174       uri = XMLConstants.XML_NS_URI;
175     else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
176       uri = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
177
178     return uri;
179   }
180
181   public Iterator JavaDoc getPrefixes(String JavaDoc uri)
182   {
183     return null;
184   }
185
186   public String JavaDoc getUri(int i)
187   {
188     ElementBinding eltBinding = _stack[_stackTop - 1];
189
190     if (eltBinding != null) {
191       return eltBinding.getOldBindingList().get(i).getNewUri();
192     }
193     else
194       return null;
195   }
196   
197   public String JavaDoc getPrefix(int i)
198   {
199     ElementBinding eltBinding = _stack[_stackTop - 1];
200
201     if (eltBinding != null) {
202       return eltBinding.getOldBindingList().get(i).getPrefix();
203     }
204
205     return null;
206   }
207   
208   public int getNumDecls()
209   {
210     ElementBinding eltBinding = _stack[_stackTop - 1];
211
212     if (eltBinding != null)
213       return eltBinding.getOldBindingList().size();
214     else
215       return 0;
216   }
217
218   NamespaceBinding getElementNamespace(String JavaDoc prefix)
219   {
220     NamespaceBinding binding;
221
222     if (prefix == null)
223       binding = _nullEltBinding;
224     else
225       binding = _bindings.get(prefix);
226
227     if (binding != null)
228       return binding;
229     else {
230       binding = new NamespaceBinding(prefix, null, _version);
231
232       _bindings.put(prefix, binding);
233
234       return binding;
235     }
236   }
237
238   NamespaceBinding getAttributeNamespace(String JavaDoc prefix)
239   {
240     NamespaceBinding binding;
241
242     if (prefix == null)
243       binding = _nullAttrBinding;
244     else
245       binding = _bindings.get(prefix);
246
247     if (binding != null)
248       return binding;
249     else {
250       binding = new NamespaceBinding(prefix, null, _version);
251
252       _bindings.put(prefix, binding);
253
254       return binding;
255     }
256   }
257   
258   static class ElementBinding
259   {
260     private SaxIntern.Entry _name;
261     private ArrayList JavaDoc<Decl> _declList;
262
263     public void setName(SaxIntern.Entry name)
264     {
265       _name = name;
266     }
267
268     public SaxIntern.Entry getName()
269     {
270       return _name;
271     }
272     
273     public void addOldBinding(NamespaceBinding binding, String JavaDoc prefix,
274                   String JavaDoc oldUri, String JavaDoc newUri)
275     {
276       if (_declList == null)
277     _declList = new ArrayList JavaDoc<Decl>();
278
279       _declList.add(new Decl(binding, prefix, oldUri, newUri));
280     }
281
282     public ArrayList JavaDoc<Decl> getOldBindingList()
283     {
284       return _declList;
285     }
286
287     public void clear()
288     {
289       _declList = null;
290     }
291   }
292
293   static class Decl {
294     private final NamespaceBinding _binding;
295     private final String JavaDoc _prefix;
296     private final String JavaDoc _oldUri;
297     private final String JavaDoc _newUri;
298
299     Decl(NamespaceBinding binding, String JavaDoc prefix,
300      String JavaDoc oldUri, String JavaDoc newUri)
301     {
302       _binding = binding;
303       _prefix = prefix;
304       _oldUri = oldUri;
305       _newUri = newUri;
306     }
307
308     NamespaceBinding getBinding()
309     {
310       return _binding;
311     }
312
313     String JavaDoc getPrefix()
314     {
315       return _prefix;
316     }
317
318     String JavaDoc getOldUri()
319     {
320       return _oldUri;
321     }
322
323     String JavaDoc getNewUri()
324     {
325       return _newUri;
326     }
327   }
328 }
329
Popular Tags