package org.knopflerfish.bundle.soap.desktop; import javax.wsdl.*; import javax.wsdl.factory.*; import javax.wsdl.xml.*; import javax.wsdl.extensions.*; import javax.xml.namespace.QName; import javax.wsdl.Input; import javax.wsdl.Output; import java.net.*; import java.io.*; import java.util.*; import org.w3c.dom.*; public class WSDLLoader { public Map flatMap = new HashMap(); public XSDSchema loadWSDL(Definition def) { Map typeMap = new HashMap(); XSDSchema xsl = scanTypes(def, typeMap); xsl.typeMap = typeMap; return xsl; } XSDSchema scanTypes(Definition def, Map typeMap) { Types types = def.getTypes(); XSDSchema xsd = null; if(types != null) { List extList = types.getExtensibilityElements(); for(Iterator it = extList.iterator(); it.hasNext();) { Object v = it.next(); if(v instanceof UnknownExtensibilityElement) { UnknownExtensibilityElement ueEl = (UnknownExtensibilityElement)v; Element el = ueEl.getElement(); xsd = (XSDSchema)parseAnyElement(el, 0, typeMap); } else { System.out.println(v.getClass().getName() + ": " + v); } } } else { return new XSDSchema(); } return xsd; } void printMessages(Definition def, Map typeMap) { Map messages = def.getMessages(); Iterator msgIterator = messages.values().iterator(); System.out.println("*** Messages:"); while (msgIterator.hasNext()) { Message msg = (Message)msgIterator.next(); if (!msg.isUndefined()) { System.out.println(msg.getQName().getLocalPart()); Map partMap = msg.getParts(); for(Iterator partIt = partMap.keySet().iterator(); partIt.hasNext();) { Object key = partIt.next(); Part part = (Part)partMap.get(key); System.out.println(" " + part.getName() + ": " + part.getTypeName().getLocalPart()); } } } } void printPorts(Definition def, Map typeMap, PrintWriter out) { out.println("*** Ports:"); Map ports = def.getPortTypes(); for(Iterator it = ports.keySet().iterator(); it.hasNext(); ) { QName name = (QName)it.next(); PortType pt = (PortType)ports.get(name); for(Iterator it2 = pt.getOperations().iterator(); it2.hasNext();) { Operation op = (Operation)it2.next(); out.println(" " + op.getName()); Input in = op.getInput(); Output msg_out = op.getOutput(); out.println(" in: "); // + in.getMessage().getQName().getLocalPart()); if(in != null) { printMessage(in.getMessage(), typeMap, 3, out); } else { System.out.println(" null input"); } out.println(" out: "); // + out.getMessage().getQName().getLocalPart()); if(msg_out != null) { printMessage(msg_out.getMessage(), typeMap, 3, out); } else { System.out.println(" null output"); } } } } void printMessage(Message msg, Map typeMap, int level, PrintWriter out) { if (!msg.isUndefined()) { // System.out.println(indent(level) + msg.getQName().getLocalPart()); Map partMap = msg.getParts(); if(partMap.size() == 0) { out.println(indent(level + 2) + ""); } else { for(Iterator partIt = partMap.keySet().iterator(); partIt.hasNext();) { Object key = partIt.next(); Part part = (Part)partMap.get(key); String type = Util.getTypeString(part); XSDElement el = (XSDElement)typeMap.get(type); if(el != null) { XSDWalker.doVisit(el, new PrintVisitor(out), typeMap, level + 3); // type = el.toString(); } else { out.println(indent(level + 2) + part.getName() + ": " + type); } } } } } String indent(int n) { StringBuffer sb = new StringBuffer(); while(n --> 0) { sb.append(" "); } return sb.toString(); } String prefix = "xsd:"; XSDObj parseComplexContent(Element el, int level, Map typeMap) { // throw new RuntimeException("parseComplexContent NYI"); // System.out.println("parseComplexContent " + el.getAttribute("name")); XSDSoapArray obj = null; NodeList children = el.getChildNodes(); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { Element child = (Element)node; if((prefix + "restriction").equals(child.getTagName()) && "soapenc:Array".equals(child.getAttribute("base"))) { NodeList children2 = child.getChildNodes(); for(int j = 0; j < children2.getLength(); j++) { Node n2 = children2.item(j); if(n2 instanceof Element) { Element ch2 = (Element)n2; if((prefix + "attribute").equals(ch2.getTagName()) && "soapenc:arrayType".equals(ch2.getAttribute("ref"))) { if(obj == null) { obj = new XSDSoapArray(el.getAttribute("name"), ch2.getAttribute("wsdl:arrayType")); } else { throw new IllegalArgumentException("Multiple array defs"); } } } } } } } return obj; } XSDObj parseComplexType(Element el, int level, Map typeMap) { // System.out.println("parse: " + indent(level) + " complexType name=" + el.getAttribute("name")); XSDComplexType obj = new XSDComplexType(el.getAttribute("name")); NodeList children = el.getChildNodes(); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { Element child = (Element)node; XSDObj sub = null; if((prefix + "all").equals(child.getTagName())) { sub = parseAll(child, level + 1, typeMap); } else if((prefix + "complexContent").equals(child.getTagName())) { sub = parseComplexContent(child, level + 1, typeMap); } else if((prefix + "sequence").equals(child.getTagName())) { return parseSequence(child, level, typeMap); } else { System.out.println("skip " + child); } if(sub != null) { obj.add(sub); } else { throw new IllegalArgumentException("Unparsed element " + child.getTagName() + " in xsd:complexType " + el); } } } return obj; } XSDObj parseElement(Element el, int level, Map typeMap) { XSDElement obj = new XSDElement(el.getAttribute("name"), el.getAttribute("type")); NodeList children = el.getChildNodes(); if(children.getLength() > 0) { for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { Element child = (Element)node; if((prefix + "all").equals(child.getTagName())) { obj.add(parseAll(child, level+1, typeMap)); } else if((prefix + "sequence").equals(child.getTagName())) { obj.add(parseSequence(child, level+1, typeMap)); } else if((prefix + "complexType").equals(child.getTagName())) { obj.add(parseComplexType(child, level+1, typeMap)); } else { throw new IllegalArgumentException("Unexpected tag " + child.getTagName() + " in element tag"); } } } } return obj; } XSDObj parseAll(Element el, int level, Map typeMap) { XSDAll obj = new XSDAll(); NodeList children = el.getChildNodes(); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { Element child = (Element)node; obj.add(parseAnyElement(child, level + 1, typeMap)); } } return obj; } XSDObj parseSequence(Element el, int level, Map typeMap) { XSDSequence obj = new XSDSequence(); NodeList children = el.getChildNodes(); // System.out.println("parseSequence "+ el); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { Element child = (Element)node; XSDObj ch = parseElement(child, level + 1, typeMap); // System.out.println(" add " + ch); obj.add(ch); } } return obj; } XSDObj parseAnyElement(Element el, int level, Map typeMap) { // System.out.println("parse: " + indent(level) + "" + el.getTagName() + ", name=" + el.getAttribute("name")); String tagName = el.getTagName(); if((prefix + "element").equals(tagName)) { return parseElement(el, level, typeMap); } else if((prefix + "restriction").equals(tagName)) { throw new IllegalArgumentException("Unexpected restriction element in " + el); } else if((prefix + "all").equals(tagName)) { return parseAll(el, level, typeMap); } else if((prefix + "sequence").equals(tagName)) { return parseSequence(el, level, typeMap); } else if((prefix + "complexType").equals(tagName)) { return parseComplexType(el, level, typeMap); } else if((prefix + "import").equals(tagName)) { // System.out.println("skip import namespace=" + el.getAttribute("namespace")); return new XSDObj("import"); } else if("schema".equals(tagName)) { prefix = ""; return parseSchema(el, level, typeMap); } else if(tagName.endsWith(":schema")) { prefix = tagName.substring(0, tagName.length() - 7) + ":"; System.out.println("prefix=" + prefix); return parseSchema(el, level, typeMap); } else { throw new IllegalArgumentException("Unexpected element " + el); } } XSDSchema parseSchema(Element el, int level, Map typeMap) { XSDSchema obj = new XSDSchema(); NodeList children = el.getChildNodes(); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if(node instanceof Element) { XSDObj xsl = parseAnyElement((Element)node, level+1, typeMap); obj.add(xsl); // System.out.println("schema add " + xsl.getName() + " " + xsl.getClass().getName()); if(xsl.getName() != null) { typeMap.put(xsl.getName(), xsl); } } } return obj; } }