View Javadoc

1   package org.codehaus.xfire.util;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   import java.util.Stack;
6   
7   import javax.xml.namespace.NamespaceContext;
8   import javax.xml.namespace.QName;
9   import javax.xml.stream.Location;
10  import javax.xml.stream.XMLStreamException;
11  import javax.xml.stream.XMLStreamReader;
12  
13  import org.codehaus.yom.Attribute;
14  import org.codehaus.yom.Element;
15  import org.codehaus.yom.Node;
16  import org.codehaus.yom.Text;
17  
18  public class ElementStreamReader
19      implements XMLStreamReader
20  {
21      public Map properties = new HashMap();
22      
23      private Stack frames = new Stack();
24      private ElementFrame frame;
25      private String text;
26      private int currentEvent;
27      
28      public class ElementFrame
29      {
30          Element element;
31          
32          boolean started = false;
33          boolean ended = false;
34          
35          int currentChild = -1;
36          int currentAttribute = -1;
37          int currentNamespace = -1;
38      }
39  
40      public ElementStreamReader(Element e)
41      {
42          frame = new ElementFrame();
43          frame.element = e;
44          frames.push(this.frame);
45      }
46      
47      public Object getProperty(String key)
48          throws IllegalArgumentException
49      {
50          return properties.get(key);
51      }
52  
53      public int next()
54          throws XMLStreamException
55      {
56          if (!frame.started)
57          {
58              frame.started = true;
59              currentEvent = START_ELEMENT;
60          }
61          else if (frame.currentAttribute < frame.element.getAttributeCount() - 1)
62          {
63              frame.currentAttribute++;
64              currentEvent = ATTRIBUTE;            
65          }
66          else if (frame.currentNamespace < frame.element.getNamespaceDeclarationCount() - 1)
67          {
68              frame.currentNamespace++;
69              currentEvent = NAMESPACE;
70          }
71          else if (frame.currentChild < frame.element.getChildCount() - 1)
72          {
73              frame.currentChild++;
74              Node currentChildNode = frame.element.getChild(frame.currentChild);
75              
76              if (currentChildNode instanceof Text)
77              {
78                  text = currentChildNode.getValue();
79                  currentEvent = CHARACTERS;
80              }
81              else if (currentChildNode instanceof Element)
82              {
83                  ElementFrame newFrame = new ElementFrame();
84                  newFrame.element = (Element) currentChildNode;
85                  newFrame.started = true;
86                  frame = newFrame;
87                  frames.push(this.frame);
88                  
89                  currentEvent = START_ELEMENT;
90              }
91              else
92              {
93                  throw new RuntimeException("Unknown node type: " + 
94                                             currentChildNode.getClass().getName());
95              }
96          }
97          else
98          {
99              frame = (ElementFrame) frames.pop();
100             
101             currentEvent = END_ELEMENT;
102         }
103          
104         return currentEvent;
105     }
106 
107     public void require(int arg0, String arg1, String arg2)
108         throws XMLStreamException
109     {
110         // TODO Auto-generated method stub
111         
112     }
113 
114     public String getElementText()
115         throws XMLStreamException
116     {
117         return text;
118     }
119 
120     public int nextTag()
121         throws XMLStreamException
122     {
123         while (hasNext())
124         {
125             if (START_ELEMENT == next()) return START_ELEMENT;
126         }
127         
128         return currentEvent;
129     }
130 
131     public boolean hasNext()
132         throws XMLStreamException
133     {
134         return !(frames.size() == 0 && currentEvent == -1);
135     }
136 
137     public void close()
138         throws XMLStreamException
139     {
140     }
141 
142     public String getNamespaceURI(String prefix)
143     {
144         return frame.element.getNamespaceURI(prefix);
145     }
146 
147     public boolean isStartElement()
148     {
149         return (currentEvent == START_ELEMENT);
150     }
151 
152     public boolean isEndElement()
153     {
154         return (currentEvent == END_ELEMENT);
155     }
156 
157     public boolean isCharacters()
158     {
159         return (currentEvent == CHARACTERS);
160     }
161 
162     public boolean isWhiteSpace()
163     {
164         return (currentEvent == SPACE);
165     }
166 
167     public String getAttributeValue(String ns, String local)
168     {
169         Attribute att = frame.element.getAttribute(local, ns);
170         if (att != null) return att.getValue();
171         
172         return null;
173     }
174 
175     public int getAttributeCount()
176     {
177         return frame.element.getAttributeCount();
178     }
179 
180     public QName getAttributeName(int index)
181     {
182         Attribute att = frame.element.getAttribute(index);
183         
184         String local = att.getLocalName();
185         String prefix = att.getNamespacePrefix();
186         String ns = att.getNamespaceURI();
187         
188         if (ns != null)
189         {
190             if (prefix != null)
191             {
192                 return new QName(ns, local, prefix);
193             }
194             else
195             {
196                 return new QName(ns, local);
197             }
198         }
199         
200         return new QName(local);
201     }
202 
203     public String getAttributeNamespace(int index)
204     {
205         return frame.element.getAttribute(index).getNamespaceURI();
206     }
207 
208     public String getAttributeLocalName(int index)
209     {
210         return frame.element.getAttribute(index).getLocalName();
211     }
212 
213     public String getAttributePrefix(int index)
214     {
215         return frame.element.getAttribute(index).getNamespacePrefix();
216     }
217 
218     public String getAttributeType(int index)
219     {
220         // TODO Auto-generated method stub
221         return null;
222     }
223 
224     public String getAttributeValue(int index)
225     {
226         return frame.element.getAttribute(index).getValue();
227     }
228 
229     public boolean isAttributeSpecified(int index)
230     {
231         // TODO Auto-generated method stub
232         return false;
233     }
234 
235     public int getNamespaceCount()
236     {
237         return frame.element.getNamespaceDeclarationCount();
238     }
239 
240     public String getNamespacePrefix(int ns)
241     {
242         return frame.element.getNamespacePrefix(ns);
243     }
244 
245     public String getNamespaceURI(int count)
246     {
247         Element e = frame.element;
248         return e.getNamespaceURI(e.getNamespacePrefix(count));
249     }
250 
251     public NamespaceContext getNamespaceContext()
252     {
253         throw new UnsupportedOperationException();
254     }
255 
256     public int getEventType()
257     {
258         return currentEvent;
259     }
260 
261     public String getText()
262     {
263         return text;
264     }
265 
266     public char[] getTextCharacters()
267     {
268         return text.toCharArray();
269     }
270 
271     public int getTextCharacters(int arg0, char[] arg1, int arg2, int arg3)
272         throws XMLStreamException
273     {
274         // TODO Auto-generated method stub
275         return 0;
276     }
277 
278     public int getTextStart()
279     {
280         // TODO Auto-generated method stub
281         return 0;
282     }
283 
284     public int getTextLength()
285     {
286         // TODO Auto-generated method stub
287         return 0;
288     }
289 
290     public String getEncoding()
291     {
292         return null;
293     }
294 
295     public boolean hasText()
296     {
297         // TODO Auto-generated method stub
298         return false;
299     }
300 
301     public Location getLocation()
302     {
303         return null;
304     }
305 
306     public QName getName()
307     {
308         String local = frame.element.getLocalName();
309         String prefix = frame.element.getNamespacePrefix();
310         String ns = frame.element.getNamespaceURI();
311         
312         if (ns != null)
313         {
314             if (prefix != null)
315             {
316                 return new QName(ns, local, prefix);
317             }
318             else
319             {
320                 return new QName(ns, local);
321             }
322         }
323         
324         return new QName(local);
325     }
326 
327     public String getLocalName()
328     {
329         return frame.element.getLocalName();
330     }
331 
332     public boolean hasName()
333     {
334         return (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT);
335     }
336 
337     public String getNamespaceURI()
338     {
339         return frame.element.getNamespaceURI();
340     }
341 
342     public String getPrefix()
343     {
344         return frame.element.getNamespacePrefix();
345     }
346 
347     public String getVersion()
348     {
349         return null;
350     }
351 
352     public boolean isStandalone()
353     {
354         return false;
355     }
356 
357     public boolean standaloneSet()
358     {
359         // TODO Auto-generated method stub
360         return false;
361     }
362 
363     public String getCharacterEncodingScheme()
364     {
365         // TODO Auto-generated method stub
366         return null;
367     }
368 
369     public String getPITarget()
370     {
371         // TODO Auto-generated method stub
372         return null;
373     }
374 
375     public String getPIData()
376     {
377         // TODO Auto-generated method stub
378         return null;
379     }
380 
381 }