Mailbox Class

package javaxt.exchange;

//******************************************************************************
//**  Mailbox Class
//******************************************************************************
/**
 *   Used to represent a Mailbox element which is used to identify a mail-
 *   enabled Active Directory object.
 *   http://msdn.microsoft.com/en-us/library/aa565036%28v=EXCHG.140%29.aspx
 *
 ******************************************************************************/

public class Mailbox {

    private String Name;
    private EmailAddress EmailAddress;
    private String RoutingType;
    private String MailboxType;
    private String ItemId;
    private String domainAddress;

  //**************************************************************************
  //** Constructor
  //**************************************************************************
  /** Creates a new instance of Mailbox. */

    protected Mailbox(org.w3c.dom.Node mailboxNode) throws ExchangeException {
        org.w3c.dom.NodeList mailboxItems = mailboxNode.getChildNodes();
        ExchangeException ex = null;
        
        for (int i=0; i<mailboxItems.getLength(); i++){
            org.w3c.dom.Node node = mailboxItems.item(i);
            if (node.getNodeType()==1){
                String nodeName = node.getNodeName();
                if (nodeName.contains(":")) nodeName =
                        nodeName.substring(nodeName.indexOf(":")+1);

                if (nodeName.equalsIgnoreCase("Name")){
                    Name = javaxt.xml.DOM.getNodeValue(node);
                }
                else if(nodeName.equalsIgnoreCase("EmailAddress")){
                    try{
                        EmailAddress = new EmailAddress(javaxt.xml.DOM.getNodeValue(node));
                    }
                    catch(ExchangeException e){
                        String err = e.getMessage();
                        if (err.startsWith("Invalid Email Address:")){
                            ex = e;
                        }
                        else{
                            throw e;
                        }
                    }    
                }
                else if(nodeName.equalsIgnoreCase("RoutingType")){
                    RoutingType = javaxt.xml.DOM.getNodeValue(node);
                }
                else if(nodeName.equalsIgnoreCase("MailboxType")){
                    MailboxType = javaxt.xml.DOM.getNodeValue(node);
                }
                else if(nodeName.equalsIgnoreCase("ItemId")){
                    ItemId = javaxt.xml.DOM.getNodeValue(node);
                }
            }
        }
        

      //Try extracting email address from other fields (e.g. Name)
        if (EmailAddress==null){
            
            /*
            if (Name.contains("@")){
                String str = Name.trim();


              //This logic is a little hacky. I found email addresses embedded in names
                int idx = str.indexOf("(");
                if (idx>-1 && str.endsWith(")")){
                    String _email = str.substring(idx+1, str.length()-1).trim();
                    System.out.println(_email);
                    EmailAddress = new EmailAddress(_email);
                    Name = str.substring(0, idx);
                    System.out.println(Name);
                }
            }
            else{
                throw ex;
            }
            */
        }
    }

    public Mailbox(String name, EmailAddress email) {
        this.Name = name;
        this.EmailAddress = email;
    }

    public Mailbox(String name, String email) throws ExchangeException {
        this(name,  new EmailAddress(email));
    }

    public Mailbox(Contact contact){
        this.Name = contact.getFullName();
        this.EmailAddress = contact.getPrimaryEmailAddress();
    }


  //**************************************************************************
  //** getEmailAddress
  //**************************************************************************
  /** Returns the EmailAddress associated with this Mailbox, or null if the
   *  EmailAddress is undefined.
   */
    public EmailAddress getEmailAddress(){
        return EmailAddress;
    }


  //**************************************************************************
  //** setEmailAddress
  //**************************************************************************
  /** Used to set/update the EmailAddress associated with this Mailbox.
   */
    public void setEmailAddress(EmailAddress emailAddress){
        this.EmailAddress = emailAddress;
    }


  //**************************************************************************
  //** setEmailAddress
  //**************************************************************************
  /** Used to set/update the EmailAddress associated with this Mailbox.
   */
    public void setEmailAddress(String emailAddress) throws ExchangeException {
        setEmailAddress(new EmailAddress(emailAddress));
    }


  //**************************************************************************
  //** setDomainAddress
  //**************************************************************************
    protected void setDomainAddress(String domainAddress){
        this.domainAddress = domainAddress;
    }


  //**************************************************************************
  //** getDomainAddress
  //**************************************************************************
  /** Returns a string used to represent an email address of another Exchange
   *  account within your domain (e.g. "/o=org/ou=orgunit/cn=Recipients/cn=name").
   *  The domain address can be resolved to an email address using the
   *  resolveName() method.
   */
    public String getDomainAddress(){
        return domainAddress;
    }


  //**************************************************************************
  //** getName
  //**************************************************************************
  /** Returns the display name associated with this Mailbox (e.g. "John Smith").
   */
    public String getName(){
        return Name;
    }


  //**************************************************************************
  //** getID
  //**************************************************************************
    public String getID(){
        return ItemId;
    }


  //**************************************************************************
  //** toXML
  //**************************************************************************
  /** Returns an xml fragment used to save or update a mail item via Exchange
   *  Web Services (EWS):<br/>
   *  http://msdn.microsoft.com/en-us/library/aa563318%28v=exchg.140%29.aspx
   *
   *  @param namespace The namespace assigned to the "type". Typically this is
   *  "t" which corresponds to
   *  "http://schemas.microsoft.com/exchange/services/2006/types".
   *  Use a null value is you do not wish to append a namespace.
   */
    protected String toXML(String namespace){

      //Update namespace prefix
        if (namespace!=null){
            if (!namespace.endsWith(":")) namespace+=":";
        }
        else{
            namespace = "";
        }

        StringBuffer str = new StringBuffer();

        str.append("<" + namespace + "Mailbox>");
        if (Name!=null) str.append("<" + namespace + "Name>" + Name + "</" + namespace + "Name>");
        if (EmailAddress!=null)  str.append("<" + namespace + "EmailAddress>" + EmailAddress + "</" + namespace + "EmailAddress>");
        if (RoutingType!=null)  str.append("<" + namespace + "RoutingType>" + RoutingType + "</" + namespace + "RoutingType>");
        if (MailboxType!=null)  str.append("<" + namespace + "MailboxType>" + MailboxType + "</" + namespace + "MailboxType>");
        if (ItemId!=null)  str.append("<" + namespace + "ItemId>" + ItemId + "</" + namespace + "ItemId>");
        str.append("</" + namespace + "Mailbox>");

        return str.toString().trim();
    }


  //**************************************************************************
  //** toString
  //**************************************************************************
  /** Returns a string representation of this Mailbox (e.g.
   *  "John Smith <jsmith@acme.com>").
   */
    public String toString(){
        if (Name!=null && EmailAddress!=null) return Name + " <" + EmailAddress + ">";
        if (EmailAddress!=null) return EmailAddress.toString();
        if (Name!=null) return Name;        
        return ItemId; //?
    }


  //**************************************************************************
  //** equals
  //**************************************************************************
  /** Used to compare this Mailbox to another. Returns true if the hashcodes
   *  match.
   */
    public boolean equals(Object obj){
        if (obj!=null){
            if (obj instanceof Mailbox){
                return ((Mailbox) obj).hashCode()==this.hashCode();
            }
        }
        return false;
    }


  //**************************************************************************
  //** hashCode
  //**************************************************************************
  /** Returns the hashcode associated with the EmailAddress. If the
   *  EmailAddress is undefined, returns the hashcode of the domain address.
   *  If both the EmailAddress and domain address are undefined, returns 0.
   */
    public int hashCode(){
        return (EmailAddress!=null) ? EmailAddress.hashCode() : 
            (domainAddress!=null? domainAddress.hashCode() : 0);
    }


  //**************************************************************************
  //** resolveName
  //**************************************************************************
  /** Attempts to resolve a user name, email address, or a domain address to a
   *  Mailbox.
   */
    public static Mailbox resolveName(String name, Connection conn) throws ExchangeException {
        StringBuffer str = new StringBuffer();

        str.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        str.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" "
            + "xmlns:t=\"http://schemas.microsoft.com/exchange/services/2006/types\" "
            + "xmlns:m=\"http://schemas.microsoft.com/exchange/services/2006/messages\">");
        str.append("<soap:Body>");
        str.append("<m:ResolveNames ReturnFullContactData=\"false\" >");
        str.append("<m:UnresolvedEntry>");
        str.append(name);
        str.append("</m:UnresolvedEntry>");
        str.append("</m:ResolveNames>");
        str.append("</soap:Body>");
        str.append("</soap:Envelope>");

        org.w3c.dom.Document xml = conn.execute(str.toString());
        org.w3c.dom.Node[] items = javaxt.xml.DOM.getElementsByTagName("Resolution", xml);
        if (items.length>0){
            org.w3c.dom.NodeList nodes = items[0].getChildNodes();
            for (int i=0; i<nodes.getLength(); i++){
                org.w3c.dom.Node node = nodes.item(i);
                if (node.getNodeType()==1){
                    String nodeName = node.getNodeName();
                    if (nodeName.contains(":")) nodeName = nodeName.substring(nodeName.indexOf(":")+1);
                    if (nodeName.equalsIgnoreCase("Mailbox")){
                        return new Mailbox(node);
                    }
                    else if(nodeName.equalsIgnoreCase("Contact")){
                        //Contact contact = new Contact(node);
                    }
                }
            }

        }

      //If we're still here, throw an Exception
        throw new ExchangeException("No results were found.");
    }
}