1*db859879SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*db859879SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*db859879SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*db859879SAndrew Rist  * distributed with this work for additional information
6*db859879SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*db859879SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*db859879SAndrew Rist  * "License"); you may not use this file except in compliance
9*db859879SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*db859879SAndrew Rist  *
11*db859879SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*db859879SAndrew Rist  *
13*db859879SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*db859879SAndrew Rist  * software distributed under the License is distributed on an
15*db859879SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*db859879SAndrew Rist  * KIND, either express or implied.  See the License for the
17*db859879SAndrew Rist  * specific language governing permissions and limitations
18*db859879SAndrew Rist  * under the License.
19*db859879SAndrew Rist  *
20*db859879SAndrew Rist  *************************************************************/
21*db859879SAndrew Rist 
22*db859879SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package com.sun.star.xml.security.uno;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import org.w3c.dom.Node;
27cdf0e10cSrcweir import com.sun.star.xml.sax.XDocumentHandler;
28cdf0e10cSrcweir import org.w3c.dom.Attr;
29cdf0e10cSrcweir import org.w3c.dom.NamedNodeMap;
30cdf0e10cSrcweir 
31cdf0e10cSrcweir /*
32cdf0e10cSrcweir  * this class is used to parse a document into SAX events
33cdf0e10cSrcweir  */
34cdf0e10cSrcweir class ParsingThread
35cdf0e10cSrcweir {
36cdf0e10cSrcweir 	/*
37cdf0e10cSrcweir 	 * the Node which will be handled with in the next step
38cdf0e10cSrcweir 	 */
39cdf0e10cSrcweir 	private Node m_node;
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 	/*
42cdf0e10cSrcweir 	 * the event to be handled in the next step.
43cdf0e10cSrcweir 	 * true means endElement event, false otherwise.
44cdf0e10cSrcweir 	 */
45cdf0e10cSrcweir 	private boolean m_bIsEndEvent;
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 	/*
48cdf0e10cSrcweir 	 * the document handler which receives generated SAX events
49cdf0e10cSrcweir 	 */
50cdf0e10cSrcweir 	private XDocumentHandler m_xDocumentHandler;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 	/*
53cdf0e10cSrcweir 	 * the TestTool which receives UI feedbacks
54cdf0e10cSrcweir 	 */
55cdf0e10cSrcweir 	private TestTool m_testTool;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 
ParsingThread(Node node, XDocumentHandler xDocumentHandler, TestTool testTool)58cdf0e10cSrcweir         ParsingThread(Node node, XDocumentHandler xDocumentHandler, TestTool testTool)
59cdf0e10cSrcweir         {
60cdf0e10cSrcweir         	m_node = node;
61cdf0e10cSrcweir         	m_xDocumentHandler = xDocumentHandler;
62cdf0e10cSrcweir         	m_testTool = testTool;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir         	m_bIsEndEvent = false;
65cdf0e10cSrcweir         }
66cdf0e10cSrcweir 
67cdf0e10cSrcweir         /*
68cdf0e10cSrcweir          * changes the document handler.
69cdf0e10cSrcweir          */
setHandler(XDocumentHandler xDocumentHandler)70cdf0e10cSrcweir         protected void setHandler(XDocumentHandler xDocumentHandler)
71cdf0e10cSrcweir         {
72cdf0e10cSrcweir         	this.m_xDocumentHandler = xDocumentHandler;
73cdf0e10cSrcweir         }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir         /*
76cdf0e10cSrcweir          * sends the next SAX event.
77cdf0e10cSrcweir          * when there is no further step, then false is returned,
78cdf0e10cSrcweir          * otherwise, true returned.
79cdf0e10cSrcweir          */
nextStep()80cdf0e10cSrcweir         protected boolean nextStep()
81cdf0e10cSrcweir         {
82cdf0e10cSrcweir         	boolean rc = true;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir         	try
85cdf0e10cSrcweir         	{
86cdf0e10cSrcweir 	        	String message;
87cdf0e10cSrcweir 			int type = m_node.getNodeType();
88cdf0e10cSrcweir 			if (!m_bIsEndEvent)
89cdf0e10cSrcweir 			/*
90cdf0e10cSrcweir 			 * the next event is not a endElement event.
91cdf0e10cSrcweir 			 */
92cdf0e10cSrcweir 			{
93cdf0e10cSrcweir 				switch (type)
94cdf0e10cSrcweir 				{
95cdf0e10cSrcweir 				case Node.DOCUMENT_NODE: /* startDocument */
96cdf0e10cSrcweir 					m_testTool.updatesCurrentSAXEventInformation("startDocument");
97cdf0e10cSrcweir 					m_xDocumentHandler.startDocument();
98cdf0e10cSrcweir 					m_testTool.updatesUIs();
99cdf0e10cSrcweir 					break;
100cdf0e10cSrcweir 				case Node.ELEMENT_NODE: /* startElement */
101cdf0e10cSrcweir 					String nodeName = m_node.getNodeName();
102cdf0e10cSrcweir 					message = "startElement:"+nodeName;
103cdf0e10cSrcweir 					NamedNodeMap attrs = m_node.getAttributes();
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 					AttributeListHelper attributeListHelper = new AttributeListHelper();
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 					int length = attrs.getLength();
108cdf0e10cSrcweir 					for (int i=0; i<length; ++i)
109cdf0e10cSrcweir 					{
110cdf0e10cSrcweir 						Attr attr = (Attr)attrs.item(i);
111cdf0e10cSrcweir 						attributeListHelper.setAttribute(attr.getName(), "CDATA", attr.getValue());
112cdf0e10cSrcweir 						message += " "+attr.getName()+"='"+attr.getValue()+"'";
113cdf0e10cSrcweir 					}
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 					m_testTool.updatesCurrentSAXEventInformation(message);
116cdf0e10cSrcweir 					m_xDocumentHandler.startElement(m_node.getNodeName(), attributeListHelper);
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 					m_testTool.updatesUIs();
119cdf0e10cSrcweir 					break;
120cdf0e10cSrcweir 				case Node.TEXT_NODE: /* characters */
121cdf0e10cSrcweir 					message = m_node.getNodeValue();
122cdf0e10cSrcweir 					if (message != null)
123cdf0e10cSrcweir 					{
124cdf0e10cSrcweir 						m_testTool.updatesCurrentSAXEventInformation("characters:"+message);
125cdf0e10cSrcweir 						m_xDocumentHandler.characters(message);
126cdf0e10cSrcweir 						m_testTool.updatesUIs();
127cdf0e10cSrcweir 					}
128cdf0e10cSrcweir 					break;
129cdf0e10cSrcweir 				case Node.COMMENT_NODE: /* comment */
130cdf0e10cSrcweir 					break;
131cdf0e10cSrcweir 				case Node.PROCESSING_INSTRUCTION_NODE: /* PI */
132cdf0e10cSrcweir 					m_testTool.updatesCurrentSAXEventInformation("processingInstruction:"+m_node.getNodeName()+" "+m_node.getNodeValue());
133cdf0e10cSrcweir 					m_xDocumentHandler.processingInstruction(m_node.getNodeName(), m_node.getNodeValue());
134cdf0e10cSrcweir 					m_testTool.updatesUIs();
135cdf0e10cSrcweir 					break;
136cdf0e10cSrcweir 				}
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 				/*
139cdf0e10cSrcweir 				 * figures out the event for the next step.
140cdf0e10cSrcweir 				 */
141cdf0e10cSrcweir 				switch (type)
142cdf0e10cSrcweir 				{
143cdf0e10cSrcweir 					case Node.DOCUMENT_NODE:
144cdf0e10cSrcweir 					case Node.ELEMENT_NODE:
145cdf0e10cSrcweir 						if (m_node.hasChildNodes())
146cdf0e10cSrcweir 						/*
147cdf0e10cSrcweir 						 * for a Document node or an Element node,
148cdf0e10cSrcweir 						 * if the node has children, then the next event will be for its
149cdf0e10cSrcweir 						 * first child node.
150cdf0e10cSrcweir 						 */
151cdf0e10cSrcweir 						{
152cdf0e10cSrcweir 							m_node = m_node.getFirstChild();
153cdf0e10cSrcweir 						}
154cdf0e10cSrcweir 						else
155cdf0e10cSrcweir 						/*
156cdf0e10cSrcweir 						 * otherwise, the next event will be endElement.
157cdf0e10cSrcweir 						 */
158cdf0e10cSrcweir 						{
159cdf0e10cSrcweir 							m_bIsEndEvent = true;
160cdf0e10cSrcweir 						}
161cdf0e10cSrcweir 						break;
162cdf0e10cSrcweir 					case Node.TEXT_NODE:
163cdf0e10cSrcweir 					case Node.PROCESSING_INSTRUCTION_NODE:
164cdf0e10cSrcweir 					case Node.COMMENT_NODE:
165cdf0e10cSrcweir 						Node nextNode = m_node.getNextSibling();
166cdf0e10cSrcweir 						if (nextNode != null)
167cdf0e10cSrcweir 						/*
168cdf0e10cSrcweir 						 * for other kinds of node,
169cdf0e10cSrcweir 						 * if it has a next sibling, then the next event will be for that
170cdf0e10cSrcweir 						 * sibling.
171cdf0e10cSrcweir 						 */
172cdf0e10cSrcweir 						{
173cdf0e10cSrcweir 							m_node = nextNode;
174cdf0e10cSrcweir 						}
175cdf0e10cSrcweir 						else
176cdf0e10cSrcweir 						/*
177cdf0e10cSrcweir 						 * otherwise, the next event will be the endElement for the node's
178cdf0e10cSrcweir 						 * parent node.
179cdf0e10cSrcweir 						 */
180cdf0e10cSrcweir 						{
181cdf0e10cSrcweir 							m_node = m_node.getParentNode();
182cdf0e10cSrcweir 							m_bIsEndEvent = true;
183cdf0e10cSrcweir 						}
184cdf0e10cSrcweir 						break;
185cdf0e10cSrcweir 				}
186cdf0e10cSrcweir 			}
187cdf0e10cSrcweir 			else
188cdf0e10cSrcweir 			/*
189cdf0e10cSrcweir 			 * the next event is an endElement event.
190cdf0e10cSrcweir 			 */
191cdf0e10cSrcweir 			{
192cdf0e10cSrcweir 				switch (type)
193cdf0e10cSrcweir 				{
194cdf0e10cSrcweir 					case Node.DOCUMENT_NODE: /* endDocument */
195cdf0e10cSrcweir 						m_testTool.updatesCurrentSAXEventInformation("endDocument");
196cdf0e10cSrcweir 						m_xDocumentHandler.endDocument();
197cdf0e10cSrcweir 						m_testTool.updatesUIs();
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 						/*
200cdf0e10cSrcweir 						 * no further steps.
201cdf0e10cSrcweir 						 */
202cdf0e10cSrcweir 						rc = false;
203cdf0e10cSrcweir 						break;
204cdf0e10cSrcweir 					case Node.ELEMENT_NODE: /* endElement */
205cdf0e10cSrcweir 						m_testTool.updatesCurrentSAXEventInformation("endElement:"+m_node.getNodeName());
206cdf0e10cSrcweir 						m_xDocumentHandler.endElement(m_node.getNodeName());
207cdf0e10cSrcweir 						m_testTool.updatesUIs();
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 						Node nextNode = m_node.getNextSibling();
210cdf0e10cSrcweir 						if (nextNode != null)
211cdf0e10cSrcweir 						/*
212cdf0e10cSrcweir 						 * if the node has a next sibling, then the next event will be the
213cdf0e10cSrcweir 						 * start event for that sibling node.
214cdf0e10cSrcweir 						 */
215cdf0e10cSrcweir 						{
216cdf0e10cSrcweir 							m_node = nextNode;
217cdf0e10cSrcweir 							m_bIsEndEvent = false;
218cdf0e10cSrcweir 						}
219cdf0e10cSrcweir 						else
220cdf0e10cSrcweir 						/*
221cdf0e10cSrcweir 						 * otherwise, the next event will be the endElement for the node's
222cdf0e10cSrcweir 						 * parent node.
223cdf0e10cSrcweir 						 */
224cdf0e10cSrcweir 						{
225cdf0e10cSrcweir 							m_node = m_node.getParentNode();
226cdf0e10cSrcweir 						}
227cdf0e10cSrcweir 						break;
228cdf0e10cSrcweir 				}
229cdf0e10cSrcweir 			}
230cdf0e10cSrcweir 		}
231cdf0e10cSrcweir 		catch(  com.sun.star.xml.sax.SAXException e)
232cdf0e10cSrcweir 		{
233cdf0e10cSrcweir 			e.printStackTrace();
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 			/*
236cdf0e10cSrcweir 			 * forces to end.
237cdf0e10cSrcweir 			 */
238cdf0e10cSrcweir 			rc = false;
239cdf0e10cSrcweir 		}
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 		return rc;
242cdf0e10cSrcweir 	}
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245