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