/**
   * Checks if an XDI entity is a valid XDI public link contract.
   *
   * @param xdiEntity The XDI entity to check.
   * @return True if the XDI entity is a valid XDI public link contract.
   */
  public static boolean isValid(XdiEntity xdiEntity) {

    if (!RelationshipLinkContract.isValid(xdiEntity)) return false;

    if (xdiEntity instanceof XdiEntitySingleton) {

      if (RelationshipLinkContract.getAuthorizingAuthority(xdiEntity.getXDIAddress()) == null)
        return false;
      if (RelationshipLinkContract.getRequestingAuthority(xdiEntity.getXDIAddress()) == null)
        return false;
      if (RelationshipLinkContract.getTemplateAuthorityAndId(xdiEntity.getXDIAddress()) != null)
        return false;

      if (!XDILinkContractConstants.XDI_ADD_PUBLIC.equals(
          RelationshipLinkContract.getRequestingAuthority(xdiEntity.getXDIAddress()))) return false;

      return true;
    } else if (xdiEntity instanceof XdiEntityInstance) {

      return false;
    } else {

      return false;
    }
  }
  /**
   * Factory method that finds or creates an XDI public link contract for a graph.
   *
   * @return The XDI public link contract.
   */
  public static PublicLinkContract findPublicLinkContract(Graph graph, boolean create) {

    XDIAddress ownerXDIAddress = GraphUtil.getOwnerXDIAddress(graph);
    if (ownerXDIAddress == null) return null;

    RelationshipLinkContract relationshipLinkContract =
        RelationshipLinkContract.findRelationshipLinkContract(
            graph, ownerXDIAddress, XDILinkContractConstants.XDI_ADD_PUBLIC, null, null, create);
    if (relationshipLinkContract == null) return null;

    return fromXdiEntity(relationshipLinkContract.getXdiEntity());
  }
  public static XDIAddress createPublicLinkContractXDIAddress(XDIAddress ownerXDIAddress) {

    return RelationshipLinkContract.createRelationshipLinkContractXDIAddress(
        ownerXDIAddress, XDILinkContractConstants.XDI_ADD_PUBLIC, null, null);
  }