|
JavaXT
|
|
PhysicalAddress Class
package javaxt.exchange;
//******************************************************************************
//** Address Class
//******************************************************************************
/**
* Used to represent a physical address for a given contact.
*
******************************************************************************/
public class PhysicalAddress {
/*
public static final String HOME_ADDRESS = "Home";
public static final String BUSINESS_ADDRESS = "Business";
public static final String OTHER_ADDRESS = "Other";
*/
private String type;
private java.util.ArrayList<String> street = new java.util.ArrayList<String>();
private String city;
private String state;
private String country;
private String postalCode;
//**************************************************************************
//** Constructor
//**************************************************************************
/** Creates a new instance of Address.
*/
public PhysicalAddress(String type){
setType(type);
}
public PhysicalAddress(){
this("Home");
}
//**************************************************************************
//** Constructor
//**************************************************************************
/** Creates a new instance of Address using a node from a
* FindItemResponseMessage.
*/
protected PhysicalAddress(org.w3c.dom.Node addressNode) {
type = javaxt.xml.DOM.getAttributeValue(addressNode, "Key");
org.w3c.dom.NodeList childNodes = addressNode.getChildNodes();
for (int j=0; j<childNodes.getLength(); j++){
org.w3c.dom.Node childNode = childNodes.item(j);
if (childNode.getNodeType()==1){
String childNodeName = childNode.getNodeName();
if (childNodeName.contains(":")) childNodeName = childNodeName.substring(childNodeName.indexOf(":")+1);
String value = javaxt.xml.DOM.getNodeValue(childNode).trim();
if (value.length()>0){
if (childNodeName.equalsIgnoreCase("Street")){
setStreet(value);
}
else if (childNodeName.equalsIgnoreCase("City")){
setCity(value);
}
else if (childNodeName.equalsIgnoreCase("State")){
setState(value);
}
else if (childNodeName.equalsIgnoreCase("CountryOrRegion")){
setCountry(value);
}
else if (childNodeName.equalsIgnoreCase("PostalCode")){
setPostalCode(value);
}
}
}
}
}
//**************************************************************************
//** setType
//**************************************************************************
/** Used to set the type or category of address. Note that this field is
* required.
* @param type Options include "Home", "Business", and "Other". Accepts
* minor varients including "Home Address", "Work", etc.
*/
public void setType(String type) {
if (type==null) type = "";
type = type.toUpperCase();
if (type.contains("HOME") || type.contains("PERSONAL")) type = "Home";
else if(type.contains("BUSINESS") || type.contains("COMPANY") ||
type.contains("WORK")) type = "Business";
else type = "Other";
this.type = type;
}
//**************************************************************************
//** getType
//**************************************************************************
/** Returns the type or category of address. Options include "Home",
* "Business", and "Other".
*/
public String getType(){
return type;
}
//**************************************************************************
//** getStreet
//**************************************************************************
/** Returns the street address as an array.
*/
public String[] getStreets(){
if (street.size()==0) return null;
else return street.toArray(new String[street.size()]);
}
//**************************************************************************
//** addStreet
//**************************************************************************
/** Used to add a street address.
*/
public void addStreet(String street){
if (street==null) return;
for (String s : street.trim().split("\n")){
s = s.trim();
if (s.length()>0) this.street.add(s);
}
}
//**************************************************************************
//** setStreet
//**************************************************************************
/** Used to set the street address. Multiple lines can be specified using a
* "\n" or "\r\n" delimitor.
*/
public void setStreet(String street){
this.street.clear();
this.addStreet(street);
}
protected String getValue(String val){
if (val!=null){
val = val.trim();
if (val.length()==0) val = null;
}
return val;
}
public String getCity(){
city = getValue(city);
return city;
}
public void setCity(String city){
this.city = getValue(city);
}
public String getState(){
state = getValue(state);
return state;
}
public void setState(String state){
this.state = getValue(state);
}
public String getCountry(){
country = getValue(country);
return country;
}
public void setCountry(String country){
this.country = getValue(country);
}
public String getPostalCode(){
postalCode = getValue(postalCode);
return postalCode;
}
public void setPostalCode(String postalCode){
this.postalCode = getValue(postalCode);
}
//**************************************************************************
//** toXML
//**************************************************************************
/** Returns an xml fragment used to save or update an address 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.
*
* @param insert Boolean used to specify whether to return an xml
* formatted for inserts or updates. If true, the xml will be formatted for
* inserts. If false, xml will be formatted for updates.
*/
protected String toXML(String namespace, boolean insert){
//Update namespace prefix
if (namespace!=null){
if (!namespace.endsWith(":")) namespace+=":";
}
else{
namespace = "";
}
StringBuffer str = new StringBuffer();
if (insert){
str.append("<" + namespace + "Entry Key=\"" + type + "\">");
String street = getStreetXML();
if (street!=null) str.append("<" + namespace + "Street>" + street + "</" + namespace + "Street>");
if (city!=null) str.append("<" + namespace + "City>" + city + "</" + namespace + "City>");
if (state!=null) str.append("<" + namespace + "State>" + state + "</" + namespace + "State>");
if (country!=null) str.append("<" + namespace + "Country>" + country + "</" + namespace + "Country>");
if (postalCode!=null) str.append("<" + namespace + "PostalCode>" + postalCode + "</" + namespace + "PostalCode>");
str.append("</" + namespace + "Entry>");
}
else{
String streets = getStreetXML();
if (streets!=null) str.append(getUpdateXML("Street", streets, namespace));
else str.append(getDeleteXML("Street", namespace));
if (city!=null) str.append(getUpdateXML("City", city, namespace));
else str.append(getDeleteXML("City", namespace));
if (state!=null) str.append(getUpdateXML("State", state, namespace));
else str.append(getDeleteXML("State", namespace));
if (country!=null) str.append(getUpdateXML("CountryOrRegion", country, namespace));
else str.append(getDeleteXML("CountryOrRegion", namespace));
if (postalCode!=null) str.append(getUpdateXML("PostalCode", postalCode, namespace));
else str.append(getDeleteXML("PostalCode", namespace));
}
return str.toString().trim();
}
private String getUpdateXML(String key, String value, String namespace){
StringBuffer str = new StringBuffer();
str.append("<" + namespace + "SetItemField>");
str.append("<" + namespace + "IndexedFieldURI FieldURI=\"contacts:PhysicalAddress:" + key + "\" FieldIndex=\"" + type + "\"/>");
str.append("<" + namespace + "Contact>");
str.append("<" + namespace + "PhysicalAddresses>");
str.append("<" + namespace + "Entry Key=\"" + type + "\">");
str.append("<" + namespace + key + ">" + value + "</" + namespace + key + ">");
str.append("</" + namespace + "Entry>");
str.append("</" + namespace + "PhysicalAddresses>");
str.append("</" + namespace + "Contact>");
str.append("</" + namespace + "SetItemField>");
return str.toString();
}
private String getDeleteXML(String key, String namespace){
StringBuffer str = new StringBuffer();
str.append("<" + namespace + "DeleteItemField>");
str.append("<" + namespace + "IndexedFieldURI FieldURI=\"contacts:PhysicalAddress:" + key + "\" FieldIndex=\"" + type + "\"/>");
str.append("</" + namespace + "DeleteItemField>");
return str.toString();
}
//**************************************************************************
//** getStreets
//**************************************************************************
/** Returns a properly formatted street address for an XML/SOAP message. */
private String getStreetXML(){
String streets = "";
java.util.Iterator<String> it = street.iterator();
while (it.hasNext()){
String street = it.next();
if (street!=null) street = street.trim();
if (street!=null && street.length()>0){
streets += street + "\r\n";
}
}
streets = streets.trim();
if (streets.length()>0){
//Here's how to preserve line breaks:
//http://blogs.msdn.com/b/pcreehan/archive/2009/07/22/line-breaks-in-managed-web-service-proxy-classes.aspx
streets = streets.replace("\r", "
");
streets = streets.replace("\n", "
");
return streets;
}
else{
return null;
}
}
//**************************************************************************
//** toString
//**************************************************************************
/** Returns a human readable representation of this address. */
public String toString(){
StringBuffer str = new StringBuffer();
if (!isEmpty()){
java.util.Iterator<String> it = street.iterator();
while (it.hasNext()){
String street = it.next();
if (street!=null) street = street.trim();
if (street!=null && street.length()>0){
str.append(street + "\r\n");
}
}
if (city!=null) str.append(city);
if (state!=null) str.append(", " + state);
if (postalCode!=null) str.append(" " + postalCode);
}
return str.toString().trim();
}
//**************************************************************************
//** isEmpty
//**************************************************************************
/** Used to determine whether the address is empty. Returns true if all the
* address attributes are null.
*/
public boolean isEmpty(){
return !(getCity()!=null || getState()!=null ||
getPostalCode()!=null || getStreets()!=null);
}
//**************************************************************************
//** equals
//**************************************************************************
/** Used to compare addresses. Performs a simple case insensitive string
* comparison.
*/
public boolean equals(Object obj){
if (obj!=null){
//Normalize the addresses
String str1 = normalizeAddress(obj);
String str2 = normalizeAddress(this);
/*
System.out.println("str1: |" + str1 + "|");
System.out.println("str2: |" + str2 + "|");
if (!str1.equalsIgnoreCase(str2) && str1.length()>0 && str2.length()>0){
for (int i=0; i<str1.length(); i++){
System.out.print(str1.charAt(i) + " - " + str2.charAt(i));
if (str1.charAt(i) != str2.charAt(i)) System.out.print(" <---");
System.out.print("\r\n");
}
}
*/
return str1.equalsIgnoreCase(str2);
}
else return false;
}
private String normalizeAddress(Object obj){
String str1 = obj.toString().replace("\r", "").replace("\n", " ").replace(",", " ");
while (str1.contains(" ")) str1 = str1.replace(" ", " ");
return str1.trim();
}
public int hashCode(){
return normalizeAddress(this).toLowerCase().hashCode();
}
}
|
|