package org.syzygy.gps.midp;
import org.kxml2.io.KXmlParser;
import org.syzygy.gps.GeoName;
import org.syzygy.util.midp.HttpUtil;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class GeoNameFactory
{
public GeoName fromDefaultURL(double lat, double lng) throws IOException, XmlPullParserException
{
return fromURL("http://ws.geonames.org/findNearbyPlaceName?lat=" + lat + "&lng=" + lng);
}
public GeoName fromURL(String url) throws IOException, XmlPullParserException
{
StreamConnection conn = null;
InputStream input = null;
try {
conn = (StreamConnection) Connector.open(url);
if (conn == null)
return null;
input = conn.openInputStream();
return fromXML(input);
} finally {
HttpUtil.safeClose(input);
HttpUtil.safeClose(conn);
}
}
public GeoName fromXML(InputStream input) throws IOException, XmlPullParserException
{
KXmlParser parser = new KXmlParser();
InputStreamReader reader = new InputStreamReader(input);
parser.setInput(reader);
GeoName name = new GeoName();
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "geonames");
if (parser.isEmptyElementTag())
return null;
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "geoname");
while (parser.nextTag() == XmlPullParser.START_TAG) {
String n = parser.getName().toLowerCase();
String t = parser.nextText();
if ("name".equals(n))
name.setName(t);
else if ("lat".equals(n))
name.setLatitude(t);
else if ("lng".equals(n))
name.setLongitude(t);
else if ("geonameid".equals(n))
name.setGeoNameId(t);
else if ("countrycode".equals(n))
name.setCountryCode(t);
else if ("countryname".equals(n))
name.setCountryName(t);
else if ("fcl".equals(n))
name.setFeatureClass(t);
else if ("fcode".equals(n))
name.setFeatureCode(t);
else if ("distance".equals(n))
name.setDistance(t);
}
parser.require(XmlPullParser.END_TAG, null, "geoname");
parser.nextTag();
parser.require(XmlPullParser.END_TAG, null, "geonames");
return name;
}
}