/*******************************************************************************
 * Copyright (c) 2002-2005 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   IBM - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.internal.core.wsdl.traversal;
import javax.wsdl.Part;
import javax.wsdl.Service;
import javax.wsdl.Types;
import javax.wsdl.Operation;
import javax.wsdl.Input;
import javax.wsdl.Output;
import javax.wsdl.Fault;
import javax.wsdl.Binding;
import javax.wsdl.BindingOperation;
import javax.wsdl.BindingInput;
import javax.wsdl.BindingOutput;
import javax.wsdl.BindingFault;
import javax.wsdl.Import;
import org.w3c.dom.Element;
import javax.wsdl.Message;
import javax.wsdl.Port;
import javax.wsdl.PortType;
import javax.wsdl.Definition;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.soap.SOAPBinding;
import javax.wsdl.extensions.soap.SOAPBody;
import javax.wsdl.extensions.soap.SOAPFault;
import javax.wsdl.extensions.soap.SOAPHeader;
import javax.wsdl.extensions.soap.SOAPHeaderFault;
import javax.wsdl.extensions.soap.SOAPOperation;

import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

/**
 * The class implements plain traverse over WSDL artifacts.
 * WSDLTraversal is context-driven traversal. 
 * 
 * @author Andrey Kulik
 */
public class WSDLTraversal
{

  /**
   * Current WSDL visitor (callback).
   */
  private WSDLVisitor visitor;

  /**
   * Flags which specify whether traversal will travers from one WSDL artifact
   * to another.
   */
  private boolean traverseBinding2BindingOperation = true;
  private boolean traverseBinding2Element = true;
  private boolean traverseBinding2ExtensibilityElement = true;
  private boolean traverseBinding2PortType = true; // reference
  private boolean traverseBindingFault2Element = true;
  private boolean traverseBindingFault2ExtensibilityElement = true;
  private boolean traverseBindingInput2Element = true;
  private boolean traverseBindingInput2ExtensibilityElement = true;
  private boolean traverseBindingOperation2BindingFault = true;
  private boolean traverseBindingOperation2BindingInput = true;
  private boolean traverseBindingOperation2BindingOutput = true;
  private boolean traverseBindingOperation2Element = true;
  private boolean traverseBindingOperation2ExtensibilityElement = true;
  private boolean traverseBindingOperation2Operation = true; // reference  
  private boolean traverseBindingOutput2Element = true;
  private boolean traverseBindingOutput2ExtensibilityElement = true;
  private boolean traverseDefinition2Binding = true;
  private boolean traverseDefinition2Element = true;
  private boolean traverseDefinition2ExtensibilityElement = true;
  private boolean traverseDefinition2Import = true;
  private boolean traverseDefinition2Message = true;
  private boolean traverseDefinition2PortType = true;
  private boolean traverseDefinition2Service = true;
  private boolean traverseDefinition2Types = true;
  private boolean traverseFault2Element = true;
  private boolean traverseFault2Message = true; // reference 
  private boolean traverseImport2Definition = true;
  private boolean traverseImport2Element = true;
  private boolean traverseInput2Element = true;
  private boolean traverseInput2Message = true; // reference 
  private boolean traverseMessage2Element = true;
  private boolean traverseMessage2Part = true;
  private boolean traverseOperation2Element = true;
  private boolean traverseOperation2Fault = true;
  private boolean traverseOperation2Input = true;
  private boolean traverseOperation2Output = true;
  private boolean traverseOutput2Element = true;
  private boolean traverseOutput2Message = true; // reference 
  private boolean traversePart2Element = true;
  private boolean traversePort2Binding = true; // reference 
  private boolean traversePort2Element = true;
  private boolean traversePort2ExtensibilityElement = true;
  private boolean traversePortType2Element = true;
  private boolean traversePortType2Operation = true;
  private boolean traverseService2Element = true;
  private boolean traverseService2ExtensibilityElement = true;
  private boolean traverseService2Port = true;
  private boolean traverseTypes2Element = true;
  private boolean traverseTypes2ExtensibilityElement = true;
  //private boolean traverseSOAPBody2Part = true;
  private boolean traverseSOAPHeader2SOAPHeaderFault = true;
  private boolean traverseBinding2SOAPBinding = true;
  private boolean traverseBindingOperation2SOAPOperation = true;
  private boolean traverseBindingInput2SOAPHeader = true;
  private boolean traverseBindingInput2SOAPBody = true;
  private boolean traverseBindingOutput2SOAPHeader = true;
  private boolean traverseBindingOutput2SOAPBody = true;
  private boolean traverseBindingFault2SOAPFault = true;

  /**
   * Flags which specify whether traversal will visit corresponding WSDL
   * artifact.
   */
  private boolean visitBinding = false;
  private boolean visitBindingFault = false;
  private boolean visitBindingInput = false;
  private boolean visitBindingOperation = false;
  private boolean visitBindingOutput = false;
  private boolean visitDefinition = false;
  private boolean visitElement = false;
  private boolean visitExtensibilityElement = false;
  private boolean visitFault = false;
  private boolean visitImport = false;
  private boolean visitInput = false;
  private boolean visitMessage = false;
  private boolean visitOperation = false;
  private boolean visitOutput = false;
  private boolean visitPart = false;
  private boolean visitPort = false;
  private boolean visitPortType = false;
  private boolean visitService = false;
  private boolean visitTypes = false;
  private boolean visitSOAPBinding = false;
  private boolean visitSOAPBody = false;
  private boolean visitSOAPFault = false;
  private boolean visitSOAPHeader = false;
  private boolean visitSOAPHeaderFault = false;
  private boolean visitSOAPOperation = false;

  /**
   * Default constructor.
   * @see java.lang.Object#Object()
   */
  public WSDLTraversal()
  {
  }

  /**
   * The method specifies that traversal will ignore indirect references between
   * WSDL artifacts. For example:
   * <ol>
   *   <li>binding to port type</li>
   *   <li>binding operation to operation</li>
   *   <li>fault to message</li>
   *   <li>input to message</li>
   *   <li>output to message</li>
   *   <li>port to binding</li>
   * </ol>
   */
  public void ignoreReferences()
  {
    ignoreBinding2PortType();
    ignoreBindingOperation2Operation();
    ignoreFault2Message();
    ignoreInput2Message();
    ignoreOutput2Message();
    ignorePort2Binding();
    //ignoreSOAPBody2Part();
  }

  /**
   * The method sets visitor.
   * @param visitor  a WSDL visitor.
   */
  public void setVisitor(WSDLVisitor visitor)
  {
    this.visitor = visitor;
  }

  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return the traversal.
   */
  public WSDLTraversal ignoreBinding2SOAPBinding()
  {
    traverseBinding2SOAPBinding = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2SOAPOperation()
  {
    traverseBindingOperation2SOAPOperation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingInput2SOAPHeader()
  {
    traverseBindingInput2SOAPHeader = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingInput2SOAPBody()
  {
    traverseBindingInput2SOAPBody = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOutput2SOAPHeader()
  {
    traverseBindingOutput2SOAPHeader = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOutput2SOAPBody()
  {
    traverseBindingOutput2SOAPBody = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingFault2SOAPFault()
  {
    traverseBindingFault2SOAPFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPHeader2SOAPHeaderFault()
  {
    traverseSOAPHeader2SOAPHeaderFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBinding2BindingOperation()
  {
    traverseBinding2BindingOperation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBinding2Element()
  {
    traverseBinding2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBinding2ExtensibilityElement()
  {
    traverseBinding2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBinding2PortType()
  {
    traverseBinding2PortType = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingFault2Element()
  {
    traverseBindingFault2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingFault2ExtensibilityElement()
  {
    traverseBindingFault2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingInput2Element()
  {
    traverseBindingInput2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingInput2ExtensibilityElement()
  {
    traverseBindingInput2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2BindingFault()
  {
    traverseBindingOperation2BindingFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2BindingInput()
  {
    traverseBindingOperation2BindingInput = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2BindingOutput()
  {
    traverseBindingOperation2BindingOutput = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2Element()
  {
    traverseBindingOperation2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2ExtensibilityElement()
  {
    traverseBindingOperation2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation2Operation()
  {
    traverseBindingOperation2Operation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOutput2Element()
  {
    traverseBindingOutput2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOutput2ExtensibilityElement()
  {
    traverseBindingOutput2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Binding()
  {
    traverseDefinition2Binding = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Element()
  {
    traverseDefinition2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2ExtensibilityElement()
  {
    traverseDefinition2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Import()
  {
    traverseDefinition2Import = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Message()
  {
    traverseDefinition2Message = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2PortType()
  {
    traverseDefinition2PortType = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Service()
  {
    traverseDefinition2Service = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition2Types()
  {
    traverseDefinition2Types = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreFault2Element()
  {
    traverseFault2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreFault2Message()
  {
    traverseFault2Message = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreImport2Definition()
  {
    traverseImport2Definition = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreImport2Element()
  {
    traverseImport2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreInput2Element()
  {
    traverseInput2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreInput2Message()
  {
    traverseInput2Message = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreMessage2Element()
  {
    traverseMessage2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreMessage2Part()
  {
    traverseMessage2Part = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOperation2Element()
  {
    traverseOperation2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOperation2Fault()
  {
    traverseOperation2Fault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOperation2Input()
  {
    traverseOperation2Input = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOperation2Output()
  {
    traverseOperation2Output = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOutput2Element()
  {
    traverseOutput2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOutput2Message()
  {
    traverseOutput2Message = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePart2Element()
  {
    traversePart2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePort2Binding()
  {
    traversePort2Binding = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePort2Element()
  {
    traversePort2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePort2ExtensibilityElement()
  {
    traversePort2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePortType2Element()
  {
    traversePortType2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePortType2Operation()
  {
    traversePortType2Operation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreService2Element()
  {
    traverseService2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreService2ExtensibilityElement()
  {
    traverseService2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreService2Port()
  {
    traverseService2Port = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreTypes2Element()
  {
    traverseTypes2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore reference between WSDL elements...
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreTypes2ExtensibilityElement()
  {
    traverseTypes2ExtensibilityElement = false;
    return this;
  }

  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPBinding(boolean value)
  {
    visitSOAPBinding = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPBody(boolean value)
  {
    visitSOAPBody = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPFault(boolean value)
  {
    visitSOAPFault = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPHeader(boolean value)
  {
    visitSOAPHeader = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPHeaderFault(boolean value)
  {
    visitSOAPHeaderFault = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitSOAPOperation(boolean value)
  {
    visitSOAPOperation = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitBinding(boolean value)
  {
    visitBinding = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitBindingFault(boolean value)
  {
    visitBindingFault = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitBindingInput(boolean value)
  {
    visitBindingInput = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitBindingOperation(boolean value)
  {
    visitBindingOperation = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitBindingOutput(boolean value)
  {
    visitBindingOutput = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitDefinition(boolean value)
  {
    visitDefinition = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitElement(boolean value)
  {
    visitElement = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitExtensibilityElement(boolean value)
  {
    visitExtensibilityElement = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitFault(boolean value)
  {
    visitFault = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitImport(boolean value)
  {
    visitImport = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitInput(boolean value)
  {
    visitInput = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitMessage(boolean value)
  {
    visitMessage = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitOperation(boolean value)
  {
    visitOperation = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitOutput(boolean value)
  {
    visitOutput = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitPart(boolean value)
  {
    visitPart = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitPort(boolean value)
  {
    visitPort = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitPortType(boolean value)
  {
    visitPortType = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitService(boolean value)
  {
    visitService = value;
    return this;
  }
  /**
   * Instructs traversal to visit or not the corresponding WSDL element.
   * @param value true if the WSDL element should be visited, otherwise - false.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal visitTypes(boolean value)
  {
    visitTypes = value;
    return this;
  }

  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBinding()
  {
    traverseDefinition2Binding = false;
    traversePort2Binding = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingFault()
  {
    traverseBindingOperation2BindingFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingInput()
  {
    traverseBindingOperation2BindingInput = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOperation()
  {
    traverseBinding2BindingOperation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreBindingOutput()
  {
    traverseBindingOperation2BindingOutput = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreDefinition()
  {
    traverseImport2Definition = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreElement()
  {
    traverseBinding2Element = false;
    traverseBindingFault2Element = false;
    traverseBindingInput2Element = false;
    traverseBindingOperation2Element = false;
    traverseBindingOutput2Element = false;
    traverseDefinition2Element = false;
    traversePort2Element = false;
    traverseService2Element = false;
    traverseFault2Element = false;
    traverseOutput2Element = false;
    traverseImport2Element = false;
    traverseInput2Element = false;
    traverseOperation2Element = false;
    traverseMessage2Element = false;
    traversePart2Element = false;
    traversePortType2Element = false;
    traverseTypes2Element = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreExtensibilityElement()
  {
    traverseService2ExtensibilityElement = false;
    traversePort2ExtensibilityElement = false;
    traverseDefinition2ExtensibilityElement = false;
    traverseBindingOutput2ExtensibilityElement = false;
    traverseBinding2ExtensibilityElement = false;
    traverseBindingFault2ExtensibilityElement = false;
    traverseBindingInput2ExtensibilityElement = false;
    traverseBindingOperation2ExtensibilityElement = false;
    traverseTypes2ExtensibilityElement = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPBinding()
  {
    traverseBinding2SOAPBinding = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPOperation()
  {
    traverseBindingOperation2SOAPOperation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPBody()
  {
    traverseBindingInput2SOAPBody = false;
    traverseBindingOutput2SOAPBody = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPHeader()
  {
    traverseBindingInput2SOAPHeader = false;
    traverseBindingOutput2SOAPHeader = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPHeaderFault()
  {
    traverseSOAPHeader2SOAPHeaderFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreSOAPFault()
  {
    traverseBindingFault2SOAPFault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreFault()
  {
    traverseOperation2Fault = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreImport()
  {
    traverseImport2Definition = false; // fix
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreInput()
  {
    traverseOperation2Input = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreMessage()
  {
    traverseFault2Message = false;
    traverseDefinition2Message = false;
    traverseInput2Message = false;
    traverseOutput2Message = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOperation()
  {
    traverseBindingOperation2Operation = false;
    traversePortType2Operation = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreOutput()
  {
    traverseOperation2Output = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePart()
  {
    traverseMessage2Part = false;
    //traverseSOAPBody2Part = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePort()
  {
    traverseService2Port = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignorePortType()
  {
    traverseBinding2PortType = false;
    traverseDefinition2PortType = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreService()
  {
    traverseDefinition2Service = false;
    return this;
  }
  /**
   * Instructs traversal to ignore all references to the corresponding WSDL
   * element.
   * @return a WSDLTraversal object.
   */
  public WSDLTraversal ignoreTypes()
  {
    traverseDefinition2Types = false;
    return this;
  }

  /**
   * The method adjusts traveseXXX variables according to the visitXXX variables
   */
  private void adjust()
  {
    adjustPart();
    adjustService();
    adjustTypes();
    adjustOperation();
    adjustInput();
    adjustOutput();
    adjustFault();
    adjustBinding();
    adjustBindingOperation();
    adjustBindingInput();
    adjustBindingOutput();
    adjustBindingFault();
    adjustImport();
    adjustElement();
    adjustMessage();
    adjustPort();
    adjustPortType();
    adjustDefinition();
    adjustExtensibilityElement();
    adjustSOAPBinding();
    adjustSOAPBody();
    adjustSOAPHeader();
    adjustSOAPHeaderFault();
    adjustSOAPFault();
    adjustSOAPOperation();
  }

  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustExtensibilityElement()
  {
    boolean value = visitExtensibilityElement;
    if (!value)
      ignoreExtensibilityElement();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustPart()
  {
    boolean value = visitPart || (traversePart2Element && adjustElement());
    if (!value)
      ignorePart();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPHeader()
  {
    boolean value =
      visitSOAPHeader
        || (traverseSOAPHeader2SOAPHeaderFault && adjustSOAPHeaderFault());
    if (!value)
      ignoreSOAPHeader();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustBindingOutput()
  {
    boolean value =
      visitBindingOutput
        || (traverseBindingOutput2Element && adjustElement())
        || (traverseBindingOutput2ExtensibilityElement
          && adjustExtensibilityElement())
        || (traverseBindingOutput2SOAPBody
          && adjustSOAPBody()
          || (traverseBindingOutput2SOAPHeader && adjustSOAPHeader()));
    if (!value)
      ignoreBindingOutput();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustElement()
  {
    boolean value = visitElement;
    if (!value)
      ignoreElement();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustTypes()
  {
    boolean value =
      visitTypes
        || (traverseTypes2Element && adjustElement())
        || (traverseTypes2ExtensibilityElement && adjustExtensibilityElement());
    if (!value)
      ignoreTypes();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPBinding()
  {
    boolean value = visitSOAPBinding;
    if (!value)
      ignoreSOAPBinding();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustPort()
  {
    boolean value =
      visitPort
        || (traversePort2Element && adjustElement())
        || (traversePort2ExtensibilityElement && adjustExtensibilityElement())
        || (traversePort2Binding && adjustBinding());
    if (!value)
      ignorePort();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustOperation()
  {
    boolean value =
      visitOperation
        || (traverseOperation2Element && adjustElement())
        || (traverseOperation2Input && adjustInput())
        || (traverseOperation2Output && adjustOutput())
        || (traverseOperation2Fault && adjustFault());
    if (!value)
      ignoreOperation();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustBindingOperation()
  {
    boolean value =
      visitBindingOperation
        || (traverseBindingOperation2Element && adjustElement())
        || (traverseBindingOperation2BindingFault && adjustBindingFault())
        || (traverseBindingOperation2BindingOutput && adjustBindingOutput())
        || (traverseBindingOperation2Operation && adjustOperation())
        || (traverseBindingOperation2BindingInput && adjustBindingInput())
        || (traverseBindingOperation2ExtensibilityElement
          && adjustExtensibilityElement())
        || (traverseBindingOperation2SOAPOperation && adjustSOAPOperation());
    if (!value)
      ignoreBindingOperation();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustInput()
  {
    boolean value =
      visitInput
        || (traverseInput2Element && adjustElement())
        || (traverseInput2Message && adjustMessage());
    if (!value)
      ignoreInput();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustBinding()
  {
    boolean value =
      visitBinding
        || (traverseBinding2Element && adjustElement())
        || (traverseBinding2BindingOperation && adjustBindingOperation())
        || (traverseBinding2ExtensibilityElement && adjustExtensibilityElement())
        || (traverseBinding2PortType && adjustPortType())
        || (traverseBinding2SOAPBinding && adjustSOAPBinding());
    if (!value)
      ignoreBinding();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPBody()
  {
    boolean value = visitSOAPBody;
    /* || 
    		(traverseSOAPBody2Part && adjustPart());*/
    if (!value)
      ignoreSOAPBody();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPHeaderFault()
  {
    boolean value = visitSOAPHeaderFault;
    if (!value)
      ignoreSOAPHeaderFault();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustBindingInput()
  {
    boolean value =
      visitBindingInput
        || (traverseBindingInput2Element && adjustElement())
        || (traverseBindingInput2ExtensibilityElement
          && adjustExtensibilityElement())
        || (traverseBindingInput2SOAPBody
          && adjustSOAPBody()
          || (traverseBindingInput2SOAPHeader && adjustSOAPHeader()));
    if (!value)
      ignoreBindingInput();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustOutput()
  {
    boolean value =
      visitOutput
        || (traverseOutput2Element && adjustElement())
        || (traverseOutput2Message && adjustMessage());
    if (!value)
      ignoreOutput();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustBindingFault()
  {
    boolean value =
      visitBindingFault
        || (traverseBindingFault2Element && adjustElement())
        || (traverseBindingFault2ExtensibilityElement
          && adjustExtensibilityElement())
        || (traverseBindingFault2SOAPFault && adjustSOAPFault());
    if (!value)
      ignoreBindingFault();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPOperation()
  {
    boolean value = visitSOAPOperation;
    if (!value)
      ignoreSOAPOperation();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustDefinition()
  {
    boolean value =
      visitDefinition
        || (traverseDefinition2Element && adjustElement())
        || (traverseDefinition2Import && adjustImport())
        || (traverseDefinition2Types && adjustTypes())
        || (traverseDefinition2Message && adjustMessage())
        || (traverseDefinition2ExtensibilityElement
          && adjustExtensibilityElement())
        || (traverseDefinition2PortType && adjustPortType())
        || (traverseDefinition2Binding && adjustBinding())
        || (traverseDefinition2Service && adjustService());
    if (!value)
      ignoreDefinition();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustSOAPFault()
  {
    boolean value = visitSOAPFault;
    if (!value)
      ignoreSOAPFault();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustImport()
  {
    boolean value = visitImport || (traverseImport2Definition
    /* && adjustDefinition()*/
      )
    || // avoid cycling problem. Thus, you should call ignoreImport manually  
   (traverseImport2Element && adjustElement());
    if (!value)
      ignoreImport();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustFault()
  {
    boolean value =
      visitFault
        || (traverseFault2Element && adjustElement())
        || (traverseFault2Message && adjustMessage());
    if (!value)
      ignoreFault();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustPortType()
  {
    boolean value =
      visitPortType
        || (traversePortType2Element && adjustElement())
        || (traversePortType2Operation && adjustOperation());
    if (!value)
      ignorePortType();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustService()
  {
    boolean value =
      visitService
        || (traverseService2Element && adjustElement())
        || (traverseService2ExtensibilityElement && adjustExtensibilityElement())
        || (traverseService2Port && adjustPort());
    if (!value)
      ignoreService();
    return value;
  }
  /**
   * The method adjusts traversal ignore flags according to the
   * corresponding visit flags.
   * @return boolean 
   */
  private boolean adjustMessage()
  {
    boolean value =
      visitMessage
        || (traverseMessage2Element && adjustElement())
        || (traverseMessage2Part && adjustPart());
    if (!value)
      ignoreMessage();
    return value;
  }

  /**
   * The method traverses given WSDL extensibility element according to the 
   * settings in the traversal context.
   * 
   * @param objExtensibilityElement  a WSDL extensibility element artifact.
   * @param parent                   parent of the WSDL extensibility element artifact.
   * @param ctx                      the traversal contex.
   */
  private void traverse(
    ExtensibilityElement objExtensibilityElement,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeExtensibilityElementProcessing();
    ctx.setExtensibilityElement(objExtensibilityElement);
    if (visitExtensibilityElement)
      visitor.visit(objExtensibilityElement, parent, ctx);
  }

  /**
   * The method traverses given WSDL part artifact according to the settings in
   * the traversal context.
   * 
   * @param objPart  the WSDL part artifact.
   * @param parent   parent of the WSDL part artifact.
   * @param ctx      the traversal contex.
   */
  private void traverse(Part objPart, Object parent, WSDLTraversalContext ctx)
  {
    ctx.resumePartProcessing();
    ctx.setPart(objPart);
    if (visitPart)
    {
      visitor.visit(objPart, parent, ctx);
      if (!ctx.processPart())
        return;
    }
    if (objPart == null)
      return;
    if (traversePart2Element)
      traverse(objPart.getDocumentationElement(), objPart, ctx);
  }

  /**
   * The method traverses given WSDL SOAP header artifact according to the 
   * settings in the traversal context.
   * 
   * @param objSOAPHeader  a WSDL SOAP header artifact.
   * @param parent         parent of the WSDL SOAP header artifact.
   * @param ctx            the traversal contex.
   */
  private void traverse(
    SOAPHeader objSOAPHeader,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeSOAPHeaderProcessing();
    ctx.setSOAPHeader(objSOAPHeader);
    if (visitSOAPHeader)
    {
      visitor.visit(objSOAPHeader, parent, ctx);
      if (!ctx.processSOAPHeader())
        return;
    }
    if (objSOAPHeader == null)
      return;
    if (traverseSOAPHeader2SOAPHeaderFault
      && objSOAPHeader.getSOAPHeaderFaults() != null)
    {
      Iterator it = objSOAPHeader.getSOAPHeaderFaults().iterator();
      while (it.hasNext())
      {
        traverse((SOAPHeaderFault) it.next(), objSOAPHeader, ctx);
        if (!ctx.processSOAPHeader())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL element artifact according to the settings in
   * the traversal context.
   * 
   * @param objElement  a WSDL element artifact.
   * @param parent   parent of the WSDL element artifact.
   * @param ctx      the traversal contex.
   */
  private void traverse(
    Element objElement,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.setElement(objElement);
    if (visitElement)
      visitor.visit(objElement, parent, ctx);
  }

  /**
   * The method traverses given WSDL types artifact according to the settings in
   * the traversal context.
   * 
   * @param objTypes  a WSDL types artifact.
   * @param parent    parent of the WSDL types artifact.
   * @param ctx       the traversal contex.
   */
  private void traverse(
    Types objTypes,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeTypesProcessing();
    ctx.setTypes(objTypes);
    if (visitTypes)
    {
      visitor.visit(objTypes, parent, ctx);
      if (!ctx.processTypes())
        return;
    }
    if (objTypes == null)
      return;
    if (traverseTypes2Element)
    {
      traverse(objTypes.getDocumentationElement(), objTypes, ctx);
      if (!ctx.processTypes())
        return;
    }
    if (traverseTypes2ExtensibilityElement
      && objTypes.getExtensibilityElements() != null)
    {
      Iterator it = objTypes.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objTypes, ctx);
        if (!ctx.processTypes())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL SOAP binding artifact according to the 
   * settings in the traversal context.
   * 
   * @param objSOAPBinding  a WSDL SOAP binding artifact.
   * @param parent          parent of the WSDL SOAP binding artifact.
   * @param ctx             the traversal contex.
   */
  private void traverse(
    SOAPBinding objSOAPBinding,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.setSOAPBinding(objSOAPBinding);
    if (visitSOAPBinding)
      visitor.visit(objSOAPBinding, parent, ctx);
  }

  /**
   * The method traverses given WSDL definition artifact according to the 
   * settings in the traversal context.
   * 
   * @param objDefinition  a WSDL definition artifact.
   * @param parent         parent of the WSDL definition artifact.
   * @param ctx            the traversal contex.
   */
  private void traverse(
    Definition objDefinition,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeDefinitionProcessing();
    ctx.setDefinition(objDefinition);
    if (visitDefinition)
    {
      visitor.visit(objDefinition, parent, ctx);
      if (!ctx.processDefinition())
        return;
    }
    if (objDefinition == null)
      return;
    if (traverseDefinition2Import && objDefinition.getImports() != null)
    {
      Iterator it = objDefinition.getImports().values().iterator();
      while (it.hasNext())
      {
        Vector v = (Vector) it.next();
        if (v != null)
        {
          Iterator it2 = v.iterator();
          while (it2.hasNext())
          {
            traverse((Import) it2.next(), objDefinition, ctx);
            if (!ctx.processDefinition())
              return;
          }
        }
      }
    }
    if (traverseDefinition2Element)
    {
      traverse(objDefinition.getDocumentationElement(), objDefinition, ctx);
      if (!ctx.processDefinition())
        return;
    }
    if (traverseDefinition2Types)
    {
      traverse(objDefinition.getTypes(), objDefinition, ctx);
      if (!ctx.processDefinition())
        return;
    }
    if (traverseDefinition2Message && objDefinition.getMessages() != null)
    {
      Iterator it = objDefinition.getMessages().values().iterator();
      while (it.hasNext())
      {
        traverse((Message) it.next(), objDefinition, ctx);
        if (!ctx.processDefinition())
          return;
      }
    }
    if (traverseDefinition2PortType && objDefinition.getPortTypes() != null)
    {
      Iterator it = objDefinition.getPortTypes().values().iterator();
      while (it.hasNext())
      {
        traverse((PortType) it.next(), objDefinition, ctx);
        if (!ctx.processDefinition())
          return;
      }
    }
    if (traverseDefinition2Binding && objDefinition.getBindings() != null)
    {
      Iterator it = objDefinition.getBindings().values().iterator();
      while (it.hasNext())
      {
        traverse((Binding) it.next(), objDefinition, ctx);
        if (!ctx.processDefinition())
          return;
      }
    }
    if (traverseDefinition2Service && objDefinition.getServices() != null)
    {
      Iterator it = objDefinition.getServices().values().iterator();
      while (it.hasNext())
      {
        traverse((Service) it.next(), objDefinition, ctx);
        if (!ctx.processDefinition())
          return;
      }
    }
    if (traverseDefinition2ExtensibilityElement
      && objDefinition.getExtensibilityElements() != null)
    {
      Iterator it = objDefinition.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objDefinition, ctx);
        if (!ctx.processDefinition())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL port artifact according to the settings in
   * the traversal context.
   * 
   * @param objPort  a WSDL port artifact.
   * @param parent   parent of the WSDL port artifact.
   * @param ctx      the traversal contex.
   */
  private void traverse(Port objPort, Object parent, WSDLTraversalContext ctx)
  {
    ctx.resumePortProcessing();
    ctx.setPort(objPort);
    if (visitPort)
    {
      visitor.visit(objPort, parent, ctx);
      if (!ctx.processPort())
        return;
    }
    if (objPort == null)
      return;
    if (traversePort2Element)
    {
      traverse(objPort.getDocumentationElement(), objPort, ctx);
      if (!ctx.processPort())
        return;
    }
    if (traversePort2Binding)
    {
      traverse(objPort.getBinding(), objPort, ctx);
      if (!ctx.processPort())
        return;
    }
    if (traversePort2ExtensibilityElement
      && objPort.getExtensibilityElements() != null)
    {
      Iterator it = objPort.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objPort, ctx);
        if (!ctx.processPort())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL operation artifact according to the settings in
   * the traversal context.
   * 
   * @param objOperation  a WSDL operation artifact.
   * @param parent        parent of the WSDL operation artifactt.
   * @param ctx           the traversal contex.
   */
  private void traverse(
    Operation objOperation,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeOperationProcessing();
    ctx.setOperation(objOperation);
    if (visitOperation)
    {
      visitor.visit(objOperation, parent, ctx);
      if (!ctx.processOperation())
        return;
    }
    if (objOperation == null)
      return;
    if (traverseOperation2Element)
    {
      traverse(objOperation.getDocumentationElement(), objOperation, ctx);
      if (!ctx.processOperation())
        return;
    }
    if (traverseOperation2Input)
    {
      traverse(objOperation.getInput(), objOperation, ctx);
      if (!ctx.processOperation())
        return;
    }
    if (traverseOperation2Output)
    {
      traverse(objOperation.getOutput(), objOperation, ctx);
      if (!ctx.processOperation())
        return;
    }
    if (traverseOperation2Fault && objOperation.getFaults() != null)
    {
      Iterator it = objOperation.getFaults().values().iterator();
      while (it.hasNext())
      {
        traverse((Fault) it.next(), objOperation, ctx);
        if (!ctx.processOperation())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL input artifact according to the settings in
   * the traversal context.
   * 
   * @param objInput  a WSDL input artifact.
   * @param parent    parent of the WSDL input artifact.
   * @param ctx       the traversal contex.
   */
  private void traverse(
    Input objInput,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeInputProcessing();
    ctx.setInput(objInput);
    if (visitInput)
    {
      visitor.visit(objInput, parent, ctx);
      if (!ctx.processInput())
        return;
    }
    if (objInput == null)
      return;
    if (traverseInput2Element)
    {
      traverse(objInput.getDocumentationElement(), objInput, ctx);
      if (!ctx.processInput())
        return;
    }
    if (traverseInput2Message)
      traverse(objInput.getMessage(), objInput, ctx);
  }

  /**
   * The method traverses given WSDL SOAP body artifact according to the 
   * settings in the traversal context.
   * 
   * @param objSOAPBody  a WSDL SOAP body artifact.
   * @param parent       parent of the WSDL SOAP body artifact.
   * @param ctx          the traversal contex.
   */
  private void traverse(
    SOAPBody objSOAPBody,
    Object parent,
    WSDLTraversalContext ctx)
  {
    //  	ctx.resumeSOAPBodyProcessing();
    ctx.setSOAPBody(objSOAPBody);
    if (visitSOAPBody)
      //	{
      visitor.visit(objSOAPBody, parent, ctx);
    /*	  if (!ctx.processSOAPBody())
    		return;
    	}
    	if (objSOAPBody == null)
    		return;
    	if (traverseSOAPBody2Part && objSOAPBody.getParts() != null) {
    	  if (ctx)
    	  Iterator it = objSOAPBody.getParts().iterator();
    	  while (it.hasNext()) {
    	  	
    		traverse((Part)it.next(), objSOAPBody, ctx);
    		if (!ctx.processSOAPBody())
    		  return;
    	  }
    	}
    */
  }

  /**
   * The method traverses given WSDL SOAP header fault artifact according to 
   * the settings in the traversal context.
   * 
   * @param objSOAPHeaderFault  a WSDL SOAP header fault artifact.
   * @param parent              parent of the WSDL SOAP header fault artifact.
   * @param ctx                 the traversal contex.
   */
  private void traverse(
    SOAPHeaderFault objSOAPHeaderFault,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.setSOAPHeaderFault(objSOAPHeaderFault);
    if (visitSOAPHeaderFault)
      visitor.visit(objSOAPHeaderFault, parent, ctx);
  }

  /**
   * The method traverses given WSDL output artifact according to the settings in
   * the traversal context.
   * 
   * @param objOutput  a WSDL output artifact.
   * @param parent   parent of the WSDL output artifact.
   * @param ctx      the traversal contex.
   * @param parent
   * @param ctx
   */
  private void traverse(
    Output objOutput,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeOutputProcessing();
    ctx.setOutput(objOutput);
    if (visitOutput)
    {
      visitor.visit(objOutput, parent, ctx);
      if (!ctx.processOutput())
        return;
    }
    if (objOutput == null)
      return;
    if (traverseOutput2Element)
    {
      traverse(objOutput.getDocumentationElement(), objOutput, ctx);
      if (!ctx.processOutput())
        return;
    }
    if (traverseOutput2Message)
      traverse(objOutput.getMessage(), objOutput, ctx);
  }

  /**
   * The method traverses given WSDL binding fault artifact according to the 
   * settings in the traversal context.
   * 
   * @param objBindingFault  a WSDL binding fault artifact.
   * @param parent           parent of the WSDL binding fault artifact.
   * @param ctx              the traversal contex.
   */
  private void traverse(
    BindingFault objBindingFault,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeBindingFaultProcessing();
    ctx.setBindingFault(objBindingFault);
    if (visitBindingFault)
    {
      visitor.visit(objBindingFault, parent, ctx);
      if (!ctx.processBindingFault())
        return;
    }
    if (objBindingFault == null)
      return;
    if (traverseBindingFault2Element)
    {
      traverse(objBindingFault.getDocumentationElement(), objBindingFault, ctx);
      if (!ctx.processBindingFault())
        return;
    }
    if (traverseBindingFault2SOAPFault
      && objBindingFault.getExtensibilityElements() != null)
    {
      Iterator it = objBindingFault.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        Object o = it.next();
        if (o instanceof SOAPFault)
          traverse((SOAPFault) o, objBindingFault, ctx);
        if (!ctx.processBindingFault())
          return;
      }
    }
    if (traverseBindingFault2ExtensibilityElement
      && objBindingFault.getExtensibilityElements() != null)
    {
      Iterator it = objBindingFault.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objBindingFault, ctx);
        if (!ctx.processBindingFault())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL SOAP operation artifact according to 
   * the settings in the traversal context.
   * 
   * @param objSOAPOperation  a WSDL SOAP operation artifact.
   * @param parent            parent of the WSDL SOAP operation artifact.
   * @param ctx               the traversal contex.
   */
  private void traverse(
    SOAPOperation objSOAPOperation,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.setSOAPOperation(objSOAPOperation);
    if (visitSOAPOperation)
      visitor.visit(objSOAPOperation, parent, ctx);
  }

  /**
   * The method traverses given WSDL binding input artifact according to 
   * the settings in the traversal context.
   * 
   * @param objBindingInput  a WSDL binding input artifact.
   * @param parent           parent of the WSDL binding input artifact.
   * @param ctx              the traversal contex.
   */
  private void traverse(
    BindingInput objBindingInput,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeBindingInputProcessing();
    ctx.setBindingInput(objBindingInput);
    if (visitBindingInput)
    {
      visitor.visit(objBindingInput, parent, ctx);
      if (!ctx.processBindingInput())
        return;
    }
    if (objBindingInput == null)
      return;
    if (traverseBindingInput2Element)
    {
      traverse(objBindingInput.getDocumentationElement(), objBindingInput, ctx);
      if (!ctx.processBindingInput())
        return;
    }
    if ((traverseBindingInput2SOAPBody || traverseBindingInput2SOAPHeader)
      && objBindingInput.getExtensibilityElements() != null)
    {
      Iterator it = objBindingInput.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        Object o = it.next();
        if (traverseBindingInput2SOAPBody && (o instanceof SOAPBody))
          traverse((SOAPBody) o, objBindingInput, ctx);
        else if (traverseBindingInput2SOAPHeader && (o instanceof SOAPHeader))
          traverse((SOAPHeader) o, objBindingInput, ctx);
        if (!ctx.processBindingInput())
          return;
      }
    }
    if (traverseBindingInput2ExtensibilityElement
      && objBindingInput.getExtensibilityElements() != null)
    {
      Iterator it = objBindingInput.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objBindingInput, ctx);
        if (!ctx.processBindingInput())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL binding operation artifact according to 
   * the settings in the traversal context.
   * 
   * @param objBindingOperation  a WSDL binding operation artifact.
   * @param parent               parent of the WSDL binding operation artifact.
   * @param ctx                  the traversal contex.
   */
  private void traverse(
    BindingOperation objBindingOperation,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeBindingOperationProcessing();
    ctx.setBindingOperation(objBindingOperation);
    if (visitBindingOperation)
    {
      visitor.visit(objBindingOperation, parent, ctx);
      if (!ctx.processBindingOperation())
        return;
    }
    if (objBindingOperation == null)
      return;
    if (traverseBindingOperation2Element)
    {
      traverse(
        objBindingOperation.getDocumentationElement(),
        objBindingOperation,
        ctx);
      if (!ctx.processBindingOperation())
        return;
    }
    if (traverseBindingOperation2SOAPOperation
      && objBindingOperation.getExtensibilityElements() != null)
    {
      Iterator it = objBindingOperation.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        Object o = it.next();
        if (o instanceof SOAPOperation)
          traverse((SOAPOperation) o, objBindingOperation, ctx);
        if (!ctx.processBindingOperation())
          return;
      }
    }
    if (traverseBindingOperation2ExtensibilityElement
      && objBindingOperation.getExtensibilityElements() != null)
    {
      Iterator it = objBindingOperation.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objBindingOperation, ctx);
        if (!ctx.processBindingOperation())
          return;
      }
    }
    if (traverseBindingOperation2Operation)
    {
      traverse(objBindingOperation.getOperation(), objBindingOperation, ctx);
      if (!ctx.processBindingOperation())
        return;
    }
    if (traverseBindingOperation2BindingInput)
    {
      traverse(objBindingOperation.getBindingInput(), objBindingOperation, ctx);
      if (!ctx.processBindingOperation())
        return;
    }
    if (traverseBindingOperation2BindingOutput)
    {
      traverse(
        objBindingOperation.getBindingOutput(),
        objBindingOperation,
        ctx);
      if (!ctx.processBindingOperation())
        return;
    }
    if (traverseBindingOperation2BindingFault
      && objBindingOperation.getBindingFaults() != null)
    {
      Iterator it = objBindingOperation.getBindingFaults().values().iterator();
      while (it.hasNext())
      {
        traverse((BindingFault) it.next(), objBindingOperation, ctx);
        if (!ctx.processBindingOperation())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL SOAP fault artifact according to the 
   * settings in the traversal context.
   * 
   * @param objSOAPFault  a WSDL SOAP fault artifact.
   * @param parent        parent of the WSDL SOAP fault artifact.
   * @param ctx           the traversal contex.
   */
  private void traverse(
    SOAPFault objSOAPFault,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.setSOAPFault(objSOAPFault);
    if (visitSOAPFault)
      visitor.visit(objSOAPFault, parent, ctx);
  }

  /**
   * The method traverses given WSDL binding artifact according to the settings in
   * the traversal context.
   * 
   * @param objBinding  a WSDL binding artifact.
   * @param parent      parent of the WSDL binding artifact.
   * @param ctx         the traversal contex.
   */
  private void traverse(
    Binding objBinding,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeBindingProcessing();
    ctx.setBinding(objBinding);
    if (visitBinding)
    {
      visitor.visit(objBinding, parent, ctx);
      if (!ctx.processBinding())
        return;
    }
    if (objBinding == null)
      return;
    if (traverseBinding2Element)
    {
      traverse(objBinding.getDocumentationElement(), objBinding, ctx);
      if (!ctx.processBinding())
        return;
    }
    if (traverseBinding2SOAPBinding
      && objBinding.getExtensibilityElements() != null)
    {
      Iterator it = objBinding.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        Object o = it.next();
        if (o instanceof SOAPBinding)
          traverse((SOAPBinding) o, objBinding, ctx);
        if (!ctx.processBinding())
          return;
      }
    }
    if (traverseBinding2PortType)
    {
      traverse(objBinding.getPortType(), objBinding, ctx);
      if (!ctx.processBinding())
        return;
    }
    if (traverseBinding2BindingOperation
      && objBinding.getBindingOperations() != null)
    {
      Iterator it = objBinding.getBindingOperations().iterator();
      while (it.hasNext())
      {
        traverse((BindingOperation) it.next(), objBinding, ctx);
        if (!ctx.processBinding())
          return;
      }
    }
    if (traverseBinding2ExtensibilityElement
      && objBinding.getExtensibilityElements() != null)
    {
      Iterator it = objBinding.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objBinding, ctx);
        if (!ctx.processBinding())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL fault artifact according to the settings in
   * the traversal context.
   * 
   * @param objFault  a WSDL fault artifact.
   * @param parent    parent of the WSDL fault artifact.
   * @param ctx       the traversal contex.
   */
  private void traverse(
    Fault objFault,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeFaultProcessing();
    ctx.setFault(objFault);
    if (visitFault)
    {
      visitor.visit(objFault, parent, ctx);
      if (!ctx.processFault())
        return;
    }
    if (objFault == null)
      return;
    if (traverseFault2Element)
    {
      traverse(objFault.getDocumentationElement(), objFault, ctx);
      if (!ctx.processFault())
        return;
    }
    if (traverseFault2Message)
      traverse(objFault.getMessage(), objFault, ctx);
  }

  /**
   * The method traverses given WSDL service artifact according to the settings in
   * the traversal context.
   * 
   * @param objService  a WSDL service artifact.
   * @param parent      parent of the WSDL service artifact.
   * @param ctx         the traversal contex.
   */
  private void traverse(
    Service objService,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeServiceProcessing();
    ctx.setService(objService);
    if (visitService)
    {
      visitor.visit(objService, parent, ctx);
      if (!ctx.processService())
        return;
    }
    if (objService == null)
      return;
    if (traverseService2Element)
    {
      traverse(objService.getDocumentationElement(), objService, ctx);
      if (!ctx.processService())
        return;
    }
    if (traverseService2ExtensibilityElement
      && objService.getExtensibilityElements() != null)
    {
      Iterator it = objService.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objService, ctx);
        if (!ctx.processService())
          return;
      }
    }
    if (traverseService2Port && objService.getPorts() != null)
    {
      Iterator it = objService.getPorts().values().iterator();
      while (it.hasNext())
      {
        traverse((Port) it.next(), objService, ctx);
        if (!ctx.processService())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL import artifact according to the settings in
   * the traversal context.
   * 
   * @param objImport  a WSDL import artifact.
   * @param parent     parent of the WSDL import artifact.
   * @param ctx        the traversal contex.
   */
  private void traverse(
    Import objImport,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeImportProcessing();
    ctx.setImport(objImport);
    if (visitImport)
    {
      visitor.visit(objImport, parent, ctx);
      if (!ctx.processImport())
        return;
    }
    if (objImport == null)
      return;
    if (traverseImport2Element)
    {
      traverse(objImport.getDocumentationElement(), objImport, ctx);
      if (!ctx.processImport())
        return;
    }
    if (traverseImport2Definition)
      traverse(objImport.getDefinition(), objImport, ctx);
  }

  /**
   * The method traverses given WSDL binding output artifact according to the 
   * settings in the traversal context.
   * 
   * @param objBindingOutput  a WSDL binding output artifact.
   * @param parent            parent of the WSDL binding output artifact.
   * @param ctx               the traversal contex.
   */
  private void traverse(
    BindingOutput objBindingOutput,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeBindingOutputProcessing();
    ctx.setBindingOutput(objBindingOutput);
    if (visitBindingOutput)
    {
      visitor.visit(objBindingOutput, parent, ctx);
      if (!ctx.processBindingOutput())
        return;
    }
    if (objBindingOutput == null)
      return;
    if (traverseBindingOutput2Element)
    {
      traverse(
        objBindingOutput.getDocumentationElement(),
        objBindingOutput,
        ctx);
      if (!ctx.processBindingOutput())
        return;
    }
    if ((traverseBindingOutput2SOAPBody || traverseBindingOutput2SOAPHeader)
      && objBindingOutput.getExtensibilityElements() != null)
    {
      Iterator it = objBindingOutput.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        Object o = it.next();
        if (traverseBindingOutput2SOAPBody && (o instanceof SOAPBody))
          traverse((SOAPBody) o, objBindingOutput, ctx);
        else if (traverseBindingOutput2SOAPHeader && (o instanceof SOAPHeader))
          traverse((SOAPHeader) o, objBindingOutput, ctx);
        if (!ctx.processBindingOutput())
          return;
      }
    }
    if (traverseBindingOutput2ExtensibilityElement
      && objBindingOutput.getExtensibilityElements() != null)
    {
      Iterator it = objBindingOutput.getExtensibilityElements().iterator();
      while (it.hasNext())
      {
        traverse((ExtensibilityElement) it.next(), objBindingOutput, ctx);
        if (!ctx.processBindingOutput())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL port type artifact according to the settings in
   * the traversal context.
   * 
   * @param objPortType  a WSDL port type artifact.
   * @param parent       parent of the WSDL port type.
   * @param ctx          the traversal contex.
   */
  private void traverse(
    PortType objPortType,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumePortTypeProcessing();
    ctx.setPortType(objPortType);
    if (visitPortType)
    {
      visitor.visit(objPortType, parent, ctx);
      if (!ctx.processPortType())
        return;
    }
    if (objPortType == null)
      return;
    if (traversePortType2Element)
    {
      traverse(objPortType.getDocumentationElement(), objPortType, ctx);
      if (!ctx.processPortType())
        return;
    }
    if (traversePortType2Operation && objPortType.getOperations() != null)
    {
      Iterator it = objPortType.getOperations().iterator();
      while (it.hasNext())
      {
        traverse((Operation) it.next(), objPortType, ctx);
        if (!ctx.processPortType())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL message artifact according to the settings in
   * the traversal context.
   * 
   * @param objMessage  a WSDL message.
   * @param parent      parent of the WSDL message.
   * @param ctx         the traversal contex.
   */
  private void traverse(
    Message objMessage,
    Object parent,
    WSDLTraversalContext ctx)
  {
    ctx.resumeMessageProcessing();
    ctx.setMessage(objMessage);
    if (visitMessage)
    {
      visitor.visit(objMessage, parent, ctx);
      if (!ctx.processMessage())
        return;
    }
    if (objMessage == null)
      return;
    if (traverseMessage2Element)
    {
      traverse(objMessage.getDocumentationElement(), objMessage, ctx);
      if (!ctx.processMessage())
        return;
    }
    if (traverseMessage2Part && objMessage.getParts() != null)
    {
      Iterator it = objMessage.getParts().values().iterator();
      while (it.hasNext())
      {
        traverse((Part) it.next(), objMessage, ctx);
        if (!ctx.processMessage())
          return;
      }
    }
  }

  /**
   * The method traverses given WSDL part artifact according to the settings.
   * @param a  a WSDL part artifact.
   */
  public void traverse(Part a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL service artifact according to the settings.
   * @param a  a WSDL service artifact.
   */
  public void traverse(Service a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL types artifact according to the settings.
   * @param a WSDL types artifact.
   */
  public void traverse(Types a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL operation artifact according to the settings.
   * @param a  a WSDL operation artifact.
   */
  public void traverse(Operation a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL input artifact according to the settings.
   * @param a  a WSDL input artifact.
   */
  public void traverse(Input a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL output artifact according to the settings.
   * @param a  a WSDL output artifact.
   */
  public void traverse(Output a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL fault artifact according to the settings.
   * @param a  a WSDL fault artifact.
   */
  public void traverse(Fault a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL binding artifact according to the settings.
   * @param a  a WSDL binding artifact.
   */
  public void traverse(Binding a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL binding operation artifact according to the 
   * settings.
   * @param a  a WSDL binding operation artifact.
   */
  public void traverse(BindingOperation a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL binding input artifact according to 
   * the settings.
   * @param a  a WSDL binding input artifact.
   */
  public void traverse(BindingInput a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL binding output artifact according to 
   * the settings.
   * @param a  a WSDL binding output artifact.
   */
  public void traverse(BindingOutput a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL binding fault artifact according to 
   * the settings.
   * @param a   a WSDL binding fault artifact.
   */
  public void traverse(BindingFault a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL import artifact according to the settings.
   * @param a  a WSDL import artifact.
   */
  public void traverse(Import a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL element artifact according to the settings.
   * @param a  a WSDL element artifact.
   */
  public void traverse(Element a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL message artifact according to the settings.
   * @param a  a WSDL message artifact.
   */
  public void traverse(Message a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL port artifact according to the settings.
   * @param a  a WSDL port artifact.
   */
  public void traverse(Port a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL port type artifact according to the settings.
   * @param a  a WSDL port type artifact.
   */
  public void traverse(PortType a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL definition artifact according to the settings.
   * @param a  a WSDL definition artifact.
   */
  public void traverse(Definition a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL extensibility elment artifact according 
   * to the settings.
   * @param a  a WSDL extensibility element artifact.
   */
  public void traverse(ExtensibilityElement a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP binding artifact according to 
   * the settings.
   * @param a  a WSDL SOAP binding artifact.
   */
  public void traverse(SOAPBinding a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP body artifact according to the settings.
   * @param a  a WSDL SOAP body artifact.
   */
  public void traverse(SOAPBody a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP header artifact according to the settings.
   * @param a  a WSDL SOAP header artifact.
   */
  public void traverse(SOAPHeader a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP header fault artifact according to 
   * the settings.
   * @param a  a WSDL SOAP header fault artifact.
   */
  public void traverse(SOAPHeaderFault a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP fault artifact according to the settings.
   * @param a  a WSDL SOAP fault artifact.
   */
  public void traverse(SOAPFault a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }
  /**
   * The method traverses given WSDL SOAP operation artifact according to 
   * the settings.
   * @param a  a WSDL SOAP operation artifact.
   */
  public void traverse(SOAPOperation a)
  {
    adjust();
    traverse(a, null, new WSDLTraversalContext(this));
  }

  /**
   * The method traverses given WSDL part artifact according to the settings.
   * @param a       a WSDL part artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Part a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL service artifact according to the settings.
   * @param a       a WSDL service artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Service a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL types artifact according to the settings.
   * @param a       a WSDL types artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Types a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL operation artifact according to the settings.
   * @param a       a WSDL operation artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Operation a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL input artifact according to the settings.
   * @param a       a WSDL input artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Input a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL output artifact according to the settings.
   * @param a       a WSDL output artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Output a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL fault artifact according to the settings.
   * @param a       a WSDL fault artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Fault a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL binding artifact according to the settings.
   * @param a       a WSDL binding artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(Binding a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL binding operation artifact according 
   * to the settings.
   * @param a       a WSDL binding operation artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(BindingOperation a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL binding input artifact according 
   * to the settings.
   * @param a       a WSDL binding input artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(BindingInput a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL binding output artifact according to 
   * the settings.
   * @param a       a WSDL binding output artifact.
   * @param params  a Map object representing settings.  
   */
  public void traverse(BindingOutput a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL binding fault artifact according to 
   * the settings.
   * @param a       a WSDL binding fault artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(BindingFault a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL import artifact according to the settings.
   * @param a       a WSDL import artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(Import a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL element artifact according to the settings.
   * @param a       a WSDL element artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(Element a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL message artifact according to the settings.
   * @param a       a WSDL message.
   * @param params  a Map object representing settings.   
   */
  public void traverse(Message a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL port artifact according to the settings.
   * @param a       a WSDL port.
   * @param params  a Map object representing settings.   
   */
  public void traverse(Port a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL port type artifact according to the settings.
   * @param a       a WSDL port type artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(PortType a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL definition artifact according to the settings.
   * @param a       a WSDL definition artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(Definition a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL extensibility element artifact according to the settings.
   * @param a       a WSDL extensibility element artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(ExtensibilityElement a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL SOAP binding artifact according to the settings.
   * @param a       a WSDL SOAP binding artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(SOAPBinding a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL SOAP body artifact according to the settings.
   * @param a       a WSDL SOAP body artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(SOAPBody a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL SOAP header artifact according to the settings.
   * @param a       a WSDL SOAP header artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(SOAPHeader a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL hearder fault artifact according to the settings.
   * @param a       a WSDL SOAP header fault artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(SOAPHeaderFault a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL SOAP fault artifact according to the settings.
   * @param a       a WSDL SOAP fault artifact.
   * @param params  a Map object representing settings.   
   */
  public void traverse(SOAPFault a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
  /**
   * The method traverses given WSDL SOAP operation artifact according to the settings.
   * @param a       a WSDL SOAP operation artifact.
   * @param params  a Map object representing settings.
   */
  public void traverse(SOAPOperation a, Map params)
  {
    adjust();
    WSDLTraversalContext ctx = new WSDLTraversalContext(this);
    if (params != null)
      ctx.params.putAll(params);
    traverse(a, null, ctx);
  }
}
