xref: /trunk/main/xmlsecurity/tools/uno/ParsingThread.java (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 com.sun.star.xml.sax.XDocumentHandler;
32 import org.w3c.dom.Attr;
33 import org.w3c.dom.NamedNodeMap;
34 
35 /*
36  * this class is used to parse a document into SAX events
37  */
38 class ParsingThread
39 {
40     /*
41      * the Node which will be handled with in the next step
42      */
43     private Node m_node;
44 
45     /*
46      * the event to be handled in the next step.
47      * true means endElement event, false otherwise.
48      */
49     private boolean m_bIsEndEvent;
50 
51     /*
52      * the document handler which receives generated SAX events
53      */
54     private XDocumentHandler m_xDocumentHandler;
55 
56     /*
57      * the TestTool which receives UI feedbacks
58      */
59     private TestTool m_testTool;
60 
61 
62         ParsingThread(Node node, XDocumentHandler xDocumentHandler, TestTool testTool)
63         {
64             m_node = node;
65             m_xDocumentHandler = xDocumentHandler;
66             m_testTool = testTool;
67 
68             m_bIsEndEvent = false;
69         }
70 
71         /*
72          * changes the document handler.
73          */
74         protected void setHandler(XDocumentHandler xDocumentHandler)
75         {
76             this.m_xDocumentHandler = xDocumentHandler;
77         }
78 
79         /*
80          * sends the next SAX event.
81          * when there is no further step, then false is returned,
82          * otherwise, true returned.
83          */
84         protected boolean nextStep()
85         {
86             boolean rc = true;
87 
88             try
89             {
90                 String message;
91             int type = m_node.getNodeType();
92             if (!m_bIsEndEvent)
93             /*
94              * the next event is not a endElement event.
95              */
96             {
97                 switch (type)
98                 {
99                 case Node.DOCUMENT_NODE: /* startDocument */
100                     m_testTool.updatesCurrentSAXEventInformation("startDocument");
101                     m_xDocumentHandler.startDocument();
102                     m_testTool.updatesUIs();
103                     break;
104                 case Node.ELEMENT_NODE: /* startElement */
105                     String nodeName = m_node.getNodeName();
106                     message = "startElement:"+nodeName;
107                     NamedNodeMap attrs = m_node.getAttributes();
108 
109                     AttributeListHelper attributeListHelper = new AttributeListHelper();
110 
111                     int length = attrs.getLength();
112                     for (int i=0; i<length; ++i)
113                     {
114                         Attr attr = (Attr)attrs.item(i);
115                         attributeListHelper.setAttribute(attr.getName(), "CDATA", attr.getValue());
116                         message += " "+attr.getName()+"='"+attr.getValue()+"'";
117                     }
118 
119                     m_testTool.updatesCurrentSAXEventInformation(message);
120                     m_xDocumentHandler.startElement(m_node.getNodeName(), attributeListHelper);
121 
122                     m_testTool.updatesUIs();
123                     break;
124                 case Node.TEXT_NODE: /* characters */
125                     message = m_node.getNodeValue();
126                     if (message != null)
127                     {
128                         m_testTool.updatesCurrentSAXEventInformation("characters:"+message);
129                         m_xDocumentHandler.characters(message);
130                         m_testTool.updatesUIs();
131                     }
132                     break;
133                 case Node.COMMENT_NODE: /* comment */
134                     break;
135                 case Node.PROCESSING_INSTRUCTION_NODE: /* PI */
136                     m_testTool.updatesCurrentSAXEventInformation("processingInstruction:"+m_node.getNodeName()+" "+m_node.getNodeValue());
137                     m_xDocumentHandler.processingInstruction(m_node.getNodeName(), m_node.getNodeValue());
138                     m_testTool.updatesUIs();
139                     break;
140                 }
141 
142                 /*
143                  * figures out the event for the next step.
144                  */
145                 switch (type)
146                 {
147                     case Node.DOCUMENT_NODE:
148                     case Node.ELEMENT_NODE:
149                         if (m_node.hasChildNodes())
150                         /*
151                          * for a Document node or an Element node,
152                          * if the node has children, then the next event will be for its
153                          * first child node.
154                          */
155                         {
156                             m_node = m_node.getFirstChild();
157                         }
158                         else
159                         /*
160                          * otherwise, the next event will be endElement.
161                          */
162                         {
163                             m_bIsEndEvent = true;
164                         }
165                         break;
166                     case Node.TEXT_NODE:
167                     case Node.PROCESSING_INSTRUCTION_NODE:
168                     case Node.COMMENT_NODE:
169                         Node nextNode = m_node.getNextSibling();
170                         if (nextNode != null)
171                         /*
172                          * for other kinds of node,
173                          * if it has a next sibling, then the next event will be for that
174                          * sibling.
175                          */
176                         {
177                             m_node = nextNode;
178                         }
179                         else
180                         /*
181                          * otherwise, the next event will be the endElement for the node's
182                          * parent node.
183                          */
184                         {
185                             m_node = m_node.getParentNode();
186                             m_bIsEndEvent = true;
187                         }
188                         break;
189                 }
190             }
191             else
192             /*
193              * the next event is an endElement event.
194              */
195             {
196                 switch (type)
197                 {
198                     case Node.DOCUMENT_NODE: /* endDocument */
199                         m_testTool.updatesCurrentSAXEventInformation("endDocument");
200                         m_xDocumentHandler.endDocument();
201                         m_testTool.updatesUIs();
202 
203                         /*
204                          * no further steps.
205                          */
206                         rc = false;
207                         break;
208                     case Node.ELEMENT_NODE: /* endElement */
209                         m_testTool.updatesCurrentSAXEventInformation("endElement:"+m_node.getNodeName());
210                         m_xDocumentHandler.endElement(m_node.getNodeName());
211                         m_testTool.updatesUIs();
212 
213                         Node nextNode = m_node.getNextSibling();
214                         if (nextNode != null)
215                         /*
216                          * if the node has a next sibling, then the next event will be the
217                          * start event for that sibling node.
218                          */
219                         {
220                             m_node = nextNode;
221                             m_bIsEndEvent = false;
222                         }
223                         else
224                         /*
225                          * otherwise, the next event will be the endElement for the node's
226                          * parent node.
227                          */
228                         {
229                             m_node = m_node.getParentNode();
230                         }
231                         break;
232                 }
233             }
234         }
235         catch(  com.sun.star.xml.sax.SAXException e)
236         {
237             e.printStackTrace();
238 
239             /*
240              * forces to end.
241              */
242             rc = false;
243         }
244 
245         return rc;
246     }
247 }
248 
249