/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package wsdl2ksoap.businesslogic; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.*; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import wsdl2ksoap.datatypes.Function; import wsdl2ksoap.datatypes.PropertyContainer; import wsdl2ksoap.datatypes.SoapClass; import wsdl2ksoap.datatypes.SoapClass.ClassType; import wsdl2ksoap.datatypes.SoapClassProperty; /** * * @author newky */ public class WSDLParser { public static boolean ProcessWSDL() { try { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(PropertyContainer.WSDLAddress); doc.getDocumentElement ().normalize (); PropertyContainer.Namespace = doc.getDocumentElement().getAttribute("targetNamespace"); // // normalize text representation // doc.getDocumentElement ().normalize (); // System.out.println ("Root element of the doc is " + // doc.getDocumentElement().getNodeName()); // // // System.out.println ("First element of the doc is " + // doc.getFirstChild().getNodeName()); // // System.out.println("Total no of people : " + nodes.getLength()); NodeList nodes = doc.getElementsByTagName("wsdl:service"); Node serviceNode = nodes.item(0); if(serviceNode.getNodeType() == Node.ELEMENT_NODE) { Element serviceElement = (Element)serviceNode; //serviceNode PropertyContainer.ServiceName = serviceElement.getAttribute("name"); System.out.println("Service Name: " + PropertyContainer.ServiceName); //Get Bindings NodeList bindings = doc.getElementsByTagName("wsdl:binding"); //System.out.println("Total no of bindings : " + bindings.getLength()); //get binding and then the Methods for(int s=0; s<bindings.getLength() ; s++) { Node bindingNode = bindings.item(s); if(bindingNode.getNodeType() == Node.ELEMENT_NODE) { Element bindingElement = (Element)bindingNode; String bindingName = bindingElement.getAttribute("name"); String soapPortName = PropertyContainer.GetSoapPortName(); if (bindingName.equals(soapPortName)) { String portTypeNS = bindingElement.getAttribute("type").replaceFirst("tns:", ""); //System.out.println("Type : " + portTypeNS); //get operations NodeList operations = bindingElement.getElementsByTagName("wsdl:operation"); //System.out.println("Total no of bindings : " + operations.getLength()); //instatiate the Function array now we know how many functions there are. PropertyContainer.Functions = new Function[operations.getLength()]; //Loop through Functions for(int op=0; op<operations.getLength() ; op++) { Node operationNode = operations.item(op); if(bindingNode.getNodeType() == Node.ELEMENT_NODE) { //get element Element operationElement = (Element)operationNode; @SuppressWarnings("unused") String operationName=operationElement.getAttribute("name"); //create new instance Function newFunc = new Function(); newFunc.Name = operationElement.getAttribute("name"); //get operation list and element // NodeList soapOpList = operationElement.getElementsByTagName("soap:operation"); // Element soapOpElement = (Element)soapOpList.item(0); //wsdlsoap:operation // newFunc.SoapAction = soapOpElement.getAttribute("soapAction"); //get port types NodeList portTypes = doc.getElementsByTagName("wsdl:portType"); //loop through elements for(int pt=0; pt<portTypes.getLength() ; pt++) { Node portTypeNode = portTypes.item(pt); if(portTypeNode.getNodeType() == Node.ELEMENT_NODE) { Element portTypeElement = (Element)portTypeNode; //check to see if it is the same as the current operation String portTypeElementStr = portTypeElement.getAttribute("name"); portTypeElementStr = "impl:" + portTypeElementStr; if (portTypeElementStr.equals(portTypeNS)) { //get the operations for this portType NodeList operationList = portTypeElement.getElementsByTagName("wsdl:operation"); //loop through operation list for(int ol=0; ol<operationList.getLength() ; ol++) { Node operationListNode = operationList.item(ol); if(operationListNode.getNodeType() == Node.ELEMENT_NODE) { Element operationListElement = (Element)operationListNode; //see if the element matches the function anem @SuppressWarnings("unused") String operationListStr = operationListElement.getAttribute("name"); if (operationListElement.getAttribute("name").equals(newFunc.Name)) { //is this function - get input parameter type NodeList inputList = operationListElement.getElementsByTagName("wsdl:input"); String inputMessage = ((Element)inputList.item(0)).getAttribute("message").replaceFirst("tns:", ""); //is this function - get return type NodeList outputList = operationListElement.getElementsByTagName("wsdl:output"); String outputMessage = ((Element)outputList.item(0)).getAttribute("message").replaceFirst("tns:", ""); // //now need to get the Types of the return and property value //get port types NodeList messages = doc.getElementsByTagName("wsdl:message"); for(int ml=0; ml<messages.getLength() ; ml++) { Node messageNode = messages.item(ml); if(messageNode.getNodeType() == Node.ELEMENT_NODE) { //convert to element Element messageElement = (Element)messageNode; //compare against inputMessage name String messageStr = messageElement.getAttribute("name"); messageStr = "impl:" + messageStr; if (messageStr.equals(inputMessage)) { newFunc.InputType = ((Element)messageElement.getElementsByTagName("wsdl:part").item(0)).getAttribute("element").replaceFirst("tns:", ""); newFunc.InputType = newFunc.InputType.split(":")[1]; //System.out.println("In " + newFunc.InputType); } else //compare against inputMessage name if (messageStr.equals(outputMessage)) { //get response type //get input param type newFunc.OutputType = ((Element)messageElement.getElementsByTagName("wsdl:part").item(0)).getAttribute("element").replaceFirst("tns:", ""); newFunc.OutputType = newFunc.OutputType.split(":")[1]; } } } } } } } } } //add newFunc to functions array PropertyContainer.Functions[op] = newFunc; } } } } } } // now process the datatypes and classes NodeList typenodes = doc.getElementsByTagName("wsdl:types"); Node typesNode = typenodes.item(0); if(serviceNode.getNodeType() == Node.ELEMENT_NODE) { Element typesElement = (Element)typesNode; //now get schema element Node typeschemaNode = typesElement.getElementsByTagName("schema").item(0); //serviceElement.getAttribute("name"); if(typeschemaNode.getNodeType() == Node.ELEMENT_NODE) { Element typeschemaElement = (Element)typeschemaNode; //get elements NodeList elementNodes = typeschemaElement.getElementsByTagName("element"); //get complexTypes NodeList complexTypesNodes = typeschemaElement.getElementsByTagName("complexType"); //process element nodes and get class information //create Classes container - make it big //PropertyContainer.Classes = new ArrayList<SoapClass>(); //iterate through s:element objects for (int elLoop = 0;elLoop < elementNodes.getLength();elLoop++) { Node elementNode = elementNodes.item(elLoop); if(elementNode.getNodeType() == Node.ELEMENT_NODE) { Element elementElement = (Element)elementNode; //get header elements from list - as the list contains all s:elements from the schema nodes if (elementNode.hasChildNodes()) { //check to see not has name SoapClass newClass = new SoapClass(elementElement.getAttribute("name")); //set classtype to unknown newClass.Type = ClassType.Unknown; //now get properties from class //get elements NodeList propertyNodes = elementElement.getElementsByTagName("element"); //iterate through properties for (int propLoop = 0; propLoop < propertyNodes.getLength();propLoop++) { Node propertyNode = propertyNodes.item(propLoop); if(propertyNode.getNodeType() == Node.ELEMENT_NODE) { Element propertyElement = (Element)propertyNode; //create new property class SoapClassProperty newProp = new SoapClassProperty(propertyElement.getAttribute("name")); System.out.println(propertyElement.getAttribute("type")); newProp.SetPropertyClassType(propertyElement.getAttribute("type")); System.out.println(newProp.getPropertyClassType()); //check to see if is array of objects if (propertyElement.getAttribute("maxOccurs").equals("unbounded")) { //yes is array newProp.SetIsArray(true); } newClass.Properties.add(newProp); } } System.out.println("Element Class: " + newClass.Name + " Properties: " + newClass.Properties.size()); PropertyContainer.Classes.add(newClass); } } } //iterate through s:comlextypes objects for (int ctLoop = 0;ctLoop < complexTypesNodes.getLength();ctLoop++) { Node ctypeNode = complexTypesNodes.item(ctLoop); if(ctypeNode.getNodeType() == Node.ELEMENT_NODE) { Element ctypeElement = (Element)ctypeNode; //get header elements from list - as the list contains all s:elements from the schema nodes if (ctypeNode.hasChildNodes()) { //s:elements show up for some reason but have no name if (!ctypeElement.getAttribute("name").isEmpty()) { SoapClass newClass = new SoapClass(ctypeElement.getAttribute("name")); //set class type to complex type newClass.Type = ClassType.ComplexType; //check for base super class //NodeList spBaseNode = ctypeElement.getChildNodes(); NodeList spBaseNode = ctypeElement.getElementsByTagName("extension"); //Node ctNode = spBaseNode.item(1); if (spBaseNode.getLength() != 0) { Node sbBaseNode = spBaseNode.item(0); if(sbBaseNode.getNodeType() == Node.ELEMENT_NODE) { Element sbBaseElement = (Element)sbBaseNode; newClass.SuperClassType = sbBaseElement.getAttribute("base").replaceAll("tns:", ""); } } System.out.println("SuperClass: " + newClass.SuperClassType); //get elements NodeList propertyNodes = ctypeElement.getElementsByTagName("element"); //iterate through properties for (int propLoop = 0; propLoop < propertyNodes.getLength();propLoop++) { Node propertyNode = propertyNodes.item(propLoop); if(propertyNode.getNodeType() == Node.ELEMENT_NODE) { Element propertyElement = (Element)propertyNode; //create new property class SoapClassProperty newProp = new SoapClassProperty(propertyElement.getAttribute("name")); newProp.SetPropertyClassType(propertyElement.getAttribute("type")); //check to see if is array of objects if (propertyElement.getAttribute("maxOccurs").equals("unbounded")) { //yes is array newProp.SetIsArray(true); newClass.ElementType = newProp.getPropertyClassType(); newClass.isArray = true; } newClass.Properties.add(newProp); } } System.out.println("Complex Type: " + newClass.Name + " Properties: " + newClass.Properties.size()); PropertyContainer.ComplexTypes.add(newClass); } } } } //all class should have been created now - trim array System.out.println("Class Count: " + PropertyContainer.Classes.size()); System.out.println("Complex Types: " + PropertyContainer.ComplexTypes.size()); } } } catch (SAXParseException err) { System.out.println ("** Parsing error" + ", line " + err.getLineNumber () + ", uri " + err.getSystemId ()); System.out.println(" " + err.getMessage ()); }catch (SAXException e) { Exception x = e.getException (); ((x == null) ? e : x).printStackTrace (); }catch (Throwable t) { t.printStackTrace (); } return true; } }