protected static final String getDefaultAction(JavaMethod method) {
    String tns = method.getOwner().getTargetNamespace();
    String delim = "/";
    // TODO: is this the correct way to find the separator ?
    try {
      URI uri = new URI(tns);
      if (uri.getScheme().equalsIgnoreCase("urn")) delim = ":";
    } catch (URISyntaxException e) {
      LOGGER.warning("TargetNamespace of WebService is not a valid URI");
    }
    if (tns.endsWith(delim)) tns = tns.substring(0, tns.length() - 1);
    // this assumes that fromjava case there won't be input name.
    // if there is input name in future, then here name=inputName
    // else use operation name as follows.
    String name =
        (method.getMEP().isOneWay())
            ? method.getOperationName()
            : method.getOperationName() + "Request";

    return new StringBuilder(tns)
        .append(delim)
        .append(method.getOwner().getPortTypeName().getLocalPart())
        .append(delim)
        .append(name)
        .toString();
  }
  @Override
  public void addOperationInputExtension(TypedXmlWriter input, JavaMethod method) {
    if (!enabled) return;

    Action a = method.getSEIMethod().getAnnotation(Action.class);
    if (a != null && !a.input().equals("")) {
      addAttribute(input, a.input());
    } else {
      if (method.getBinding().getSOAPAction().equals("")) {
        // hack: generate default action for interop with .Net3.0 when soapAction is non-empty
        String defaultAction = getDefaultAction(method);
        addAttribute(input, defaultAction);
      }
    }
  }
  @Override
  public void addOperationOutputExtension(TypedXmlWriter output, JavaMethod method) {
    if (!enabled) return;

    Action a = method.getSEIMethod().getAnnotation(Action.class);
    if (a != null && !a.output().equals("")) {
      addAttribute(output, a.output());
    }
  }
  @Override
  public void addOperationFaultExtension(
      TypedXmlWriter fault, JavaMethod method, CheckedException ce) {
    if (!enabled) return;

    Action a = method.getSEIMethod().getAnnotation(Action.class);
    Class[] exs = method.getSEIMethod().getExceptionTypes();

    if (exs == null) return;

    if (a != null && a.fault() != null) {
      for (FaultAction fa : a.fault()) {
        if (fa.className().getName().equals(ce.getExceptionClass().getName())) {
          if (fa.value().equals("")) return;

          addAttribute(fault, fa.value());
          return;
        }
      }
    }
  }