1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.tools.internal.ws.wsdl.parser;
  27 
  28 import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensible;
  29 import com.sun.tools.internal.ws.api.wsdl.TWSDLExtension;
  30 import com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext;
  31 import com.sun.tools.internal.ws.util.xml.XmlUtil;
  32 import com.sun.tools.internal.ws.wsdl.document.*;
  33 import com.sun.tools.internal.ws.wsdl.document.jaxws.CustomName;
  34 import com.sun.tools.internal.ws.wsdl.document.jaxws.JAXWSBinding;
  35 import com.sun.tools.internal.ws.wsdl.document.jaxws.JAXWSBindingsConstants;
  36 import com.sun.tools.internal.ws.wsdl.document.jaxws.Parameter;
  37 import org.w3c.dom.Element;
  38 import org.w3c.dom.Node;
  39 import org.w3c.dom.NodeList;
  40 
  41 import javax.xml.namespace.NamespaceContext;
  42 import javax.xml.namespace.QName;
  43 import javax.xml.xpath.XPath;
  44 import javax.xml.xpath.XPathConstants;
  45 import javax.xml.xpath.XPathExpressionException;
  46 import javax.xml.xpath.XPathFactory;
  47 import java.util.Iterator;
  48 import java.util.Map;
  49 
  50 
  51 /**
  52  * @author Vivek Pandey
  53  *
  54  * jaxws:bindings exension handler.
  55  *
  56  */
  57 public class JAXWSBindingExtensionHandler extends AbstractExtensionHandler {
  58 
  59     private static final XPathFactory xpf = XPathFactory.newInstance();
  60     private final XPath xpath = xpf.newXPath();
  61 
  62     public JAXWSBindingExtensionHandler(Map<String, AbstractExtensionHandler> extensionHandlerMap) {
  63         super(extensionHandlerMap);
  64     }
  65 
  66     /* (non-Javadoc)
  67      * @see AbstractExtensionHandler#getNamespaceURI()
  68      */
  69     public String getNamespaceURI() {
  70         return JAXWSBindingsConstants.NS_JAXWS_BINDINGS;
  71     }
  72 
  73     /**
  74      * @param context
  75      * @param parent
  76      * @param e
  77      */
  78     private boolean parseGlobalJAXWSBindings(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
  79         context.push();
  80         context.registerNamespaces(e);
  81 
  82         JAXWSBinding jaxwsBinding =  getJAXWSExtension(parent);
  83         if(jaxwsBinding == null)
  84             jaxwsBinding = new JAXWSBinding(context.getLocation(e));
  85         String attr = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.WSDL_LOCATION_ATTR);
  86         if (attr != null) {
  87             jaxwsBinding.setWsdlLocation(attr);
  88         }
  89 
  90         attr = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.NODE_ATTR);
  91         if (attr != null) {
  92             jaxwsBinding.setNode(attr);
  93         }
  94 
  95         attr = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.VERSION_ATTR);
  96         if (attr != null) {
  97             jaxwsBinding.setVersion(attr);
  98         }
  99 
 100         for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 101             Element e2 = Util.nextElement(iter);
 102             if (e2 == null)
 103                 break;
 104 
 105             if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.PACKAGE)){
 106                 parsePackage(context, jaxwsBinding, e2);
 107                 if((jaxwsBinding.getJaxwsPackage() != null) && (jaxwsBinding.getJaxwsPackage().getJavaDoc() != null)){
 108                     ((Definitions)parent).setDocumentation(new Documentation(jaxwsBinding.getJaxwsPackage().getJavaDoc()));
 109                 }
 110             }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_WRAPPER_STYLE)){
 111                 parseWrapperStyle(context, jaxwsBinding, e2);
 112             }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ASYNC_MAPPING)){
 113                 parseAsynMapping(context, jaxwsBinding, e2);
 114             }
 115 //            else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ADDITIONAL_SOAPHEADER_MAPPING)){
 116 //                parseAdditionalSOAPHeaderMapping(context, jaxwsBinding, e2);
 117 //            }
 118             else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_MIME_CONTENT)){
 119                 parseMimeContent(context, jaxwsBinding, e2);
 120             }else{
 121                 Util.fail(
 122                     "parsing.invalidExtensionElement",
 123                     e2.getTagName(),
 124                     e2.getNamespaceURI());
 125                 return false;
 126             }
 127         }
 128         parent.addExtension(jaxwsBinding);
 129         context.pop();
 130 //        context.fireDoneParsingEntity(
 131 //                JAXWSBindingsConstants.JAXWS_BINDINGS,
 132 //                jaxwsBinding);
 133         return true;
 134     }
 135 
 136     private static JAXWSBinding getJAXWSExtension(TWSDLExtensible extensible) {
 137         for (TWSDLExtension extension:extensible.extensions()) {
 138             if (extension.getClass().equals(JAXWSBinding.class)) {
 139                 return (JAXWSBinding)extension;
 140             }
 141         }
 142 
 143         return null;
 144     }
 145 
 146     /**
 147      * @param context
 148      * @param parent
 149      * @param e
 150      */
 151     private void parseProvider(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding parent, Element e) {
 152         String val = e.getTextContent();
 153         if(val == null)
 154             return;
 155         if(val.equals("false") || val.equals("0")){
 156             ((JAXWSBinding)parent).setProvider(Boolean.FALSE);
 157         }else if(val.equals("true") || val.equals("1")){
 158             ((JAXWSBinding)parent).setProvider(Boolean.TRUE);
 159         }
 160 
 161     }
 162 
 163     /**
 164      *
 165      * @param context
 166      * @param parent
 167      * @param e
 168      */
 169     private void parseJAXBBindings(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 170         JAXWSBinding binding = (JAXWSBinding)parent;
 171         binding.addJaxbBindings(e);
 172     }
 173 
 174     /**
 175      * @param context
 176      * @param parent
 177      * @param e
 178      */
 179     private void parsePackage(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding parent, Element e) {
 180         //System.out.println("In handlePackageExtension: " + e.getNodeName());
 181         String packageName = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.NAME_ATTR);
 182         JAXWSBinding binding = (JAXWSBinding)parent;
 183         binding.setJaxwsPackage(new CustomName(packageName, getJavaDoc(e)));
 184     }
 185 
 186     /**
 187      * @param context
 188      * @param parent
 189      * @param e
 190      */
 191     private void parseWrapperStyle(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding parent, Element e) {
 192         //System.out.println("In handleWrapperStyleExtension: " + e.getNodeName());
 193         String val = e.getTextContent();
 194         if(val == null)
 195             return;
 196         if(val.equals("false") || val.equals("0")){
 197             ((JAXWSBinding)parent).setEnableWrapperStyle(Boolean.FALSE);
 198         }else if(val.equals("true") || val.equals("1")){
 199             ((JAXWSBinding)parent).setEnableWrapperStyle(Boolean.TRUE);
 200         }
 201     }
 202 
 203     /**
 204      * @param context
 205      * @param parent
 206      * @param e
 207      */
 208 //    private void parseAdditionalSOAPHeaderMapping(TWSDLParserContextImpl context, TWSDLExtensible parent, Element e) {
 209 //        //System.out.println("In handleAdditionalSOAPHeaderExtension: " + e.getNodeName());
 210 //        String val = e.getTextContent();
 211 //        if(val == null)
 212 //            return;
 213 //        if(val.equals("false") || val.equals("0")){
 214 //            ((JAXWSBinding)parent).setEnableAdditionalHeaderMapping(Boolean.FALSE);
 215 //        }else if(val.equals("true") || val.equals("1")){
 216 //            ((JAXWSBinding)parent).setEnableAdditionalHeaderMapping(Boolean.TRUE);
 217 //        }
 218 //    }
 219 
 220     /**
 221      * @param context
 222      * @param parent
 223      * @param e
 224      */
 225     private void parseAsynMapping(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding parent, Element e) {
 226         //System.out.println("In handleAsynMappingExtension: " + e.getNodeName());
 227         String val = e.getTextContent();
 228         if(val == null)
 229             return;
 230         if(val.equals("false") || val.equals("0")){
 231             ((JAXWSBinding)parent).setEnableAsyncMapping(Boolean.FALSE);
 232         }else if(val.equals("true") || val.equals("1")){
 233             ((JAXWSBinding)parent).setEnableAsyncMapping(Boolean.TRUE);
 234         }
 235     }
 236 
 237     /**
 238      * @param context
 239      * @param parent
 240      * @param e
 241      */
 242     private void parseMimeContent(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding parent, Element e) {
 243         //System.out.println("In handleMimeContentExtension: " + e.getNodeName());
 244         String val = e.getTextContent();
 245         if(val == null)
 246             return;
 247         if(val.equals("false") || val.equals("0")){
 248             ((JAXWSBinding)parent).setEnableMimeContentMapping(Boolean.FALSE);
 249         }else if(val.equals("true") || val.equals("1")){
 250             ((JAXWSBinding)parent).setEnableMimeContentMapping(Boolean.TRUE);
 251         }
 252     }
 253 
 254     /**
 255      * @param context
 256      * @param jaxwsBinding
 257      * @param e
 258      */
 259     private void parseMethod(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding jaxwsBinding, Element e) {
 260         String methodName = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.NAME_ATTR);
 261         String javaDoc = getJavaDoc(e);
 262         CustomName name = new CustomName(methodName, javaDoc);
 263         jaxwsBinding.setMethodName(name);
 264     }
 265 
 266     /**
 267      * @param context
 268      * @param jaxwsBinding
 269      * @param e
 270      */
 271     private void parseParameter(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding jaxwsBinding, Element e) {
 272         String part = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.PART_ATTR);
 273         Element msgPartElm = evaluateXPathNode(e.getOwnerDocument(), part, new NamespaceContextImpl(e));
 274         Node msgElm = msgPartElm.getParentNode();
 275         //MessagePart msgPart = new MessagePart();
 276 
 277         String partName = XmlUtil.getAttributeOrNull(msgPartElm, "name");
 278         String msgName = XmlUtil.getAttributeOrNull((Element)msgElm, "name");
 279         if((partName == null) || (msgName == null))
 280             return;
 281 
 282         String val = XmlUtil.getAttributeOrNull(msgPartElm, "element");
 283 
 284         String element = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.ELEMENT_ATTR);
 285         String name = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.NAME_ATTR);
 286 
 287         QName elementName = null;
 288         if(element != null){
 289             String uri = e.lookupNamespaceURI(XmlUtil.getPrefix(element));
 290             elementName = (uri == null)?null:new QName(uri, XmlUtil.getLocalPart(element));
 291         }
 292 
 293         jaxwsBinding.addParameter(new Parameter(msgName, partName, elementName, name));
 294     }
 295 
 296     private Element evaluateXPathNode(Node target, String expression, NamespaceContext namespaceContext) {
 297         NodeList nlst;
 298         try {
 299             xpath.setNamespaceContext(namespaceContext);
 300             nlst = (NodeList)xpath.evaluate(expression, target, XPathConstants.NODESET);
 301         } catch (XPathExpressionException e) {
 302             Util.fail("internalizer.XPathEvaluationError", e.getMessage());
 303             return null; // abort processing this <jaxb:bindings>
 304         }
 305 
 306         if( nlst.getLength()==0 ) {
 307             Util.fail("internalizer.XPathEvaluatesToNoTarget", new Object[]{expression});
 308             return null; // abort
 309         }
 310 
 311         if( nlst.getLength()!=1 ) {
 312             Util.fail("internalizer.XPathEvaulatesToTooManyTargets", new Object[]{expression, nlst.getLength()});
 313             return null; // abort
 314         }
 315 
 316         Node rnode = nlst.item(0);
 317         if(!(rnode instanceof Element )) {
 318             Util.fail("internalizer.XPathEvaluatesToNonElement", new Object[]{expression});
 319             return null; // abort
 320         }
 321         return (Element)rnode;
 322     }
 323 
 324     /**
 325      * @param context
 326      * @param jaxwsBinding
 327      * @param e
 328      */
 329     private void parseClass(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding jaxwsBinding, Element e) {
 330         String className = XmlUtil.getAttributeOrNull(e, JAXWSBindingsConstants.NAME_ATTR);
 331         String javaDoc = getJavaDoc(e);
 332         jaxwsBinding.setClassName(new CustomName(className, javaDoc));
 333     }
 334 
 335 
 336     /**
 337      * @param context
 338      * @param jaxwsBinding
 339      * @param e
 340      */
 341     private void parseException(com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext context, JAXWSBinding jaxwsBinding, Element e) {
 342         for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 343             Element e2 = Util.nextElement(iter);
 344             if (e2 == null)
 345                 break;
 346             if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.CLASS)){
 347                 String className = XmlUtil.getAttributeOrNull(e2, JAXWSBindingsConstants.NAME_ATTR);
 348                 String javaDoc = getJavaDoc(e2);
 349                 jaxwsBinding.setException(new com.sun.tools.internal.ws.wsdl.document.jaxws.Exception(new CustomName(className, javaDoc)));
 350             }
 351         }
 352     }
 353 
 354     public boolean handleDefinitionsExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 355         return parseGlobalJAXWSBindings(context, parent, e);
 356     }
 357 
 358     public boolean handlePortTypeExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 359         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 360             context.push();
 361             context.registerNamespaces(e);
 362             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 363 
 364             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 365                 Element e2 = Util.nextElement(iter);
 366                 if (e2 == null)
 367                     break;
 368 
 369                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_WRAPPER_STYLE)){
 370                     parseWrapperStyle(context, jaxwsBinding, e2);
 371                 }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ASYNC_MAPPING)){
 372                     parseAsynMapping(context, jaxwsBinding, e2);
 373                 }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.CLASS)){
 374                     parseClass(context, jaxwsBinding, e2);
 375                     if((jaxwsBinding.getClassName() != null) && (jaxwsBinding.getClassName().getJavaDoc() != null)){
 376                         ((PortType)parent).setDocumentation(new Documentation(jaxwsBinding.getClassName().getJavaDoc()));
 377                     }
 378                 }else{
 379                     Util.fail(
 380                         "parsing.invalidExtensionElement",
 381                         e2.getTagName(),
 382                         e2.getNamespaceURI());
 383                     return false;
 384                 }
 385             }
 386             parent.addExtension(jaxwsBinding);
 387             context.pop();
 388 //            context.fireDoneParsingEntity(
 389 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 390 //                    jaxwsBinding);
 391             return true;
 392         }else {
 393             Util.fail(
 394                 "parsing.invalidExtensionElement",
 395                 e.getTagName(),
 396                 e.getNamespaceURI());
 397             return false;
 398         }
 399     }
 400 
 401     public boolean handleOperationExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 402         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 403             if(parent instanceof Operation){
 404                 return handlePortTypeOperation(context, (Operation)parent, e);
 405             }else if(parent instanceof BindingOperation){
 406                 return handleBindingOperation(context, (BindingOperation)parent, e);
 407             }
 408         }else {
 409             Util.fail(
 410                 "parsing.invalidExtensionElement",
 411                 e.getTagName(),
 412                 e.getNamespaceURI());
 413             return false;
 414         }
 415         return false;
 416     }
 417 
 418     private boolean handleBindingOperation(TWSDLParserContext context, BindingOperation operation, Element e) {
 419         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 420             context.push();
 421             context.registerNamespaces(e);
 422             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 423 
 424             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 425                 Element e2 = Util.nextElement(iter);
 426                 if (e2 == null)
 427                     break;
 428 
 429 //                if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ADDITIONAL_SOAPHEADER_MAPPING)){
 430 //                    parseAdditionalSOAPHeaderMapping(context, jaxwsBinding, e2);
 431 //                }else
 432                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_MIME_CONTENT)){
 433                     parseMimeContent(context, jaxwsBinding, e2);
 434                 }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.PARAMETER)){
 435                     parseParameter(context, jaxwsBinding, e2);
 436                 }else{
 437                     Util.fail(
 438                         "parsing.invalidExtensionElement",
 439                         e2.getTagName(),
 440                         e2.getNamespaceURI());
 441                     return false;
 442                 }
 443             }
 444             operation.addExtension(jaxwsBinding);
 445             context.pop();
 446 //            context.fireDoneParsingEntity(
 447 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 448 //                    jaxwsBinding);
 449             return true;
 450         }else {
 451             Util.fail(
 452                 "parsing.invalidExtensionElement",
 453                 e.getTagName(),
 454                 e.getNamespaceURI());
 455             return false;
 456         }
 457     }
 458 
 459     private boolean handlePortTypeOperation(TWSDLParserContext context, Operation parent, Element e) {
 460         context.push();
 461         context.registerNamespaces(e);
 462         JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 463 
 464         for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 465             Element e2 = Util.nextElement(iter);
 466             if (e2 == null)
 467                 break;
 468 
 469             if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_WRAPPER_STYLE)){
 470                 parseWrapperStyle(context, jaxwsBinding, e2);
 471             }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ASYNC_MAPPING)){
 472                 parseAsynMapping(context, jaxwsBinding, e2);
 473             }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.METHOD)){
 474                 parseMethod(context, jaxwsBinding, e2);
 475                 if((jaxwsBinding.getMethodName() != null) && (jaxwsBinding.getMethodName().getJavaDoc() != null)){
 476                     parent.setDocumentation(new Documentation(jaxwsBinding.getMethodName().getJavaDoc()));
 477                 }
 478             }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.PARAMETER)){
 479                 parseParameter(context, jaxwsBinding, e2);
 480             }else{
 481                 Util.fail(
 482                     "parsing.invalidExtensionElement",
 483                     e2.getTagName(),
 484                     e2.getNamespaceURI());
 485                 return false;
 486             }
 487         }
 488         parent.addExtension(jaxwsBinding);
 489         context.pop();
 490 //        context.fireDoneParsingEntity(
 491 //                JAXWSBindingsConstants.JAXWS_BINDINGS,
 492 //                jaxwsBinding);
 493         return true;
 494     }
 495 
 496     public boolean handleBindingExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 497         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 498             context.push();
 499             context.registerNamespaces(e);
 500             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 501 
 502             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 503                 Element e2 = Util.nextElement(iter);
 504                 if (e2 == null)
 505                     break;
 506 
 507 //                if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_ADDITIONAL_SOAPHEADER_MAPPING)){
 508 //                    parseAdditionalSOAPHeaderMapping(context, jaxwsBinding, e2);
 509 //                }else
 510                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.ENABLE_MIME_CONTENT)){
 511                     parseMimeContent(context, jaxwsBinding, e2);
 512                 }else{
 513                     Util.fail(
 514                         "parsing.invalidExtensionElement",
 515                         e2.getTagName(),
 516                         e2.getNamespaceURI());
 517                     return false;
 518                 }
 519             }
 520             parent.addExtension(jaxwsBinding);
 521             context.pop();
 522 //            context.fireDoneParsingEntity(
 523 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 524 //                    jaxwsBinding);
 525             return true;
 526         }else {
 527             Util.fail(
 528                 "parsing.invalidExtensionElement",
 529                 e.getTagName(),
 530                 e.getNamespaceURI());
 531             return false;
 532         }
 533     }
 534 
 535     /* (non-Javadoc)
 536      * @see ExtensionHandlerBase#handleFaultExtension(TWSDLParserContextImpl, TWSDLExtensible, org.w3c.dom.Element)
 537      */
 538     public boolean handleFaultExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 539         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 540             context.push();
 541             context.registerNamespaces(e);
 542             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 543 
 544             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 545                 Element e2 = Util.nextElement(iter);
 546                 if (e2 == null)
 547                     break;
 548                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.CLASS)){
 549                     parseClass(context, jaxwsBinding, e2);
 550                     if((jaxwsBinding.getClassName() != null) && (jaxwsBinding.getClassName().getJavaDoc() != null)){
 551                         ((Fault)parent).setDocumentation(new Documentation(jaxwsBinding.getClassName().getJavaDoc()));
 552                     }
 553                 }else{
 554                     Util.fail(
 555                         "parsing.invalidExtensionElement",
 556                         e2.getTagName(),
 557                         e2.getNamespaceURI());
 558                     return false;
 559                 }
 560             }
 561             parent.addExtension(jaxwsBinding);
 562             context.pop();
 563 //            context.fireDoneParsingEntity(
 564 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 565 //                    jaxwsBinding);
 566             return true;
 567         }else {
 568             Util.fail(
 569                 "parsing.invalidExtensionElement",
 570                 e.getTagName(),
 571                 e.getNamespaceURI());
 572             return false;
 573         }
 574     }
 575 
 576     public boolean handleServiceExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 577         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 578             context.push();
 579             context.registerNamespaces(e);
 580             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 581 
 582             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 583                 Element e2 = Util.nextElement(iter);
 584                 if (e2 == null)
 585                     break;
 586                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.CLASS)){
 587                     parseClass(context, jaxwsBinding, e2);
 588                     if((jaxwsBinding.getClassName() != null) && (jaxwsBinding.getClassName().getJavaDoc() != null)){
 589                         ((Service)parent).setDocumentation(new Documentation(jaxwsBinding.getClassName().getJavaDoc()));
 590                     }
 591                 }else{
 592                     Util.fail(
 593                         "parsing.invalidExtensionElement",
 594                         e2.getTagName(),
 595                         e2.getNamespaceURI());
 596                     return false;
 597                 }
 598             }
 599             parent.addExtension(jaxwsBinding);
 600             context.pop();
 601 //            context.fireDoneParsingEntity(
 602 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 603 //                    jaxwsBinding);
 604             return true;
 605         }else {
 606             Util.fail(
 607                 "parsing.invalidExtensionElement",
 608                 e.getTagName(),
 609                 e.getNamespaceURI());
 610             return false;
 611         }
 612     }
 613 
 614     public boolean handlePortExtension(TWSDLParserContext context, TWSDLExtensible parent, Element e) {
 615         if(XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)){
 616             context.push();
 617             context.registerNamespaces(e);
 618             JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e));
 619 
 620             for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 621                 Element e2 = Util.nextElement(iter);
 622                 if (e2 == null)
 623                     break;
 624 
 625                 if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.PROVIDER)){
 626                     parseProvider(context, jaxwsBinding, e2);
 627                 }else if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.METHOD)){
 628                     parseMethod(context, jaxwsBinding, e2);
 629                     if((jaxwsBinding.getMethodName() != null) && (jaxwsBinding.getMethodName().getJavaDoc() != null)){
 630                         ((Port)parent).setDocumentation(new Documentation(jaxwsBinding.getMethodName().getJavaDoc()));
 631                     }
 632                 }else{
 633                     Util.fail(
 634                         "parsing.invalidExtensionElement",
 635                         e2.getTagName(),
 636                         e2.getNamespaceURI());
 637                     return false;
 638                 }
 639             }
 640             parent.addExtension(jaxwsBinding);
 641             context.pop();
 642 //            context.fireDoneParsingEntity(
 643 //                    JAXWSBindingsConstants.JAXWS_BINDINGS,
 644 //                    jaxwsBinding);
 645             return true;
 646         }else {
 647             Util.fail(
 648                 "parsing.invalidExtensionElement",
 649                 e.getTagName(),
 650                 e.getNamespaceURI());
 651             return false;
 652         }
 653     }
 654 
 655     private String getJavaDoc(Element e){
 656         for(Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();){
 657             Element e2 = Util.nextElement(iter);
 658             if (e2 == null)
 659                 break;
 660             if(XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.JAVADOC)){
 661                 return XmlUtil.getTextForNode(e2);
 662             }
 663         }
 664         return null;
 665     }
 666 }