// Created by plusminus on 19:15:38 - 23.11.2008 package org.androad.sys.postcode.uk_bs_7666; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.androad.sys.ors.adt.Error; import org.androad.sys.ors.adt.GeocodedAddress; import org.androad.sys.ors.exceptions.ORSException; import org.androad.sys.postcode.IPostCodeRequester; import org.apache.http.util.ByteArrayBuffer; public class Requester implements IPostCodeRequester{ // =========================================================== // Constants // =========================================================== private static final String BASEURL = "http://www.andnav.org/sys/postcodes/uk_bs_7666/query.php?q="; // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods from SuperClass/Interfaces // =========================================================== @Override public GeocodedAddress request(final String aPostcode) throws IOException, ORSException{ final URL requestURL = new URL(BASEURL.concat(aPostcode.trim().replace(" ", "%20"))); // Log.d(Constants.DEBUGTAG, "Requesting: " + requestURL.toExternalForm()); final URLConnection conn = requestURL.openConnection(); conn.connect(); final InputStream is = conn.getInputStream(); /* Buffered is always good for a performance plus. */ final ByteArrayBuffer bab = new ByteArrayBuffer(1000); final BufferedInputStream bis = new BufferedInputStream(is, 8000); // SDK says to use 8k buffer. final byte[] buf = new byte[256]; int len = 0; while((len = bis.read(buf)) > 0) { bab.append(buf, 0, len); } return createFromResult(new String(bab.toByteArray()).trim()); } // =========================================================== // Methods // =========================================================== private static GeocodedAddress createFromResult(final String s) throws ORSException { if(s.compareToIgnoreCase("error") == 0){ throw new ORSException(new Error(Error.ERRORCODE_UNKNOWN, Error.SEVERITY_ERROR, "org.androad.sys.postcode.PostCodeRequester.createFromResult(final String postCode)", "Postcode could not be resolved.")); } /* Example: "AB21 0GU 57204940 -2211980" */ final String[] parts = s.split(" ", 3); final int lat = Integer.parseInt(parts[0]); final int lon = Integer.parseInt(parts[1]); final GeocodedAddress out = new GeocodedAddress(lat, lon); out.setPostalCode(parts[2]); return out; } // =========================================================== // Inner and Anonymous Classes // =========================================================== }