1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 package com.sun.star.xml.security.uno;
29 
30 import org.w3c.dom.Node;
31 import org.w3c.dom.NamedNodeMap;
32 import org.w3c.dom.Attr;
33 import org.w3c.dom.NodeList;
34 import java.io.IOException;
35 import java.io.FileOutputStream;
36 
37 /* uno classes */
38 import com.sun.star.xml.sax.XDocumentHandler;
39 import com.sun.star.xml.sax.XAttributeList;
40 
41 /*
42  * The SAXEventPrinter class is used to print out received
43  * SAX event stream.
44  */
45 class SAXEventPrinter implements XDocumentHandler
46 {
47 	/*
48 	 * how many spaces as the indent of line
49 	 */
50 	private int m_nIndent;
51 
52 	/*
53 	 * whether a NEW LINE character need to be appended to
54 	 * each line
55 	 */
56 	private boolean m_bIsFormatted;
57 
58 	/*
59 	 * the output stream to write
60 	 */
61 	private FileOutputStream m_fileOutputStream;
62 
63 	SAXEventPrinter(FileOutputStream fileOutputStream, boolean isFormatted)
64 	{
65 		m_nIndent = 0;
66 		m_fileOutputStream = fileOutputStream;
67 		m_bIsFormatted = isFormatted;
68 	}
69 
70 	protected static void outputIndent(int m_nIndent, FileOutputStream fileOutputStream)
71 		throws IOException
72 	{
73 		for (int i=0; i<m_nIndent; ++i)
74 		{
75 			fileOutputStream.write(" ".getBytes());
76 		}
77 	}
78 
79 	/*
80 	 * displays the tree of a Node.
81 	 */
82 	protected static void display(Node node, int indent, FileOutputStream fileOutputStream, boolean isFormatted)
83 		throws IOException
84 	{
85 		if (node != null)
86 		{
87 			int type = node.getNodeType();
88 			String message;
89 			NodeList children;
90 			int i, length;
91 
92 			switch (type)
93 			{
94 			case Node.DOCUMENT_NODE:
95 				children = node.getChildNodes();
96 				length = children.getLength();
97 				for (i=0; i<length; ++i)
98 				{
99 					display(children.item(i), indent+2, fileOutputStream, isFormatted);
100 				}
101 
102 				break;
103 
104 			case Node.ELEMENT_NODE:
105 				message = new String("<"+node.getNodeName());
106 				NamedNodeMap attrs = node.getAttributes();
107 
108 				length = attrs.getLength();
109 				for (i=0; i<length; ++i)
110 				{
111 					Attr attr = (Attr)attrs.item(i);
112 					message += " "+attr.getNodeName()+"=\""+attr.getNodeValue()+"\"";
113 				}
114 
115 				message += ">";
116 
117 				if (isFormatted)
118 				{
119 					outputIndent(indent, fileOutputStream);
120 				}
121 
122 				fileOutputStream.write(message.getBytes("UTF-8"));
123 
124 				if (isFormatted)
125 				{
126 					fileOutputStream.write("\n".getBytes());
127 				}
128 
129 				children = node.getChildNodes();
130 				length = children.getLength();
131 				for (i=0; i<length; ++i)
132 				{
133 					display(children.item(i), indent+2, fileOutputStream, isFormatted);
134 				}
135 
136 				if (isFormatted)
137 				{
138 					outputIndent(indent, fileOutputStream);
139 				}
140 
141 				fileOutputStream.write("</".getBytes());
142 				fileOutputStream.write(node.getNodeName().getBytes("UTF-8"));
143 				fileOutputStream.write(">".getBytes());
144 
145 				if (isFormatted)
146 				{
147 					fileOutputStream.write("\n".getBytes());
148 				}
149 
150 				break;
151 
152 			case Node.TEXT_NODE:
153 				message = node.getNodeValue();
154 				if (message != null )
155 				{
156 					if (isFormatted)
157 					{
158 						outputIndent(indent, fileOutputStream);
159 					}
160 
161 					fileOutputStream.write(node.getNodeValue().getBytes("UTF-8"));
162 
163 					if (isFormatted)
164 					{
165 						fileOutputStream.write("\n".getBytes());
166 					}
167 				}
168 				break;
169 
170 			case Node.PROCESSING_INSTRUCTION_NODE:
171 				if (isFormatted)
172 				{
173 					outputIndent(indent, fileOutputStream);
174 				}
175 
176 				fileOutputStream.write("<?".getBytes());
177 				fileOutputStream.write(node.getNodeName().getBytes("UTF-8"));
178 				fileOutputStream.write(node.getNodeValue().getBytes("UTF-8"));
179 				fileOutputStream.write("?>".getBytes());
180 
181 				if (isFormatted)
182 				{
183 					fileOutputStream.write("\n".getBytes());
184 				}
185 
186 				break;
187 			default:
188 				break;
189 			}
190 		}
191 	}
192 
193 	/*
194 	 * XDocumentHandler
195 	 */
196 	public void  startDocument ()
197 	{
198 	}
199 
200 	public void endDocument()
201 	{
202 	}
203 
204 	public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs)
205 	{
206 		try
207 		{
208 			String message;
209 
210 			message = new String("<"+str);
211 			if (xattribs !=null)
212 			{
213 				int length = xattribs.getLength();
214 				for (short i=0; i<length; ++i)
215 				{
216 					message += " "+xattribs.getNameByIndex(i)+"=\""+xattribs.getValueByIndex(i)+"\"";
217 				}
218 			}
219 			message += ">";
220 
221 			if (m_bIsFormatted)
222 			{
223 				outputIndent(m_nIndent, m_fileOutputStream);
224 			}
225 
226 			m_fileOutputStream.write(message.getBytes("UTF-8"));
227 
228 			if (m_bIsFormatted)
229 			{
230 				m_fileOutputStream.write("\n".getBytes());
231 			}
232 
233 			m_nIndent += 2;
234 		}
235 		catch (IOException e)
236 		{
237 			e.printStackTrace();
238 		}
239 	}
240 
241 	public void endElement(String str)
242 	{
243 		try
244 		{
245 			m_nIndent -= 2;
246 			if (m_bIsFormatted)
247 			{
248 				outputIndent(m_nIndent, m_fileOutputStream);
249 			}
250 
251 			m_fileOutputStream.write("</".getBytes());
252 			m_fileOutputStream.write(str.getBytes("UTF-8"));
253 			m_fileOutputStream.write(">".getBytes());
254 
255 			if (m_bIsFormatted)
256 			{
257 				m_fileOutputStream.write("\n".getBytes());
258 			}
259 		}
260 		catch (IOException e)
261 		{
262 			e.printStackTrace();
263 		}
264 	}
265 
266 	public void characters(String str)
267 	{
268 		try
269 		{
270 			if (m_bIsFormatted)
271 			{
272 				outputIndent(m_nIndent, m_fileOutputStream);
273 			}
274 
275 			m_fileOutputStream.write(str.getBytes("UTF-8"));
276 
277 			if (m_bIsFormatted)
278 			{
279 				m_fileOutputStream.write("\n".getBytes());
280 			}
281 		}
282 		catch (IOException e)
283 		{
284 			e.printStackTrace();
285 		}
286 	}
287 
288 	public void ignorableWhitespace(String str)
289 	{
290 	}
291 
292 	public void processingInstruction(String aTarget, String aData)
293 	{
294 		try
295 		{
296 			if (m_bIsFormatted)
297 			{
298 				outputIndent(m_nIndent, m_fileOutputStream);
299 			}
300 
301 			m_fileOutputStream.write("<?".getBytes());
302 			m_fileOutputStream.write(aTarget.getBytes("UTF-8"));
303 			m_fileOutputStream.write("?>".getBytes());
304 
305 			if (m_bIsFormatted)
306 			{
307 				m_fileOutputStream.write("\n".getBytes());
308 			}
309 		}
310 		catch (IOException e)
311 		{
312 			e.printStackTrace();
313 		}
314 	}
315 
316 	public void setDocumentLocator (com.sun.star.xml.sax.XLocator xLocator )
317 		throws com.sun.star.xml.sax.SAXException
318 	{
319 	}
320 }
321