SkidataDataHandler.java :  » UnTagged » skidata-android-norwegian » com » vegaaa » skidata » handler » Android Open Source

Android Open Source » UnTagged » skidata android norwegian 
skidata android norwegian » com » vegaaa » skidata » handler » SkidataDataHandler.java
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;
  }
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.