/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.soap.wsdl; import com.caucho.log.Log; import com.caucho.util.IntMap; import com.caucho.util.L10N; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.namespace.QName; import java.util.logging.Logger; /** * WSDL Content handler */ public class WSDLContentHandler extends DefaultHandler { private final static Logger log = Log.open(WSDLContentHandler.class); private final static L10N L = new L10N(WSDLContentHandler.class); private final static String WSDL = "http://schemas.xmlsoap.org/wsdl/"; private final static int TOP = 0; private final static int WSDL_DEFINITIONS = 1; private final static int WSDL_IMPORT = 2; private final static int WSDL_TYPES = 3; private final static int WSDL_MESSAGE = 4; private final static int WSDL_PORT_TYPE = 5; private final static int WSDL_BINDING = 6; private final static int WSDL_SERVICE = 7; private final static int WSDL_PART = 8; private final static int WSDL_OPERATION = 9; private final static int WSDL_INPUT = 10; private final static int WSDL_OUTPUT = 11; private final static int WSDL_FAULT = 12; private final static int WSDL_PORT = 13; private final static int WSDL_BINDING_OPERATION = 14; private final static IntMap _keywords = new IntMap(); private int _state = TOP; /** * Starts a WSDL element. */ public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException { QName qname = new QName(uri, localName); switch (_state) { case TOP: switch (getKeyword(qname)) { case WSDL_DEFINITIONS: _state = WSDL_DEFINITIONS; break; default: throw error(L.l("Expected <wsdl:descriptions> at <{0}>.", qName)); } break; case WSDL_DEFINITIONS: switch (getKeyword(qname)) { case WSDL_IMPORT: _state = WSDL_IMPORT; break; case WSDL_TYPES: _state = WSDL_TYPES; break; case WSDL_MESSAGE: _state = WSDL_MESSAGE; break; case WSDL_PORT_TYPE: _state = WSDL_PORT_TYPE; break; case WSDL_BINDING: _state = WSDL_BINDING; break; case WSDL_SERVICE: _state = WSDL_SERVICE; break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } break; case WSDL_MESSAGE: switch (getKeyword(qname)) { case WSDL_PART: _state = WSDL_PART; break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } break; case WSDL_PORT_TYPE: switch (getKeyword(qname)) { case WSDL_OPERATION: _state = WSDL_OPERATION; break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } break; case WSDL_BINDING: switch (getKeyword(qname)) { case WSDL_OPERATION: _state = WSDL_BINDING_OPERATION; break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } break; case WSDL_SERVICE: switch (getKeyword(qname)) { case WSDL_PORT: _state = WSDL_PORT; break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } break; default: throw error(L.l("<{0}> is an unexpected tag.", qName)); } } /** * Ends a WSDL element. */ public void endElement (String uri, String localName, String qName) throws SAXException { QName qname = new QName(uri, localName); switch (_state) { case WSDL_DEFINITIONS: if (getKeyword(qname) == WSDL_DEFINITIONS) _state = TOP; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_IMPORT: if (getKeyword(qname) == WSDL_IMPORT) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_TYPES: if (getKeyword(qname) == WSDL_TYPES) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_MESSAGE: if (getKeyword(qname) == WSDL_MESSAGE) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_PORT_TYPE: if (getKeyword(qname) == WSDL_PORT_TYPE) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_BINDING: if (getKeyword(qname) == WSDL_BINDING) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_SERVICE: if (getKeyword(qname) == WSDL_SERVICE) _state = WSDL_DEFINITIONS; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_PART: if (getKeyword(qname) == WSDL_PART) _state = WSDL_MESSAGE; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_OPERATION: if (getKeyword(qname) == WSDL_OPERATION) _state = WSDL_PORT_TYPE; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_INPUT: if (getKeyword(qname) == WSDL_INPUT) _state = WSDL_OPERATION; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_OUTPUT: if (getKeyword(qname) == WSDL_OUTPUT) _state = WSDL_OPERATION; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_FAULT: if (getKeyword(qname) == WSDL_FAULT) _state = WSDL_OPERATION; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_PORT: if (getKeyword(qname) == WSDL_PORT) _state = WSDL_SERVICE; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; case WSDL_BINDING_OPERATION: if (getKeyword(qname) == WSDL_OPERATION) _state = WSDL_BINDING; else throw error(L.l("</{0}> is an unexpected end tag.", qName)); break; default: throw error(L.l("</{0}> is an unexpected end tag.", qName)); } } /** * Returns the keyword for the name. */ private int getKeyword(QName qname) { return _keywords.get(qname); } /** * Throws an error. */ private SAXException error(String msg) { return new SAXException(msg); } static { _keywords.put(new QName(WSDL, "descriptions"), WSDL_DEFINITIONS); _keywords.put(new QName(WSDL, "import"), WSDL_IMPORT); _keywords.put(new QName(WSDL, "types"), WSDL_TYPES); _keywords.put(new QName(WSDL, "message"), WSDL_MESSAGE); _keywords.put(new QName(WSDL, "portType"), WSDL_PORT_TYPE); _keywords.put(new QName(WSDL, "binding"), WSDL_BINDING); _keywords.put(new QName(WSDL, "service"), WSDL_SERVICE); _keywords.put(new QName(WSDL, "part"), WSDL_PART); _keywords.put(new QName(WSDL, "operation"), WSDL_OPERATION); _keywords.put(new QName(WSDL, "input"), WSDL_INPUT); _keywords.put(new QName(WSDL, "output"), WSDL_OUTPUT); _keywords.put(new QName(WSDL, "fault"), WSDL_FAULT); _keywords.put(new QName(WSDL, "port"), WSDL_PORT); } }