package net.osmand.plus;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import net.osmand.LogUtil;
import net.osmand.data.Amenity;
import net.osmand.data.AmenityType;
import net.osmand.osm.MapUtils;
import net.osmand.plus.activities.OsmandApplication;
import net.sf.junidecode.Junidecode;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
public class NameFinderPoiFilter extends PoiFilter {
public static final String FILTER_ID = "name_finder"; //$NON-NLS-1$
private static final Log log = LogUtil.getLog(NameFinderPoiFilter.class);
List<Amenity> searchedAmenities = new ArrayList<Amenity>();
private String query = ""; //$NON-NLS-1$
public NameFinderPoiFilter(OsmandApplication application) {
super(null, application);
this.name = application.getString(R.string.poi_filter_namefinder); //$NON-NLS-1$
this.filterId = FILTER_ID;
}
@Override
public List<Amenity> searchAgain(double lat, double lon) {
MapUtils.sortListOfMapObject(searchedAmenities, lat, lon);
return searchedAmenities;
}
@Override
public String getSearchArea() {
return ""; //$NON-NLS-1$
}
@Override
public List<Amenity> initializeNewSearch(double lat, double lon, int firstTimeLimit) {
return searchFurther(lat, lon);
}
@Override
public boolean isSearchFurtherAvailable() {
return true;
}
@Override
public List<Amenity> searchFurther(double latitude, double longitude) {
searchOnline(latitude, longitude, query);
return searchedAmenities;
}
public String searchOnline(double latitude, double longitude, String filter){
searchedAmenities.clear();
query = filter;
String q = query + " near " +latitude+","+longitude; //$NON-NLS-1$//$NON-NLS-2$
try {
URL url = new URL("http://gazetteer.openstreetmap.org/namefinder/search.xml?find="+URLEncoder.encode(q)); //$NON-NLS-1$
InputStream stream = url.openStream();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, "UTF-8"); //$NON-NLS-1$
int eventType;
int namedDepth= 0;
while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("searchresults")) { //$NON-NLS-1$
String err = parser.getAttributeValue("", "error"); //$NON-NLS-1$ //$NON-NLS-2$
if (err != null) {
stream.close();
return err;
}
}
if (parser.getName().equals("named")) { //$NON-NLS-1$
namedDepth++;
if (namedDepth == 1) {
try {
Amenity a = new Amenity();
a.setLocation(Double.parseDouble(parser.getAttributeValue("", "lat")), //$NON-NLS-1$//$NON-NLS-2$
Double.parseDouble(parser.getAttributeValue("", "lon"))); //$NON-NLS-1$//$NON-NLS-2$
a.setId(Long.parseLong(parser.getAttributeValue("", "id"))); //$NON-NLS-1$ //$NON-NLS-2$
String name = parser.getAttributeValue("", "name"); //$NON-NLS-1$//$NON-NLS-2$
a.setName(name);
a.setEnName(Junidecode.unidecode(name));
a.setType(AmenityType.OTHER);
a.setSubType(parser.getAttributeValue("", "category")); //$NON-NLS-1$//$NON-NLS-2$
searchedAmenities.add(a);
} catch (NullPointerException e) {
log.info("Invalid attributes", e); //$NON-NLS-1$
} catch (NumberFormatException e) {
log.info("Invalid attributes", e); //$NON-NLS-1$
}
}
}
} else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals("named")) { //$NON-NLS-1$
namedDepth--;
}
}
}
stream.close();
} catch (IOException e) {
log.error("Error loading name finder poi", e); //$NON-NLS-1$
return getApplication().getString(R.string.input_output_error); //$NON-NLS-1$
} catch (XmlPullParserException e) {
log.error("Error parsing name finder poi", e); //$NON-NLS-1$
return getApplication().getString(R.string.input_output_error); //$NON-NLS-1$
}
MapUtils.sortListOfMapObject(searchedAmenities, latitude, longitude);
return null;
}
public List<Amenity> getSearchedAmenities() {
return searchedAmenities;
}
}