/** {@inheritDoc} */
  @Override
  public void createServiceImplementationFromWSDL(
      Role role,
      java.util.List<Role> refRoles,
      ProtocolModel behaviour,
      String wsdlPath,
      String wsdlLocation,
      java.util.List<String> refWsdlPaths,
      String srcFolder,
      ResourceLocator locator)
      throws Exception {
    super.createServiceImplementationFromWSDL(
        role, refRoles, behaviour, wsdlPath, wsdlLocation, refWsdlPaths, srcFolder, locator);

    // Process the service implementation class
    javax.wsdl.Definition defn = getWSDLReader().readWSDL(wsdlPath);

    if (defn != null) {

      // Use the namespace to obtain a Java package
      String pack = JavaGeneratorUtil.getJavaPackage(defn.getTargetNamespace());

      String folder = pack.replace('.', java.io.File.separatorChar);

      @SuppressWarnings("unchecked")
      java.util.Iterator<PortType> portTypes = defn.getPortTypes().values().iterator();

      while (portTypes.hasNext()) {
        PortType portType = portTypes.next();

        java.io.File f =
            new java.io.File(
                srcFolder
                    + java.io.File.separatorChar
                    + folder
                    + java.io.File.separatorChar
                    + portType.getQName().getLocalPart()
                    + "Impl.java");

        if (f.exists()) {

          makeSwitchyardService(f, portType, srcFolder);

          addServiceReferencesToImplementation(f, role, refRoles, refWsdlPaths, srcFolder);

          addServiceBehaviour(f, role, refRoles, behaviour, srcFolder, locator);
        } else {
          logger.severe("Service file '" + f.getAbsolutePath() + "' does not exist");
        }
      }

      removeWebServiceAndClientAnnotations(wsdlPath, srcFolder);

    } else {
      logger.severe("Failed to retrieve WSDL definition '" + wsdlPath + "'");
    }
  }
  public PortType getPortType(Definition wsdlDef) {
    //		if(wsdlDef==null) wsdlDef = getService().getDefinition();

    String ptName = getPortType();
    Map portTypes = wsdlDef.getPortTypes();
    for (Iterator iter = portTypes.values().iterator(); iter.hasNext(); ) {
      PortType pt = (PortType) iter.next();
      if (pt.getQName().getLocalPart().equals(ptName)) {
        return pt;
      }
    }
    return null;
  }
  public void testCompare() throws WSDLException, ComparisonException {

    Comparator<Definition> comparator = new WSDLDeclarationComparator();
    Definition originalWSDL = WSDLTestUtils.getWSDLDefinition();
    Definition changedWSDL = WSDLTestUtils.getWSDLDefinitionWithDetails();

    //        originalWSDL.setExtensionAttribute();

    //        originalWSDL.setTypes();

    //      originalWSDL.addBinding();
    //      originalWSDL.addImport();
    //        originalWSDL.addMessage();
    //        originalWSDL.addBinding();
    //        originalWSDL.addPortType();
    //        originalWSDL.addService();
    //        originalWSDL.addExtensibilityElement();

    originalWSDL.getAllBindings();
    originalWSDL.getAllPortTypes();
    originalWSDL.getAllServices();
    originalWSDL.getDocumentBaseURI();
    originalWSDL.getImports();
    originalWSDL.getMessages();
    originalWSDL.getNamespaces();
    originalWSDL.getPortTypes();
    originalWSDL.getQName();
    originalWSDL.getTargetNamespace();
    originalWSDL.getTypes();
    originalWSDL.getDocumentationElement();
    originalWSDL.getExtensibilityElements();
    // TODO Fix me
    originalWSDL.getExtensionAttributes();

    Comparison defaultComparison = new DefaultComparison();
    comparator.compare(originalWSDL, changedWSDL, defaultComparison);
    System.out.println(defaultComparison);
    assertNotNull(defaultComparison);
  }
  public void createServiceComposite(
      Role role,
      java.util.List<Role> refRoles,
      String wsdlPath,
      java.util.List<String> refWsdlPaths,
      String resourceFolder,
      String srcFolder)
      throws Exception {
    javax.wsdl.Definition defn = getWSDLReader().readWSDL(wsdlPath);

    if (defn != null) {

      java.io.File wsdlFile = new java.io.File(wsdlPath);

      if (!wsdlFile.exists()) {
        java.net.URL url = ClassLoader.getSystemResource(wsdlPath);

        wsdlFile = new java.io.File(url.getFile());

        if (!wsdlFile.exists()) {
          logger.severe("Failed to find WSDL file '" + wsdlPath + "'");
        }
      }

      ResourceLocator locator = new DefaultResourceLocator(wsdlFile.getParentFile());

      StringBuffer composite = new StringBuffer();
      StringBuffer transformers = new StringBuffer();
      StringBuffer component = new StringBuffer();

      String targetNamespace = defn.getTargetNamespace();
      String name = role.getName();

      composite.append("<switchyard xmlns=\"urn:switchyard-config:switchyard:1.0\"\r\n");

      // TODO: May need to add other namespaces here

      composite.append("\t\ttargetNamespace=\"" + targetNamespace + "\"\r\n");
      composite.append("\t\tname=\"" + name + "\">\r\n");

      composite.append(
          "\t<composite xmlns=\"http://docs.oasis-open.org/ns/opencsa/sca/200912\"\r\n");
      composite.append("\t\t\ttargetNamespace=\"");
      composite.append(targetNamespace);
      composite.append("\"\r\n\t\t\tname=\"");
      composite.append(name);
      composite.append("\" >\r\n");

      @SuppressWarnings("unchecked")
      java.util.Iterator<PortType> portTypes = defn.getPortTypes().values().iterator();

      while (portTypes.hasNext()) {
        PortType portType = portTypes.next();

        // Define transformers
        addPortTypeTransformers(portType, true, transformers, defn, locator, srcFolder);

        String wsdlName = wsdlPath;
        int ind = wsdlName.lastIndexOf('/');

        String wsdlLocation = wsdlName;

        if (ind != -1) {
          wsdlLocation = wsdlName.substring(ind + 1);
          wsdlName =
              wsdlName.substring(ind + 1)
                  + "#wsdl.porttype("
                  + portType.getQName().getLocalPart()
                  + ")";
        }

        composite.append(
            "\t\t<service name=\""
                + portType.getQName().getLocalPart()
                + "\" promote=\""
                + portType.getQName().getLocalPart()
                + "Component/"
                + portType.getQName().getLocalPart()
                + "\">\r\n");

        composite.append("\t\t\t<interface.wsdl interface=\"wsdl/" + wsdlName + "\" />\r\n");
        composite.append(
            "\t\t\t<binding.soap xmlns=\"urn:switchyard-component-soap:config:1.0\">\r\n");
        composite.append("\t\t\t\t<wsdl>wsdl/" + wsdlLocation + "</wsdl>\r\n");
        composite.append("\t\t\t\t<socketAddr>:18001</socketAddr>\r\n");
        composite.append("\t\t\t</binding.soap>\r\n");

        composite.append("\t\t</service>\r\n");

        String pack = JavaGeneratorUtil.getJavaPackage(defn.getTargetNamespace());

        component.append(
            "\t\t<component name=\"" + portType.getQName().getLocalPart() + "Component\">\r\n");

        component.append(
            "\t\t\t<implementation.bean xmlns=\"urn:switchyard-component-bean:config:1.0\" "
                + "class=\""
                + pack
                + "."
                + portType.getQName().getLocalPart()
                + "Impl\"/>\r\n");

        component.append(
            "\t\t\t<service name=\"" + portType.getQName().getLocalPart() + "\" >\r\n");
        component.append(
            "\t\t\t\t<interface.java interface=\""
                + pack
                + "."
                + portType.getQName().getLocalPart()
                + "\"/>\r\n");
        component.append("\t\t\t</service>\r\n");

        for (int i = 0; i < refWsdlPaths.size(); i++) {
          String refWsdlPath = refWsdlPaths.get(i);
          javax.wsdl.Definition refDefn = getWSDLReader().readWSDL(refWsdlPath);

          java.io.File refWsdlFile = new java.io.File(refWsdlPath);

          if (!refWsdlFile.exists()) {
            java.net.URL url = ClassLoader.getSystemResource(refWsdlPath);

            refWsdlFile = new java.io.File(url.getFile());

            if (!refWsdlFile.exists()) {
              logger.severe("Failed to find ref WSDL file '" + refWsdlPath + "'");
            }
          }

          ResourceLocator refLocator = new DefaultResourceLocator(refWsdlFile.getParentFile());

          if (refDefn != null) {

            @SuppressWarnings("unchecked")
            java.util.Iterator<PortType> refPortTypes = refDefn.getPortTypes().values().iterator();

            while (refPortTypes.hasNext()) {
              PortType refPortType = refPortTypes.next();

              // Define transformers
              addPortTypeTransformers(
                  refPortType, false, transformers, refDefn, refLocator, srcFolder);

              String refWsdlName = refWsdlPath;

              wsdlLocation = refWsdlName;

              ind = refWsdlName.lastIndexOf('/');
              if (ind != -1) {
                wsdlLocation = refWsdlName.substring(ind + 1);
                refWsdlName =
                    refWsdlName.substring(ind + 1)
                        + "#wsdl.porttype("
                        + refPortType.getQName().getLocalPart()
                        + ")";
              }

              composite.append(
                  "\t\t<reference name=\""
                      + refPortType.getQName().getLocalPart()
                      + "\" promote=\""
                      + portType.getQName().getLocalPart()
                      + "Component/"
                      + refPortType.getQName().getLocalPart()
                      + "\" multiplicity=\"1..1\" >\r\n");

              composite.append(
                  "\t\t\t<interface.wsdl interface=\"wsdl/" + refWsdlName + "\" />\r\n");
              composite.append(
                  "\t\t\t<binding.soap xmlns=\"urn:switchyard-component-soap:config:1.0\">\r\n");
              composite.append("\t\t\t\t<wsdl>wsdl/" + wsdlLocation + "</wsdl>\r\n");
              composite.append("\t\t\t\t<socketAddr>:18001</socketAddr>\r\n");
              composite.append("\t\t\t</binding.soap>\r\n");
              composite.append("\t\t</reference>\r\n");

              String refPack = JavaGeneratorUtil.getJavaPackage(refDefn.getTargetNamespace());

              component.append(
                  "\t\t\t<reference name=\"" + refPortType.getQName().getLocalPart() + "\" >\r\n");
              component.append(
                  "\t\t\t\t<interface.java interface=\""
                      + refPack
                      + "."
                      + refPortType.getQName().getLocalPart()
                      + "\"/>\r\n");
              component.append("\t\t\t</reference>\r\n");
            }
          }
        }

        component.append("\t\t</component>\r\n");

        composite.append(component.toString());
      }

      composite.append("\t</composite>\r\n");

      if (transformers.length() > 0) {
        composite.append("\t<transforms xmlns:xform=\"urn:switchyard-config:transform:1.0\">\r\n");
        composite.append(transformers.toString());
        composite.append("\t</transforms>\r\n");
      }

      composite.append("</switchyard>\r\n");

      java.io.FileOutputStream fos =
          new java.io.FileOutputStream(
              resourceFolder + java.io.File.separatorChar + "switchyard.xml");

      fos.write(composite.toString().getBytes());

      fos.close();
    }
  }
  protected void addServiceReferencesToImplementation(
      java.io.File implFile,
      Role role,
      java.util.List<Role> refRoles,
      java.util.List<String> refWsdlPaths,
      String srcFolder)
      throws Exception {

    // Check that the number of reference roles and wsdl paths are the same
    if (refRoles.size() != refWsdlPaths.size()) {
      throw new IllegalArgumentException(
          "The number of reference roles and wsdl paths are not consistent");
    }

    java.io.FileInputStream fis = new java.io.FileInputStream(implFile);

    byte[] b = new byte[fis.available()];
    fis.read(b);

    StringBuffer text = new StringBuffer();
    text.append(new String(b));

    fis.close();

    int index = text.indexOf("private static final Logger");

    if (index != -1) {

      for (int i = 0; i < refRoles.size(); i++) {
        javax.wsdl.Definition refDefn = getWSDLReader().readWSDL(refWsdlPaths.get(i));

        if (refDefn != null) {

          // Use the namespace to obtain a Java package
          String refPack = JavaGeneratorUtil.getJavaPackage(refDefn.getTargetNamespace());

          @SuppressWarnings("unchecked")
          java.util.Iterator<PortType> refPortTypes = refDefn.getPortTypes().values().iterator();
          int refPortCount = 1;

          while (refPortTypes.hasNext()) {
            PortType refPortType = refPortTypes.next();
            String name = JavaBehaviourGenerator.getVariableName(refRoles.get(i).getName());

            if (refDefn.getPortTypes().size() > 1) {
              name += refPortCount;
            }

            text.insert(
                index,
                "@javax.inject.Inject @org.switchyard.component.bean.Reference\r\n    "
                    + refPack
                    + "."
                    + refPortType.getQName().getLocalPart()
                    + " _"
                    + name
                    + ";\r\n\r\n    ");
          }
        }
      }

      java.io.FileOutputStream fos = new java.io.FileOutputStream(implFile);

      fos.write(text.toString().getBytes());

      fos.close();
    } else {
      logger.severe(
          "Service implementation file '"
              + implFile.getAbsolutePath()
              + "' does not have 'private static final Logger' as location to insert references");
    }
  }