View Javadoc

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