View Javadoc

1   /*   Copyright 2004 BEA Systems, Inc.
2    *
3    *   Licensed under the Apache License, Version 2.0 (the "License");
4    *   you may not use this file except in compliance with the License.
5    *   You may obtain a copy of the License at
6    *
7    *       http://www.apache.org/licenses/LICENSE-2.0
8    *
9    *   Unless required by applicable law or agreed to in writing, software
10   *   distributed under the License is distributed on an "AS IS" BASIS,
11   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   *   See the License for the specific language governing permissions and
13   *   limitations under the License.
14   */
15  
16  package com.bea.xml.stream;
17  
18  import com.bea.xml.stream.util.ElementTypeNames;
19  
20  import java.util.Iterator;
21  import javax.xml.namespace.NamespaceContext;
22  
23  import javax.xml.stream.XMLStreamWriter;
24  import javax.xml.stream.XMLEventWriter;
25  import javax.xml.stream.util.XMLEventConsumer;
26  import javax.xml.stream.XMLEventReader;
27  import javax.xml.stream.XMLStreamException;
28  import javax.xml.stream.events.XMLEvent;
29  import javax.xml.stream.events.StartElement;
30  import javax.xml.stream.events.ProcessingInstruction;
31  import javax.xml.stream.events.Comment;
32  import javax.xml.stream.events.EndElement;
33  import javax.xml.stream.events.Namespace;
34  import javax.xml.stream.events.Characters;
35  import javax.xml.stream.events.StartDocument;
36  import javax.xml.stream.events.EndDocument;
37  import javax.xml.stream.events.Namespace;
38  import javax.xml.stream.events.Attribute;
39  import javax.xml.stream.events.EntityReference;
40  import javax.xml.stream.events.DTD;
41  
42  /***
43   * <p> The base writer class </p>
44   */
45  
46  public class XMLEventWriterBase 
47    implements XMLEventWriter, XMLEventConsumer
48  {
49    XMLStreamWriter writer;
50  
51    public XMLEventWriterBase(XMLStreamWriter writer) {
52      this.writer = writer;
53    }
54  
55    public void flush() 
56      throws XMLStreamException 
57    {
58      writer.flush();
59    }
60  
61    public void close() 
62      throws XMLStreamException 
63    {
64      writer.close();
65    }
66  
67    private void addStartElement(StartElement se) 
68      throws XMLStreamException 
69    {
70      String prefix = se.getName().getPrefix();
71      String namespace = se.getName().getNamespaceURI();
72      String localName = se.getName().getLocalPart();
73      writer.writeStartElement(prefix,localName,namespace);
74      Iterator ni = se.getNamespaces();
75      while (ni.hasNext()) {
76        writeNamespace((Namespace)ni.next());
77      }
78  
79      Iterator ai = se.getAttributes();
80      while (ai.hasNext()) {
81        writeAttribute((Attribute) ai.next());
82      }
83  
84    }
85  
86    private void addEndElement(EndElement ee) 
87      throws XMLStreamException 
88    {
89      String prefix = ee.getName().getPrefix();
90      String namespace = ee.getName().getNamespaceURI();
91      String localName = ee.getName().getLocalPart();
92      writer.writeEndElement();
93    }
94  
95    public void addCharacters(Characters cd) 
96      throws XMLStreamException
97    {
98      if (cd.isCData())
99        writer.writeCData(cd.getData());
100     else
101       writer.writeCharacters(cd.getData());
102   }
103 
104   public void addEntityReference(EntityReference er) 
105     throws XMLStreamException
106   {
107     writer.writeEntityRef(er.getName());
108   }
109 
110   public void addProcessingInstruction(ProcessingInstruction pi) 
111     throws XMLStreamException
112   {
113     writer.writeProcessingInstruction(pi.getTarget(),
114                                       pi.getData());
115   }
116 
117   public void addComment(Comment c) 
118     throws XMLStreamException
119   {
120     writer.writeComment(c.getText());
121   }
122 
123   public void addStartDocument(StartDocument sd)
124     throws XMLStreamException
125   {
126     String encoding = sd.getCharacterEncodingScheme();
127     String version = sd.getVersion();
128     boolean standalone = sd.isStandalone();
129     writer.writeStartDocument(encoding,version);
130   }
131 
132   public void addEndDocument(EndDocument ed)
133     throws XMLStreamException
134   {
135 
136   }
137 
138   private void writeAttribute(Attribute a) 
139     throws XMLStreamException
140   {
141     writer.writeAttribute(a.getName().getNamespaceURI(),
142                           a.getName().getLocalPart(),
143                           a.getValue());
144   }
145   public void addAttribute(Attribute a)
146     throws XMLStreamException
147   {
148     writeAttribute(a);
149   }
150 
151   public void writeNamespace(Namespace n) 
152     throws XMLStreamException
153   {
154     if (n.isDefaultNamespaceDeclaration())
155       writer.writeDefaultNamespace(n.getNamespaceURI());
156     else
157       writer.writeNamespace(n.getPrefix(),
158                             n.getNamespaceURI());
159   }
160   public void addNamespace(Namespace ns)
161     throws XMLStreamException
162   {
163     writeNamespace(ns);
164   }
165 
166   public void addDTD(DTD dtd)
167     throws XMLStreamException
168   {
169     writer.writeDTD(dtd.getDocumentTypeDeclaration());
170   }
171 
172   public void add(XMLEvent e) 
173     throws XMLStreamException 
174   {
175     switch(e.getEventType()) {
176     case XMLEvent.START_ELEMENT: 
177       addStartElement((StartElement) e);
178       break;
179     case XMLEvent.END_ELEMENT:  
180       addEndElement((EndElement) e) ;
181       break;
182     case XMLEvent.CHARACTERS:  
183       addCharacters((Characters) e);
184       break;
185     case XMLEvent.ENTITY_REFERENCE:  
186       addEntityReference((EntityReference) e);
187       break;
188     case XMLEvent.PROCESSING_INSTRUCTION:  
189       addProcessingInstruction((ProcessingInstruction) e);
190       break;
191     case XMLEvent.COMMENT:  
192       addComment((Comment) e);
193       break;
194     case XMLEvent.START_DOCUMENT:  
195       addStartDocument((StartDocument) e);
196       break;
197     case XMLEvent.END_DOCUMENT:  
198       addEndDocument((EndDocument) e); 
199       break;
200     case XMLEvent.ATTRIBUTE:  
201       addAttribute((Attribute) e);
202       break;
203     case XMLEvent.NAMESPACE:  
204       addNamespace((Namespace) e);
205       break;
206     case XMLEvent.DTD:
207       addDTD((DTD) e);
208       break;
209     default:
210       throw new XMLStreamException("Unable to add event["+
211                                    ElementTypeNames.getEventTypeString(e.getEventType())+"]");
212     }
213   }
214 
215   public void add(XMLEventReader stream) 
216     throws XMLStreamException 
217   {
218     while(stream.hasNext())
219       add(stream.nextEvent());
220   }
221 
222   public String getPrefix(String uri) 
223     throws XMLStreamException 
224   {
225     return writer.getPrefix(uri);
226   }
227   
228   public void setPrefix(String prefix, String uri) 
229     throws XMLStreamException 
230   {
231     writer.setPrefix(prefix,uri);
232   }
233 
234   public void setDefaultNamespace(String uri) 
235     throws XMLStreamException
236   {
237     writer.setDefaultNamespace(uri);
238   }
239 
240   public void setNamespaceContext(NamespaceContext context) 
241     throws XMLStreamException
242   {
243     writer.setNamespaceContext(context);
244   }
245 
246   public NamespaceContext getNamespaceContext() {
247     return writer.getNamespaceContext();
248   }
249   public static void main(String args[]) 
250     throws Exception 
251   {
252     System.setProperty("javax.xml.stream.XMLInputFactory", 
253                        "com.bea.xml.stream.MXParserFactory");
254     System.setProperty("javax.xml.stream.XMLEventFactory", 
255                        "com.bea.xml.stream.EventFactory");
256 
257     java.io.Writer w = new java.io.OutputStreamWriter(System.out);
258     XMLEventWriterBase writer = 
259       new XMLEventWriterBase(new XMLWriterBase(w));
260     
261     MXParser parser = new MXParser();
262     parser.setConfigurationContext(new ConfigurationContextBase());
263     parser.setInput(new java.io.FileReader(args[0]));
264     
265     XMLEventReaderBase reader = new XMLEventReaderBase(parser);
266     
267     while(reader.hasNext()) {
268       XMLEvent e= reader.nextEvent();
269       System.out.println("about to add:["+e+"];");
270       writer.add(e);
271     }
272     writer.flush();
273   }
274 }