ITipClient.java :  » UnTagged » oeffis » net » oeffis » data » itip » Android Open Source

Android Open Source » UnTagged » oeffis 
oeffis » net » oeffis » data » itip » ITipClient.java
package net.oeffis.data.itip;

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;

import net.oeffis.R;
import net.oeffis.data.DataClient;
import net.oeffis.data.DataClientException;
import net.oeffis.data.DataSource;
import net.oeffis.data.DateGuesser;
import net.oeffis.data.Departure;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

import android.content.Context;
import android.util.Log;

public class ITipClient implements DataClient<String, Departure> {
  
  private static final String TAG = ITipClient.class.getCanonicalName();
  
  private Context context;
  private DataSource<URL, Document> dataSource; 
  
  public ITipClient(Context context) {
    this(context, new ITipDataSource());
  }
  
  public ITipClient(Context context, DataSource<URL, Document> dataSource) {
    this.context = context;
    this.dataSource = dataSource;
  }

  public Collection<Departure> getDepartures(String station) throws DataClientException {
    
    if(station == null || station.trim().equals("")) {
      throw new IllegalArgumentException();
    }
    
    try {
      ArrayList<Departure> departures = new ArrayList<Departure>();
      Document dom = dataSource.load(getUrl(station));
      
      if(dom == null) {
        throw new Exception("no data");
      }
      
      DateGuesser dateGuesser = new DateGuesser();
      NodeList rows = dom.getElementsByTagName("tr");
      for(int i = 1; i < rows.getLength(); i++) {
        NodeList fields = rows.item(i).getChildNodes();
        departures.add(new Departure(
          getInnerText(fields.item(0)),
          getInnerText(fields.item(1)),
          dateGuesser.guessDate((getInnerText(fields.item(2)))
        )));
      }
      
      return departures;
      
    } catch(Exception ex) {
      throw new DataClientException(ex.getMessage(), ex);
    }
  }
  
  private URL getUrl(String station) {
    try {
      String url = context.getString(R.string.itip_url);
      String enc = context.getString(R.string.itip_enc);
      return new URL(String.format(url, URLEncoder.encode(station, enc)));
    } catch(UnsupportedEncodingException ex) {
      Log.e(TAG, "encoding not found or invalid");
    } catch(MalformedURLException ex) {
      Log.e(TAG, "url format or encoding not found or invalid");
    }
    return null;
  }
  
  private static String getInnerText(Node node) {
    
    StringBuffer sb = new StringBuffer();
    NodeList children = node.getChildNodes();
    
    if(children == null || children.getLength() == 0) {
      if(node instanceof Text) {
        return ((Text)node).getData();
      }
    }
    
    for(int i = 0; i < children.getLength(); i++) {
      sb.append(getInnerText(children.item(i)));
    }
    return sb.toString();
  }
}
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.