englishlearning.util.handler.ArticlesListHandler.java Source code

Java tutorial

Introduction

Here is the source code for englishlearning.util.handler.ArticlesListHandler.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package englishlearning.util.handler;

import englishlearning.model.ArticleBuilder;
import englishlearning.model.Articles;
import static org.apache.commons.lang3.StringEscapeUtils.unescapeHtml3;
import org.apache.commons.lang3.StringUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Clicia
 */
public class ArticlesListHandler extends DefaultHandler {
    // http://www.journaldev.com/1198/java-sax-parser-example-tutorial-to-parse-xml-to-list-of-objects
    // http://learningenglish.voanews.com/api/epiqq

    private final Articles articles = new Articles();
    private ArticleBuilder __articleBuilder;
    private StringBuilder __buffer;
    private Field __field = Field.NIL;

    public Articles getArticles() {
        return articles;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        if (qName.equalsIgnoreCase("item")) {
            __articleBuilder = ArticleBuilder.create();
        } else if (__articleBuilder != null) {
            if (qName.equalsIgnoreCase("title")) {
                __field = Field.TITLE;
                __buffer = new StringBuilder();
            } else if (qName.equalsIgnoreCase("description")) {
                __field = Field.DESCRIPTION;
                __buffer = new StringBuilder();
            } else if (qName.equalsIgnoreCase("link")) {
                __field = Field.LINK;
                __buffer = new StringBuilder();
            } else if (qName.equalsIgnoreCase("guid")) {
                __field = Field.GUID;
                __buffer = new StringBuilder();
            } else if (qName.equalsIgnoreCase("category")) {
                __field = Field.CATEGORY;
                __buffer = new StringBuilder();
            } else if (qName.equalsIgnoreCase("enclosure")) {
                try {
                    __articleBuilder.imageUrl(attributes.getValue("url"));
                } finally {
                }
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equalsIgnoreCase("item")) {
            try {
                articles.add(__articleBuilder.build());
            } finally {
                __articleBuilder = null;
            }
        } else if (__articleBuilder != null) {
            if (qName.equalsIgnoreCase("title")) {
                __articleBuilder.title(__buffer.toString());
            } else if (qName.equalsIgnoreCase("description")) {
                String data = unescapeHtml3(StringUtils.strip(__buffer.toString()).replaceAll("\\[.*?\\]", "")
                        .replace(String.valueOf((char) 160), "").trim()).replaceAll("(?m)^[ \\t]*\\r?\\n", "");
                __articleBuilder.description(StringUtils.join(data.split(" ", 101), " ", 0, 99) + "...");
                __articleBuilder.content(data);
            } else if (qName.equalsIgnoreCase("link")) {
                __articleBuilder.link(__buffer.toString());
            } else if (qName.equalsIgnoreCase("guid")) {
                __articleBuilder.guid(__buffer.toString());
            } else if (qName.equalsIgnoreCase("category")) {
                __articleBuilder.tags(__buffer.toString());
            }
        }
        __field = Field.NIL;
    }

    @Override
    public void characters(char ch[], int start, int length) throws SAXException {
        try {
            switch (__field) {
            case TITLE:
            case DESCRIPTION:
            case LINK:
            case GUID:
            case CATEGORY:
                __buffer.append(new String(ch, start, length));

                break;
            }
        } finally {
            // __field = Field.NIL;
        }
    }

    private enum Field {
        NIL, TITLE, DESCRIPTION, LINK, GUID, CATEGORY
    }
}