HtmlParseServlet.java Source code

Java tutorial

Introduction

Here is the source code for HtmlParseServlet.java

Source

import java.io.IOException;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.MalformedURLException;

import javax.servlet.*;
import javax.servlet.http.*;

import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;

public class HtmlParseServlet extends HttpServlet {

    private static final String BASE_URL = "http://finance.yahoo.com/q?d=t&s=";

    private ParserDelegator htmlParser = null;

    private MyParserCallback callback = null;

    private String htmlText = "";

    private boolean lastTradeFlag = false;

    private boolean boldFlag = false;

    private float stockVal = 0f;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, java.io.IOException {

        //set the MIME type of the response, "text/html"
        response.setContentType("text/html");

        //use a PrintWriter send text data to the client who has requested the
        // servlet
        java.io.PrintWriter out = response.getWriter();

        //Begin assembling the HTML content
        out.println("<html><head>");

        out.println("<title>Stock Price Fetcher</title></head><body>");
        out.println("<h2>Please submit a new valid stock symbol</h2>");

        //make sure method="post" so that the servlet service method
        //calls doPost in the response to this form submit
        out.println("<form method=\"post\" action =\"" + request.getContextPath() + "/stockservlet\" >");

        out.println("<table border=\"0\"><tr><td valign=\"top\">");
        out.println("Stock symbol: </td>  <td valign=\"top\">");
        out.println("<input type=\"text\" name=\"symbol\" size=\"10\">");
        out.println("</td></tr><tr><td valign=\"top\">");

        out.println("<input type=\"submit\" value=\"Submit Info\"></td></tr>");
        out.println("</table></form>");
        out.println("</body></html>");

    } //end doGet

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException {

        String symbol;//this will hold the stock symbol
        float price;

        symbol = request.getParameter("symbol");

        boolean isValid = (symbol == null || symbol.length() < 1) ? false : true;

        //set the MIME type of the response, "text/html"
        response.setContentType("text/html");

        //use a PrintWriter send text data to the client who has requested the
        // servlet
        java.io.PrintWriter out = response.getWriter();

        //Begin assembling the HTML content
        out.println("<html><head>");
        out.println("<title>Latest stock value</title></head><body>");

        if (!isValid) {
            out.println("<h2>Sorry, the stock symbol parameter was either empty or null</h2>");
        } else {

            out.println("<h2>Here is the latest value of " + symbol + "</h2>");

            price = getLatestPrice(symbol);
            //price < 1 ? "The symbol is probably invalid." :
            out.println((price == 0 ? "The symbol is probably invalid." : "" + price));

        }

        out.println("</body></html>");

    }// doPost

    private float getLatestPrice(String symbol) throws IOException, MalformedURLException {

        BufferedReader webPageStream = null;
        URL stockSite = new URL(BASE_URL + symbol);
        System.out.println(BASE_URL + symbol);
        webPageStream = new BufferedReader(new InputStreamReader(stockSite.openStream()));

        htmlParser = new ParserDelegator();

        callback = new MyParserCallback();

        synchronized (htmlParser) {//the code is designed to make calling
            // parse() thread-safe

            htmlParser.parse(webPageStream, callback, true);
        }

        return stockVal;

    }//getLatestPrice

    class MyParserCallback extends ParserCallback {

        public MyParserCallback() {

            if (stockVal != 0)
                stockVal = 0f;

        }

        public void handleStartTag(javax.swing.text.html.HTML.Tag t, MutableAttributeSet a, int pos) {

            if (lastTradeFlag && (t == javax.swing.text.html.HTML.Tag.B)) {

                boldFlag = true;
            }

        }//handleStartTag

        public void handleText(char[] data, int pos) {

            htmlText = new String(data);

            if (htmlText.indexOf("No such ticker symbol.") != -1) {

                throw new IllegalStateException("Invalid ticker symbol in handleText() method.");

            } else if (htmlText.equals("Last Trade:")) {

                lastTradeFlag = true;

            } else if (boldFlag) {

                try {

                    stockVal = new Float(htmlText).floatValue();

                } catch (NumberFormatException ne) {

                    try {

                        // tease out any commas in the number using NumberFormat

                        java.text.NumberFormat nf = java.text.NumberFormat.getInstance();

                        Double f = (Double) nf.parse(htmlText);

                        stockVal = (float) f.doubleValue();

                    } catch (java.text.ParseException pe) {

                        throw new IllegalStateException(
                                "The extracted text " + htmlText + " cannot be parsed as a number!");

                    }
                }
                lastTradeFlag = false;
                boldFlag = false;

            } //if

        } //handleText
    }//MyParserCallback
}//HttpServlet