Android Open Source - Absolute-Android-RSS R S S Parse






From Project

Back to project page Absolute-Android-RSS.

License

The source code is released under:

Apache License

If you think the Android project Absolute-Android-RSS listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*Copyright 2010 University Of Utah Android Development Group
 *Licensed under the Apache License, Version 2.0 (the "License");
 *you may not use this file except in compliance with the License.
 *You may obtain a copy of the License at
 *//from   w w  w .j a va2s.  co  m
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 *Unless required by applicable law or agreed to in writing, software
 *distributed under the License is distributed on an "AS IS" BASIS,
 *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *See the License for the specific language governing permissions and
 *limitations under the License.
 */
package com.AA.Other;

import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
/**
 * Class that handles parsing the list of current articles from the RSS feed
 */
public class RSSParse{
  /**
   * The URI where the RSS feed is located.
   */
  public static final String URI = "http://www.absolutelyandroid.com/feed/";

  /**
   * Get the list of articles currently contained in the RSS feed.
   * @param isBackground if the request is being run in the background
   * @param callingContext current application context
   * @return List of articles contained in the RSS on success. 
   *         On failure returns null
   */
  public static List<Article> getArticles(boolean isBackground,Context callingContext){
    //verify that we can use the network
    if(!isNetworkAvailable(isBackground,callingContext))
      return null;
    //try and get the document
    Document doc = getDocument();
    if(doc == null)
      return null;
    //parse into new articles
    try{
      ArrayList<Article> articles = new ArrayList<Article>();
      NodeList items = doc.getElementsByTagName("item");
      for(int i=0;i<items.getLength();i++){
        //this cast _shoud_ be safe if the data is well formed
        Element el = (Element)items.item(i);
        //these also should be safe provided the data is well formed
        String title = el.getElementsByTagName("title").item(0).getFirstChild().getNodeValue();
        String date = el.getElementsByTagName("pubDate").item(0).getFirstChild().getNodeValue();
        String url = el.getElementsByTagName("link").item(0).getFirstChild().getNodeValue();
        String desc = el.getElementsByTagName("description").item(0).getFirstChild().getNodeValue();
        articles.add(new Article(desc,title,date,url));
      }
      return articles;
    }catch(Exception e){
      //any parse errors and we'll log and fail
      Log.e("AARSS","Error Parsing RSS",e);
      return null;
    }

  }

  /**
   * Check if the network is available for get the RSS feed
   * @param isBackground if the request is being run in the background
   * @param callingContext current application context
   * @return if the network is in a state where a request can be sent
   */
  private static boolean isNetworkAvailable(boolean isBackground,Context callingContext){
    ConnectivityManager manager = (ConnectivityManager)callingContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    //If the request is in the background and the phone does not want us to do
    //any background data transfer then respect that wish and bail.
    if(isBackground && !manager.getBackgroundDataSetting())
      return false;
    //if the current connection isn't ready for data then bail
    //Apparently if there is no network, the network info returns null
    NetworkInfo netInfo = manager.getActiveNetworkInfo();
    if(netInfo == null || manager.getActiveNetworkInfo().getState() != NetworkInfo.State.CONNECTED)
      return false;
    return true;
  }

  /**
   * Get the XML document for the RSS feed
   * @return the XML Document for the feed on success, on error returns null
   */
  private static Document getDocument(){
    Document doc = null;
    try{
      DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                                .newDocumentBuilder();
      //I'm not sure how this handles network timeouts... Needs testing
      DefaultHttpClient client = new DefaultHttpClient();
      HttpGet request = new HttpGet(URI);
      HttpResponse response =  client.execute(request);
      doc = builder.parse(response.getEntity().getContent());

    }catch(java.io.IOException e){
      //IO Exception generally implies network error, so just fail silently
      return null;
    }catch(SAXException e){
      //SAXException means the xml isn't valid. fail and log an error
      Log.e("AARSS","Parse Exception in RSS feed",e);
      return null;
    }catch(Exception e){
      //this means either a builder exception or a timeout
      return null;
    }
    return doc;
  }
}




Java Source Code List

com.AA.Activities.AAMain.java
com.AA.Activities.AASettings.java
com.AA.Activities.AAWidget.java
com.AA.Other.Article.java
com.AA.Other.ColorPickerDialog.java
com.AA.Other.DateFunctions.java
com.AA.Other.DisplayTypes.java
com.AA.Other.HTMLConverter.java
com.AA.Other.RSSParse.java
com.AA.Recievers.AAWidgetProvider.java
com.AA.Recievers.AlarmReceiver.java
com.AA.Services.RssService.java