xref: /trunk/main/xmlsecurity/tools/uno/ParsingThread.java (revision 3309286857f19787ae62bd793a98b5af4edd2ad3)
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
10cdf0e10cSrcweir  *
11*db859879SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 }
244