package com.vegaaa.skidata.handler;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.util.EncodingUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import android.util.Xml.Encoding;
import com.vegaaa.skidata.R;
import com.vegaaa.skidata.model.IsoCountry;
import com.vegaaa.skidata.model.SimpleSkiResort;
import com.vegaaa.skidata.model.SkiResort;
import com.vegaaa.skidata.model.SkiResortInfo;
import com.vegaaa.skidata.model.SkiResortTrackInfo;
import com.vegaaa.skidata.model.SkiTrackInfo;
import com.vegaaa.skidata.model.SnowSkredFare_e;
import com.vegaaa.skidata.model.SnowType_e;
import com.vegaaa.skidata.model.TrackInfoType_e;
/**
* This class will handle every resorts that is avail. in Norway.
* Will fetch a XML-file that is located @
* http://www.vegaasen.com/_apps/resorts.xml
*
* which is updated every 30m/7
*
* Example of dataset:
* <yet to implement>
*
* Note; Improvements of the data that is beeing generated, will be fixed in the near future.
* As of 06.01.2011 - this xml is in a "proof-of-concept"-state.
*
* @author WindowsUser
* @since 06.01.2011
*
*/
public class SkidataDataHandler {
private List<SkiResort> skiResorts;
private List<SimpleSkiResort> simpleSkiResorts;
private Resources contextResources;
private String location;
private static final String TAG = SkidataDataHandler.class.getName();
public synchronized List<SimpleSkiResort> retrieveAllResortsAsSimple(Context context, IsoCountry isoCountry)
throws Exception {
simpleSkiResorts = new ArrayList<SimpleSkiResort>();
contextResources = context.getResources();
if(contextResources!=null){
setLocation(contextResources.getString(R.string.simple_resrt_xml_url_location));
InputStream resortInputStream = getInputStreamForXML();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document domDocument = builder.parse(resortInputStream);
Element rootElementOfDocument = domDocument.getDocumentElement();
NodeList resortNodeList = rootElementOfDocument.getElementsByTagName("resort");
if(resortNodeList.getLength()>0) {
SimpleSkiResort simpleSkiResort;
for(int index=0;index<resortNodeList.getLength();index++){
simpleSkiResort = new SimpleSkiResort();
Node simpleResortNode = resortNodeList.item(index);
if(simpleResortNode.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) simpleResortNode;
NamedNodeMap attributes = simpleResortNode.getAttributes();
simpleSkiResort.setId((String) attributes.getNamedItem("id").getNodeValue());
simpleSkiResort.setTitle(EncodingUtils.getString(element.getFirstChild().getNodeValue().getBytes(), Encoding.UTF_8.name()));
Log.d(TAG, "Found simple ski resort-item: Title: " + simpleSkiResort.getTitle() + " id: " + simpleSkiResort.getId());
if(simpleSkiResort!=null) {
simpleSkiResorts.add(simpleSkiResort);
}
}
}
}
}
if(simpleSkiResorts!=null){
Log.d(TAG, "Found " + simpleSkiResorts.size() + " resorts.");
}
return simpleSkiResorts;
}
public synchronized List<SkiResort> retrieveAllResorts(Context context) throws Exception {
skiResorts = new ArrayList<SkiResort>();
contextResources = context.getResources();
if(contextResources!=null){
setLocation(contextResources.getString(R.string.resort_xml_url_location));
InputStream resortInputStream = getInputStreamForXML();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Log.d(TAG, "Trying to parse DOM tree");
Document domDocument = builder.parse(resortInputStream);
Element rootElementOfDocument = domDocument.getDocumentElement();
NodeList resortNodeList = rootElementOfDocument.getElementsByTagName("resort");
if(resortNodeList.getLength()>0) {
SkiResort skiResort;
for(int index=0;index<resortNodeList.getLength();index++){
skiResort = new SkiResort();
Node resortNode = resortNodeList.item(index);
if(resortNode.getNodeType() == Node.ELEMENT_NODE) {
List<SkiTrackInfo> skiTrackInfos = new ArrayList<SkiTrackInfo>();
SkiTrackInfo skiTrackInfo = new SkiTrackInfo();
Element element = (Element) resortNode;
skiTrackInfo.setDepthInPath((String) getObjectValue("snowDepthInPathTop", element, false));
skiTrackInfo.setDepthInTrack((String) getObjectValue("snowDepthInTrackTop", element, false));
skiTrackInfo.setLastPowderAlarm((String) getObjectValue("snowLastPowderAlarmTop", element, false));
skiTrackInfo.setLastSnowFall((String) getObjectValue("snowLastSnowfallTop", element, false));
skiTrackInfo.setSnowType(SnowType_e.valueOf((String)getObjectValue("snowTypeTop", element, false)));
skiTrackInfo.setTrackInfoType(TrackInfoType_e.TOP);
skiTrackInfos.add(skiTrackInfo);
skiTrackInfo = new SkiTrackInfo();
skiTrackInfo.setDepthInPath((String) getObjectValue("snowDepthInPathBottom", element, false));
skiTrackInfo.setDepthInTrack((String) getObjectValue("snowDepthInTrackBottom", element, false));
skiTrackInfo.setLastPowderAlarm((String) getObjectValue("snowLastPowderAlarmBottom", element, false));
skiTrackInfo.setLastSnowFall((String) getObjectValue("snowLastSnowfallBottom", element, false));
skiTrackInfo.setSnowType(SnowType_e.valueOf((String)getObjectValue("snowTypeBottom", element, false)));
skiTrackInfo.setTrackInfoType(TrackInfoType_e.BOTTOM);
skiTrackInfos.add(skiTrackInfo);
SkiResortTrackInfo skiResortTrackInfo = new SkiResortTrackInfo();
skiResortTrackInfo.setConditions((String)getObjectValue("resortConditions", element, false));
skiResortTrackInfo.setElevatorsOpen((String) getObjectValue("resortElevatorsOpen", element, false));
skiResortTrackInfo.setKmOpen((String) getObjectValue("resortKilometersOpen", element, false));
skiResortTrackInfo.setOpenPercent((Integer) getObjectValue("resortOpenPercent", element, false));
skiResortTrackInfo.setSkredFare(SnowSkredFare_e.NONE);
skiResortTrackInfo.setTracksOpen((String) getObjectValue("resortTracksOpen", element, false));
SkiResortInfo skiResortInfo = new SkiResortInfo();
String title = (String) getObjectValue("resortTitle", element, false);
skiResortInfo.setTitle(trimFromLocation(title.indexOf("rapport")+6, (String) getObjectValue("resortTitle", element, false)));
skiResortInfo.setPublicInformation((String) getObjectValue("resortInformation", element, false));
skiResortInfo.setTelephone((String) getObjectValue("resortTelephone", element, false));
skiResortInfo.setOpen(getObjectValue("resortTelephone", element, false).toString().contains("pen") ? true : false);
skiResort.setResortTrackInfo(skiResortTrackInfo);
skiResort.setResortInfo(skiResortInfo);
skiResort.setTrackInfos(skiTrackInfos);
skiResort.setLastUpdated(new Date());
Log.d(TAG, "Added resort." + skiResortInfo.getTitle());
skiResorts.add(skiResort);
}
}
}
}
if(skiResorts!=null){
Log.d(TAG, "Found " + skiResorts.size() + " resorts.");
}
return skiResorts;
}
private String trimFromLocation(int loc, String s) {
if(s != null){
s = s.substring(loc, s.length()+1);
}
return s;
}
private Object getObjectValue(String nodeName, Element element, boolean list) {
if(nodeName!=null && element !=null) {
NodeList nodeList = element.getElementsByTagName(nodeName);
if(nodeList.getLength()!=0) {
Element nodeElement = (Element) nodeList.item(0);
NodeList nodeElementNodeList = nodeElement.getChildNodes();
if(nodeElementNodeList.getLength()!=0) {
return nodeElementNodeList.item(0).getNodeValue();
}
}
return null;
}
return null;
}
private InputStream getInputStreamForXML() {
Log.d(TAG, "Using locationg" + getLocation());
if(getLocation()!=null) {
if(getLocation()!=""){
InputStream inputStream = null;
URL url = null;
try {
url = new URL(getLocation());
} catch (MalformedURLException mue) {
mue.printStackTrace();
}
URLConnection connection = null;
try {
connection = url.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
if(connection!=null){
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = 0;
try {
responseCode = httpConnection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
} // should give 200
if(responseCode==HttpURLConnection.HTTP_OK) {
try {
inputStream = httpConnection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
}
}
}
return new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
};
}
public void setLocation(String location) {
this.location = location;
}
public String getLocation(){
return this.location;
}
}
|