/**
   * Creates new AuthenticationCredential
   *
   * @param peergroup The peergroup context in which this AuthenticationCredential is created.
   * @param method The authentication method which will be requested when the
   *     AuthentiationCredential is provided to the peergroup Membership Service. Authentication
   *     methods are specific to Membership services. Consult the Documentation for the Membership
   *     service you will be authenticating against in order to determine the valid <tt>method</tt>
   *     values. Every Membership service should support a default authentication method which can
   *     be specified as <tt>null</null>.
   * @param indentityInfo Optional additional information which is used by the authentication method
   *     or <tt>null</tt>. This information is passed to the authentication method during the apply
   *     operation of the Membership Service. Consult the documentation for the specific Membership
   *     Service you are using for details on how this information is used (if at all).
   */
  public AuthenticationCredential(PeerGroup peergroup, String method, Element indentityInfo) {
    this.peergroup = peergroup;

    authenticationMethod = method;

    if (null != indentityInfo) {
      this.identityInfo = StructuredDocumentUtils.copyAsDocument(indentityInfo);
    }
  }
  /**
   * Process an individual element from the document.
   *
   * @param elem the element to be processed.
   * @return true if the element was recognized, otherwise false.
   */
  protected boolean handleElement(TextElement elem) {
    if (elem.getName().equals("PeerGroupID")) {
      try {
        URI gID = new URI(elem.getTextValue());
        ID pgid = IDFactory.fromURI(gID);

        if (!pgid.equals(getPeerGroupID())) {
          throw new IllegalArgumentException(
              "Operation is from a different group. " + pgid + " != " + getPeerGroupID());
        }
      } catch (URISyntaxException badID) {
        throw new IllegalArgumentException("Unusable ID in advertisement: " + elem.getTextValue());
      }
      return true;
    }

    if (elem.getName().equals("PeerID")) {
      try {
        URI pID = new URI(elem.getTextValue());
        ID pid = IDFactory.fromURI(pID);

        if (!pid.equals(getPeerID())) {
          throw new IllegalArgumentException(
              "Operation is from a different group. " + pid + " != " + getPeerID());
        }
      } catch (URISyntaxException badID) {
        throw new IllegalArgumentException("Bad Peer ID in advertisement: " + elem.getTextValue());
      } catch (ClassCastException badID) {
        throw new IllegalArgumentException("Id is not a peer id: " + elem.getTextValue());
      }
      return true;
    }

    if (elem.getName().equals("Method")) {
      setMethod(elem.getTextValue());
      return true;
    }

    if (elem.getName().equals("IdentityInfo")) {
      Enumeration firstChild = elem.getChildren();

      if (!firstChild.hasMoreElements()) {
        throw new IllegalArgumentException("Missing identity info");
      }

      identityInfo = StructuredDocumentUtils.copyAsDocument((Element) firstChild.nextElement());

      return true;
    }

    // element was not handled
    return false;
  }
 /**
  * Returns the StructuredDocument Element containing the identity information which was originally
  * provided when this AuthenticationCredential was created.
  *
  * @return StructuredDocument Element containing the identity information which was originally
  *     provided when this AuthenticationCredential was created.
  */
 public Element getIdentityInfo() {
   return (null == identityInfo) ? null : StructuredDocumentUtils.copyAsDocument(identityInfo);
 }