package ddj;

import java.util.Enumeration;
import java.util.Hashtable;
import javax.servlet.http.*;

public class Articles {

  private String month;
  private Hashtable articleMap = initArticles();

  private static Hashtable initArticles() {
    Hashtable ht = new Hashtable();
    ht.put("January", new String[][] {
      {"Automating The Web With WEBL",
        "Hannes Marais and Tom Rodeheffer"},
      {"Little Languages With LEX, YACC, and MFC",
        "Jason Shankel"},
      {"Full-Text Searching in Perl",
        "Tim Kientzle"},
      {"Extending JScript",
        "Paul Butcher"},
      {"Parsing Expressions in Java",
        "Cliff Berg"},
      {"PersonalJava & Information Appliances, Part I",
        "Jaison Dolvane and Kumanan Yogaratnam"},
      {"Ficl: An Embeddable Extension Language Interpreter",
        "John Sadler"},
      {"Dynamically Reconfigurable Servers",
        "Ron Klatchko"},
      {"Scripts For Windows Scripting Host",
        "John Goalby"},
      {"Matlab As A Scripting Language",
        "Peter Webb and Gregory V. Wilson"},
      {"Programming Paradigms",
        "Michael Swaine"},
      {"C Programming",
        "Al Stevens"},
      {"Java Q&A",
        "Kenneth Hittleman and Ted Leung"},
      {"Algorithm Alley",
        "Sasha Gontmakher and Ilan Horn"},
      {"Dr. Ecco's Omniheuristic Corner",
        "Dennis E. Shasha"},
      {"Programmer's Bookshelf",
        "Paul Lu and William Stallings"},
      {"Editorial",
        "Jonathan Erickson"},
      {"Of Interest",
        "Eugene Eric Kim"},
      {"Swaine's Flames",
        "Michael Swaine"}
      }); 
    ht.put("February", new String[][] {
      {"Java And Lightweight Components",
        "David K. Perelman-Hall"},
      {"A Java Applet Search Engine",
        "Tim Kientzle"},
      {"The Java 2D API",
        "Bill Loeb"},
      {"Writing JavaBean Property Editors",
        "Morgan Kinne"},
      {"PersonalJava And Information Appliances, Part II",
        "Jaison Dolvane and Kumanan Yogaratnam"},
      {"Jperl: Accessing Perl From Java",
        "S. Balamurugan"},
      {"Java Card Application Development",
        "Darryl Barnes"},
      {"Creating Signed, Persistent Java Applets",
        "Paul Brigner"},
      {"Comparing WFC And JFC",
        "David M. Johnson"},
      {"Design By Interface",
        "Robb Schecter"},
      {"Programming Paradigms",
        "Michael Swaine"},
      {"C Programming",
        "Al Stevens"},
      {"Java Q&A",
        "Dave Angel and Andy Wilson"},
      {"Algorithm Alley",
        "Andrew Colin"},
      {"Dr. Ecco's Omniheuristic Corner",
        "Dennis E. Shasha"},
      {"Programmer's Bookshelf",
        "Gregory V. Wilson"},
      {"Editorial",
        "Jonathan Erickson"},
      {"Of Interest",
        "Eugene Eric Kim"},
      {"Swaine's Flames",
        "Michael Swaine"}
      }); 
    ht.put("March", new String[][] {
      {"Simulating Severe Weather",
        "Louis J. Wicker"},
      {"Hierarchical Logic Simulation",
        "Donald C. Craig"},
      {"The Java Provider Architecture",
        "Paul Tremblett"},
      {"WOOKIE: A 68HC11 Emulator",
        "Kalle Anderson, Jason Buttron, Paul Clarke, and Matt Enwald"},
      {"The Windows CE Emulator",
        "Aspi Havewala"},
      {"Low-Level APIs For Embedded Systems",
        "Tom Cunningham and Chad Peckham"},
      {"Understanding LDAP",
        "Basit Hussain"},
      {"Compiler Construction With ANTLR And Java",
        "Gary L. Schaps"},
      {"Controlling Motion-Tracking Devices",
        "Mike Harrington"},
      {"Programming Paradigms",
        "Michael Swaine"},
      {"C Programming",
        "Al Stevens"},
      {"Java Q&A",
        "Andrew Wilson"},
      {"Algorithm Alley",
        "Tim Kientzle"},
      {"Dr. Ecco's Omniheuristic Corner",
        "Dennis E. Shasha"},
      {"Programmer's Bookshelf",
        "Jonathan Amsterdam"},
      {"Editorial",
        "Jonathan Erickson"},
      {"Of Interest",
        "Eugene Eric Kim"},
      {"Swaine's Flames",
        "Michael Swaine"}
      }); 
    return ht;
  }

  public void processRequest(HttpServletRequest request) 
      throws Exception {
    if (request.getParameter("month") == null)
      throw new Exception("no month was specified");
    setMonth(request.getParameter("month"));
  }

  public void setMonth(String month) {
    this.month = month;
  }

  public String getMonth() {
    return month;
  }

  public String[][] getArticles(String month) {
    if (!articleMap.containsKey(month))
      return new String[0][0];
    return (String[][])articleMap.get(month);
  }

  public String[] getAvailableMonths() {
    String[] sa = new String[articleMap.size()];
    int i = 0;
    for (Enumeration e = articleMap.keys(); e.hasMoreElements();) {
      sa[i++] = (String)e.nextElement();
    }
    return sa;
  }
}
