Google App Engine – Java (GAE/J) dan Twitter Search

8 June 2010 at 19:43 | Posted in twitter | 2 Comments

Dulu mencari hosting gratis berbasis Java (JSP+servlet) merupakan tantangan tersendiri. Untungnya  saat ini Google melalui Googgle App Engine (GAE) menyediakan hosting gratis untuk applikasi Java.  Walaupun ada beberapa batasan (contoh batasannya lihat tabel di bawah), tapi menurut saya sudah sangat layak.  Batasannya lumayan berbeda dan lebih rumit dibandingkan hosting pada umumnya, karena GAE ini menggunakan prinsip cloud computing. GAE versi gratis juga tidak mendukung relational database, walaupun data masih bisa disimpan dalam bentuk lain yang disebut datastore.

Untuk memulai menggunakan GAE/J,  baca dokumentasinya kemudian  tutorial ini dan lanjutannya jika menggunakan Netbeans.  Kalau mampu dan ada waktu,  bagus juga memulai dari dasar dengan hanya mengunakan text editor + ant.

Selanjutnya saya akan mencoba membuat aplikasi di GAE yang mengambil tweet mengenai sesuatu hal.  Nantinya dapat diolah lebih lanjut, tapi untuk sekarang saya batasi hanya mengambil dan menampilkan saja.

Twitter sudah menyediakan fasilitas ini dengan mudah.  Misalkan untuk mengambil tweet mengenai  Bandung,  gunakan URL:  http://search.twitter.com/search.atom?q=bandung dan hasilnya sudah dalam bentuk XML.   Info lebih detil mengenai search twitter ini  dapat dilihat di http://search.twitter.com/api/

Untuk mengambil hasil search twitter,  digunakan url.openstream  sedangkan untuk memprosesnya XML-nya saya menggunakan SAX  (lihat tutorial SAX bagi yang belum mengenal XML dan parsernya). Berikut kode lengkapnya:

package twmining;

import java.io.IOException;

import java.util.logging.Logger;
import javax.servlet.http.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;

public class GetTweet extends HttpServlet {
    private static final Logger log = Logger.getLogger(TweetXMLHandler.class.getName());
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
           throws IOException {
           resp.setContentType("text/plain");
           resp.getWriter().println("Test Search Tweet:");
           try {
                    URL url = new URL("http://search.twitter.com/search.atom?q=bandung");
                    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
                    SAXParserFactory factory = SAXParserFactory.newInstance();
                    SAXParser parser;
                    parser = null;
                    parser = factory.newSAXParser();
                    TweetXMLHandler txh = new TweetXMLHandler();
                    txh.resp = resp;
                    InputSource inS = new InputSource(reader);
                    parser.parse(inS, txh);
                    reader.close();
            } catch (ParserConfigurationException ex) {
                    log.severe(ex.getMessage());
            } catch (SAXException ex) {
                    log.severe(ex.getMessage());
            } catch ( MalformedURLException  e) {
                    log.severe(e.getMessage());
            }
    }
}

Dengan menggunakan SAX,  kita tinggal membuat handler yang  akan dipanggil saat event tertentu.   Fokus saya hanya mengambil isi tweet dan waktunya.   Berikut kode untuk handler:

package twmining;

import java.io.IOException;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletResponse;
import org.xml.sax.Attributes;

public class TweetXMLHandler extends DefaultHandler {
  public HttpServletResponse resp;  //hanya untuk debugging
  private static final Logger log = Logger.getLogger(TweetXMLHandler.class.getName());
  private String tempVal;

  private void println(String val) {
      try {
            resp.getWriter().println(val);
        } catch (IOException ex) {
            Logger.getLogger(TweetXMLHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
  }

  @Override
  public void endDocument() throws org.xml.sax.SAXException {
        println("Selesai parsing dokumen");
  }

  @Override
  public void startDocument() throws org.xml.sax.SAXException {
        println("Mulai parsing dokumen");
  }

  @Override
  public void startElement(String namespaceURI,
        String sName, // simple name
        String qName, // qualified name
        Attributes attrs)
   throws SAXException
  {
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
		tempVal = new String(ch,start,length);
  }

  @Override
  public void endElement(String uri, String localName,
		String qName) throws SAXException {
		if(qName.equalsIgnoreCase("published")) {
		    println("waktu:"+tempVal);
		}else if (qName.equalsIgnoreCase("title")) {
		    println("isi:"+tempVal);
		}
  }

Saya menggunakan void println diatas (dengan mengirimkan variabel resp bertipe HttpServletResponse)  karena saya gagal menggunakan log, entah kenapa hasil log-nya tidak keluar. Lagipula sepertinya lebih praktis dengan menampilkannya langsung. Berikut adalah contoh keluarannya (klik untuk memperbesar):

Data tweet ini selanjutnya perlu disimpan dalam datastore sebelum diolah lebih lanjut.

2 Comments »

RSS feed for comments on this post. TrackBack URI

  1. masih kagak mudeng:mrgreen:

  2. Bagus banget pa. Terima kasih untuk infonya


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: