Java tutorial
package com.osafe.services; import java.io.IOException; import java.io.StringReader; import java.net.URLEncoder; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javolution.util.FastList; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.methods.GetMethod; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilIO; import org.ofbiz.base.util.UtilValidate; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import com.osafe.util.Util; import com.osafe.services.AddressVerificationResponse; import com.osafe.services.AddressDocument; import com.melissadata.mdAddr; public class MelissaDataHelper { public static final String module = MelissaDataHelper.class.getName(); protected String productStoreId = null; protected String verificationMode = null; protected String webRegistrationId = null; protected String webUrl = null; protected String dataLicence = null; protected String dataFilepathUS = null; protected String dataFilepathCAN = null; /** don't allow empty constructor */ private MelissaDataHelper() { } private MelissaDataHelper(String productStoreId) { setProductStoreId(productStoreId); setVerificationMode(Util.getProductStoreParm(getProductStoreId(), "MELISSA_VERIFICATION_MODE")); setWebRegistrationId(Util.getProductStoreParm(getProductStoreId(), "MELISSA_REGISTRATION_ID")); setWebUrl(Util.getProductStoreParm(getProductStoreId(), "MELISSA_HTTP_URL")); setDataLicence(Util.getProductStoreParm(getProductStoreId(), "MELISSA_LICENSE")); setDataFilepathUS(Util.getProductStoreParm(getProductStoreId(), "MELISSA_FILE_PATH_US")); setDataFilepathCAN(Util.getProductStoreParm(getProductStoreId(), "MELISSA_FILE_PATH_CAN")); } public static MelissaDataHelper getInstance(String productstoreid) { if (UtilValidate.isEmpty(productstoreid)) { return null; } else { return new MelissaDataHelper(productstoreid); } } public void setProductStoreId(String productStoreId) { this.productStoreId = productStoreId; } public String getProductStoreId() { return productStoreId; } public void setVerificationMode(String verificationMode) { this.verificationMode = verificationMode; } public String getVerificationMode() { return verificationMode; } public void setWebRegistrationId(String webRegistrationId) { this.webRegistrationId = webRegistrationId; } public String getWebRegistrationId() { return webRegistrationId; } public void setWebUrl(String webUrl) { this.webUrl = webUrl; } public String getWebUrl() { return webUrl; } public void setDataLicence(String dataLicence) { this.dataLicence = dataLicence; } public String getDataLicence() { return dataLicence; } public void setDataFilepathUS(String dataFilepathUS) { this.dataFilepathUS = dataFilepathUS; } public String getDataFilepathUS() { return dataFilepathUS; } public void setDataFilepathCAN(String dataFilepathCAN) { this.dataFilepathCAN = dataFilepathCAN; } public String getDataFilepathCAN() { return dataFilepathCAN; } public mdAddr getAddressObject() { mdAddr ao = new mdAddr(); ao.SetLicenseString(getDataLicence()); ao.SetPathToUSFiles(getDataFilepathUS()); if (UtilValidate.isNotEmpty(getDataFilepathCAN())) { ao.SetPathToCanadaFiles(getDataFilepathCAN()); } //Initialize Data Files mdAddr.ProgramStatus result = ao.InitializeDataFiles(); if (result != mdAddr.ProgramStatus.ErrorNone) { //Problem during initialization return null; } return ao; } public AddressVerificationResponse verifyAddress(AddressDocument queryAddressdata) { AddressVerificationResponse avResponse = new AddressVerificationResponse(); String verificationMode = getVerificationMode(); if (UtilValidate.isNotEmpty(verificationMode) && verificationMode.equalsIgnoreCase("HTTP")) { try { String responseString = getHttpResponseAsString(getHttpClient(), getHttpGet(createMelissaRestRequest(queryAddressdata))); if (UtilValidate.isNotEmpty(responseString)) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(responseString)); Document xmlDocument = db.parse(is); avResponse = buildVerificationResponse(xmlDocument); } else { avResponse.setResponseCode(AddressVerificationResponse.GE); } } catch (Exception e) { Debug.logError(e, "Error occured in Melissa Rest Call", module); avResponse.setResponseCode(AddressVerificationResponse.GE); } } else if (UtilValidate.isNotEmpty(verificationMode) && verificationMode.equalsIgnoreCase("FILEPATH")) { try { mdAddr ao = getAddressObject(); if (ao == null) { avResponse.setResponseCode(AddressVerificationResponse.GE); } else { ao = setMelissaFileRequest(ao, queryAddressdata); ao.VerifyAddress(); avResponse = buildVerificationResponse(ao); ao.delete(); } } catch (Exception e) { Debug.logError(e, "Error occured in Melissa file Call", module); avResponse.setResponseCode(AddressVerificationResponse.GE); } } avResponse.setQueryAddressdata(queryAddressdata); return avResponse; } private mdAddr setMelissaFileRequest(mdAddr ao, AddressDocument queryAddressdata) { String a2 = queryAddressdata.getAddress2(); if (UtilValidate.isNotEmpty(queryAddressdata.getAddress3())) { a2 = a2 + " " + queryAddressdata.getAddress3(); } if (UtilValidate.isNotEmpty(queryAddressdata.getAddress1())) ao.SetAddress(queryAddressdata.getAddress1()); if (UtilValidate.isNotEmpty(a2)) ao.SetAddress2(a2); if (UtilValidate.isNotEmpty(queryAddressdata.getCity())) ao.SetCity(queryAddressdata.getCity()); if (UtilValidate.isNotEmpty(queryAddressdata.getStateProvinceGeoId())) ao.SetState(queryAddressdata.getStateProvinceGeoId()); if (UtilValidate.isNotEmpty(queryAddressdata.getPostalCode())) ao.SetZip(queryAddressdata.getPostalCode()); if (UtilValidate.isNotEmpty(queryAddressdata.getPostalCodeExt())) ao.SetPlus4(queryAddressdata.getPostalCodeExt()); if (UtilValidate.isNotEmpty(queryAddressdata.getCountryGeoId())) ao.SetCountryCode(queryAddressdata.getCountryGeoId()); return ao; } private static AddressVerificationResponse buildVerificationResponse(mdAddr ao) { AddressVerificationResponse avResponse = new AddressVerificationResponse(); //check result success, changed or error String results = ao.GetResults(); setResponseCode(avResponse, results); if (UtilValidate.isEmpty(avResponse.getResponseCode())) { avResponse.setResponseCode(AddressVerificationResponse.AS); } List<AddressDocument> responseAddresseList = FastList.newInstance(); AddressDocument responseAddress = new AddressDocument(); responseAddress.setAddress1(ao.GetAddress()); responseAddress.setAddress2(ao.GetAddress2()); responseAddress.setCity(ao.GetCity()); responseAddress.setStateProvinceGeoId(ao.GetState()); responseAddress.setPostalCode(ao.GetZip()); responseAddress.setPostalCodeExt(ao.GetPlus4()); responseAddress.setCountryGeoId(ao.GetCountryCode()); responseAddresseList.add(responseAddress); avResponse.setAlternateAddresses(responseAddresseList); return avResponse; } private String createMelissaRestRequest(AddressDocument queryAddressdata) { String a2 = queryAddressdata.getAddress2(); if (UtilValidate.isNotEmpty(queryAddressdata.getAddress3())) { a2 = a2 + " " + queryAddressdata.getAddress3(); } //Build the rest request here String restRequestString = getWebUrl() + "?" + "t=" + makeEncoded("DQWS XML Sample Code implementation using Multiple record inputs.") + "&" + "id=" + makeEncoded(getWebRegistrationId()) + "&" + "opt=" + "true" + "&" + "comp=" + "" + "&" + "u=" + "" + "&" + "a1=" + makeEncoded(queryAddressdata.getAddress1()) + "&" + "a2=" + makeEncoded(a2) + "&" + "ste=" + "" + "&" + "city=" + makeEncoded(queryAddressdata.getCity()) + "&" + "state=" + makeEncoded(queryAddressdata.getStateProvinceGeoId()) + "&" + "zip=" + makeEncoded(queryAddressdata.getPostalCode()) + "&" + "p4=" + makeEncoded(queryAddressdata.getPostalCodeExt()) + "&" + "ctry=" + makeEncoded(queryAddressdata.getCountryGeoId()) + "&" + "last=" + ""; return restRequestString; } private String makeEncoded(String value) { String encodedValue = value; try { encodedValue = URLEncoder.encode(encodedValue, "UTF-8"); } catch (Exception e) { } return encodedValue; } private static HttpClient getHttpClient() { HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); return httpClient; } private static GetMethod getHttpGet(String uri) { GetMethod getMethod = new GetMethod(uri); return getMethod; } private static String getHttpResponseAsString(HttpClient httpClient, GetMethod getMethod) throws IOException, HttpException { String resultString = ""; httpClient.executeMethod(getMethod); if (getMethod.getStatusCode() == HttpStatus.SC_OK) { resultString = UtilIO.readString(getMethod.getResponseBodyAsStream(), getMethod.getResponseCharSet()); } getMethod.releaseConnection(); return resultString; } private static AddressVerificationResponse buildVerificationResponse(Document doc) { AddressVerificationResponse avResponse = new AddressVerificationResponse(); NodeList nodeList = doc.getElementsByTagName("Results").item(0).getChildNodes(); Node nValue = (Node) nodeList.item(0); if (nValue.getNodeValue().equals(" ")) { List<AddressDocument> responseAddresseList = FastList.newInstance(); NodeList recordList = doc.getElementsByTagName("Record"); for (int temp = 0; temp < recordList.getLength(); temp++) { AddressDocument responseAddresse = new AddressDocument(); Node nNode = recordList.item(temp); Element eElement = (Element) nNode; //check result success, changed or error nodeList = eElement.getElementsByTagName("Results").item(0).getChildNodes(); String results = nodeList.item(0).getNodeValue(); setResponseCode(avResponse, results); if (UtilValidate.isEmpty(avResponse.getResponseCode())) { avResponse.setResponseCode(AddressVerificationResponse.AS); } //get address1 nodeList = eElement.getElementsByTagName("Address1").item(0).getChildNodes(); responseAddresse.setAddress1(nodeList.item(0).getNodeValue()); //get address2 nodeList = eElement.getElementsByTagName("Address2").item(0).getChildNodes(); responseAddresse.setAddress2(nodeList.item(0).getNodeValue()); //get City nodeList = eElement.getElementsByTagName("City").item(0).getChildNodes(); responseAddresse.setCity(nodeList.item(0).getChildNodes().item(0).getNodeValue()); //get State nodeList = eElement.getElementsByTagName("State").item(0).getChildNodes(); responseAddresse.setStateProvinceGeoId(nodeList.item(1).getChildNodes().item(0).getNodeValue()); //get Country nodeList = eElement.getElementsByTagName("Country").item(0).getChildNodes(); responseAddresse.setCountryGeoId(nodeList.item(0).getChildNodes().item(0).getNodeValue()); //get Zip nodeList = eElement.getElementsByTagName("Zip").item(0).getChildNodes(); responseAddresse.setPostalCode(nodeList.item(0).getNodeValue()); //get Plus4 nodeList = eElement.getElementsByTagName("Plus4").item(0).getChildNodes(); responseAddresse.setPostalCodeExt(nodeList.item(0).getNodeValue()); responseAddresseList.add(responseAddresse); } avResponse.setAlternateAddresses(responseAddresseList); } else { avResponse.setResponseCode(AddressVerificationResponse.GE); } return avResponse; } private static void setResponseCode(AddressVerificationResponse avResponse, String resultCodes) { String[] values = resultCodes.split(","); //Do necessary work with the values for (String str : values) { // Results Codes if (str.equals("AS01")) { //Address Matched to Postal Database } else if (str.equals("AS02")) { //The default building address was verified but the suite or apartment number is missing or invalid. } else if (str.equals("AS09")) { //Foreign Postal Code Detected } else if (str.equals("AS03")) { //This address is not deliverable by USPS, but it exists. } else if (str.equals("AS10")) { //Address Matched to CMRA } else if (str.equals("AS12")) { //Address Verified at the DPV Level } else if (str.equals("AS13")) { //Address Updated by LACS } else if (str.equals("AS14")) { //Address Updated by Suite Link } else if (str.equals("AS15")) { //Address Updated by AddressPlus } else if (str.equals("AS16")) { //Address is vacant } else if (str.equals("AS17")) { //Alternate delivery } else if (str.equals("AS18")) { //Artificially created address detected,DPV processing terminated at this point } else if (str.equals("AS20")) { //Address Deliverable by USPS only } else if (str.equals("AS23")) { //Extraneous information found } //Change Codes else if (str.equals("AC01")) { //ZIP Code Change avResponse.setResponseCode(AddressVerificationResponse.AC); } else if (str.equals("AC02")) { //State Change avResponse.setResponseCode(AddressVerificationResponse.AC); } else if (str.equals("AC03")) { //City Change avResponse.setResponseCode(AddressVerificationResponse.AC); } else if (str.equals("AC04")) { //Base/Alternate Changed } else if (str.equals("AC05")) { //Alias Name Change } else if (str.equals("AC06")) { //Address1/Address2 Swap avResponse.setResponseCode(AddressVerificationResponse.AC); } else if (str.equals("AC07")) { //Address1/Company Swap } else if (str.equals("AC08")) { //Plus4 Change } else if (str.equals("AC09")) { //Urbanization Change } else if (str.equals("AC10")) { //Street Name Change } else if (str.equals("AC11")) { //Street Suffix Change } else if (str.equals("AC12")) { //Street Directional Change } else if (str.equals("AC13")) { //Suite Name Change } // Error Handling else if (str.equals("AE01")) { //Zip Code Error avResponse.setResponseCode(AddressVerificationResponse.AE); } else if (str.equals("AE02")) { //Unknown Street avResponse.setResponseCode(AddressVerificationResponse.AE); } else if (str.equals("AE03")) { //Component Error } else if (str.equals("AE04")) { //Non-Deliverable Address avResponse.setResponseCode(AddressVerificationResponse.AE); } else if (str.equals("AE05")) { //Address Matched to Multiple Records } else if (str.equals("AE06")) { //Address Matched to Early Warning System } else if (str.equals("AE07")) { //Empty Address Input avResponse.setResponseCode(AddressVerificationResponse.AE); } else if (str.equals("AE08")) { //Suite Range Error } else if (str.equals("AE09")) { //Suite Range Missing } else if (str.equals("AE10")) { //Primary Range Error } else if (str.equals("AE11")) { //Primary Range Missing } else if (str.equals("AE12")) { //PO or RR Box Number Error } else if (str.equals("AE13")) { //PO or RR Box Number Missing } else if (str.equals("AE14")) { //Input Address Matched to CMRA but Secondary Number not Present } else if (str.equals("AE17")) { //A suite number was entered but no suite information found for primary address; } } } }