Saturday, 3 June 2017

Abdera: Get all the entries in a feed

Feed interface provides getEntries method, it return all the entries of the Feed Object.

Following application get all the entries from the url ‘https://self-learning-java-tutorial.blogspot.com/atom.xml’ and print some meta information of all the entries associated with given feed.

Feedutil.java
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Optional;
import java.util.zip.GZIPInputStream;

import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Feed;
import org.apache.abdera.parser.Parser;

/**
 * Utility class to parse Atom feed.
 * 
 * Usage :
 * <ul>
 * <li>Instantiate FeedUtil with atom document url. Call the getFeed method</li>
 * <li>to get the feed document associated with url.</li>
 * </ul>
 * 
 * @author Hari Krishna Gurram
 *
 */
public class FeedUtil {
 private String url;
 private InputStream in = null;
 private Feed feed = null;
 HttpURLConnection conn = null;

 public FeedUtil(String url) {
  this.url = url;
 }

 /**
  * 
  * @param url
  * @return Optional.empty if url is null (or) unable to parse the url, else
  *         return the Document object.
  */
 private Optional<Document<Feed>> getDocument() {
  if (url == null) {
   return Optional.empty();
  }

  try {
   URL urlTemp = new URL(url);

   conn = (HttpURLConnection) urlTemp.openConnection();
   conn.setRequestProperty("Accept-Encoding", "gzip");
   conn.connect();

   String contentEncoding = conn.getContentEncoding();
   boolean isGzip = contentEncoding != null && contentEncoding.contains("gzip");

   in = !isGzip ? conn.getInputStream() : new GZIPInputStream(conn.getInputStream());
   Abdera abdera = Abdera.getInstance();
   Parser parser = abdera.getParser();
   Document<Feed> document = parser.parse(in, url.toString());
   return Optional.of(document);

  } catch (Exception e) {
   e.printStackTrace();
  }

  return Optional.empty();
 }

 /**
  * 
  * @return the Feed object associated with given {@link url}. In any case if
  *         the feed creation is failed, then it return Optional.empty().
  */

 public synchronized Optional<Feed> getFeed() {
  if (feed != null) {
   return Optional.of(feed);
  }

  Optional<Document<Feed>> documentOpt = getDocument();

  if (!documentOpt.isPresent()) {
   return Optional.empty();
  }

  Document<Feed> document = documentOpt.get();

  feed = document.getRoot();
  return Optional.of(feed);
 }

 public void closeStreamAndConnection() {
  if (in != null) {
   try {
    in.close();
    System.out.println("Input Stream is closed");
   } catch (IOException e1) {
    e1.printStackTrace();
   }
  }

  if (conn != null) {
   conn.disconnect();
   System.out.println("Input stream is disconnected");
  }
 }

 /**
  * This is just a safety check, if user forget to close the stram, it will
  * be closed once object is out of scope.
  */
 @Override
 public void finalize() {
  closeStreamAndConnection();
 }
}

ParserDemo.java
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import org.apache.abdera.model.Content.Type;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Person;
import org.apache.abdera.parser.ParseException;

public class ParserDemo {
 private static String url = "https://self-learning-java-tutorial.blogspot.com/atom.xml";

 public static void main(String args[]) throws ParseException, IOException {
  FeedUtil util = new FeedUtil(url);

  Optional<Feed> feedOpt = util.getFeed();

  if (!feedOpt.isPresent()) {
   System.out.println("No feed present");
   return;
  }

  Feed feed = feedOpt.get();

  List<Entry> entries = feed.getEntries();
  for (Entry entry : entries) {
   System.out.println("*************************************");
   String title = entry.getTitle();
   Date publishedDate = entry.getPublished();
   Type contentType = entry.getContentType();

   Person author = entry.getAuthor();
   String authorName = author.getName();
   String authorMail = author.getEmail();
   
   System.out.println("title : " + title);
   System.out.println("Published Date : " + publishedDate);
   System.out.println("Content Type : " + contentType);
   
   System.out.println("Author Name : " + authorName);
   System.out.println("Author Mail : " + authorMail);
   System.out.println("*************************************\n\n");
  }
  
  util.closeStreamAndConnection();;

 }
}


Sample Output
*************************************
title : SWT: Focus listeners
Published Date : Fri Dec 09 20:16:00 IST 2016
Content Type : HTML
Author Name : hari krishna
Author Mail : noreply@blogger.com
*************************************


*************************************
title : SWT: Text listeners
Published Date : Fri Dec 09 08:35:00 IST 2016
Content Type : HTML
Author Name : hari krishna
Author Mail : noreply@blogger.com
*************************************


*************************************
title : SWT: Mouse listeners
Published Date : Wed Dec 07 22:07:00 IST 2016
Content Type : HTML
Author Name : hari krishna
Author Mail : noreply@blogger.com
*************************************


Input Stream is closed
Input stream is disconnected




Previous                                                 Next                                                 Home

No comments:

Post a Comment