Monday 5 June 2017

Abdera: Create source element from Feed

If an atom entry copied from one feed to another, then source element is used to preserve original entry metadata.

If you got the feed instance, then you can call ‘getAsSource’ method to get the Source instance from feed.

Following is the complete working application.

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("\nInput Stream is closed");
   } catch (IOException e1) {
    e1.printStackTrace();
   }
  }

  if (conn != null) {
   conn.disconnect();
   //System.out.println("Connection 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.Optional;

import org.apache.abdera.Abdera;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Source;
import org.apache.abdera.parser.ParseException;
import org.apache.abdera.writer.Writer;

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();

  Source source = feed.getAsSource();

  Writer writer = Abdera.getInstance().getWriterFactory().getWriter("prettyxml");
  source.writeTo(writer, System.out);

  util.closeStreamAndConnection();
  ;

 }
}


Sample Output
<source xmlns="http://www.w3.org/2005/Atom" xml:base="https://self-learning-java-tutorial.blogspot.com/atom.xml">
  <id>tag:blogger.com,1999:blog-3062500619105519975</id>
  <updated>2016-12-17T03:22:05.420-08:00</updated>
  <title type="text">java tutorial : Blog to learn java programming</title>
  <subtitle type="html"/>
  <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://self-learning-java-tutorial.blogspot.com/feeds/posts/default"/>
  <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062500619105519975/posts/default?alt=atom"/>
  <link rel="alternate" type="text/html" href="https://self-learning-java-tutorial.blogspot.com/"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3062500619105519975/posts/default?alt=atom&amp;start-index=26&amp;max-results=25"/>
  <author>
    <name>hari krishna</name>
    <email>noreply@blogger.com</email>
    <gd:image xmlns:gd="http://schemas.google.com/g/2005" rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-6kwxUAiFEDA/AAAAAAAAAAI/AAAAAAAADTE/LmWjnEaeU5c/s512-c/photo.jpg"/>
  </author>
  <generator version="7.00" uri="http://www.blogger.com">Blogger</generator>
  <openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">3834</openSearch:totalResults>
  <openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex>
  <openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage>
</source>




Previous                                                 Next                                                 Home

No comments:

Post a Comment