* mahazuga: Mary Ann
* serepate: Serena
  hgarciah: Henri
* balbakr: Bakr
* ruifan: Rui
* mzelenin: Matthew
* jnp2: Jay
* zeyang: Zejun
* zhang486: Jingyun
* yiwecao: Yiwei
* rthammon: Ryan
* wang686: Jiaxing
* dweissma: Andrew
* kevcao: Kevin
* ssalmero: Salmeron, Santiago (TA)
* luo23: Yawen
* runxzhao: Runxia
* dgerman: German, Dan-Adrian (Primary Instructor)
  creba: Chris

login as: dgerman
dgerman@silo.cs.indiana.edu's password:
Last login: Tue Jul 17 14:27:33 2018 from 156-56-142-202.dhcp-bl.indiana.edu


******************************************************************************
**   Indiana University School of Informatics, Computing, and Engineering   **
**                    ** For Authorized Use Only **                         **
******************************************************************************
**  For general SICE computing information, please see:                     **
**      http://help.sice.indiana.edu/                                       **
**                                                                          **
**  To submit a problem report or question, please see:                     **
**      http://help.sice.indiana.edu/request                                **
******************************************************************************


-bash-4.2$ cd c212-workspace/
-bash-4.2$ ls
apache-tomcat-7.0.35  exercises  JUNIT
-bash-4.2$ cat .setup
JAVA_HOME=/usr/lib/jvm/java-1.7.0
export JAVA_HOME

CATALINA_HOME=/u/dgerman/c212-workspace/apache-tomcat-7.0.35
export CATALINA_HOME

JUNIT_HOME=~/c212-workspace/JUNIT
export JUNIT_HOME

CLASSPATH=.:$CATALINA_HOME/lib/servlet-api.jar:$JUNIT_HOME/junit-4.10.jar
export CLASSPATH
-bash-4.2$ source .setup
-bash-4.2$ cd $CATALINA_HOME
-bash-4.2$ cd webapps/
-bash-4.2$ cd stageTwo/
-bash-4.2$ tree .
.
├── index.html
├── permanent
│   └── inventory.txt
└── WEB-INF
    ├── classes
    ├── lib
    └── src

5 directories, 2 files
-bash-4.2$

Now I follow this: 

https://www.cs.indiana.edu/classes/c212/fall2017/project.html (only big picture)

So I first put some meaningful information in inventory.txt

-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo
-bash-4.2$ ls
index.html  permanent  WEB-INF
-bash-4.2$ cd permanent/
-bash-4.2$ ls
inventory.txt
-bash-4.2$ cat inventory.txt
-bash-4.2$ nano -w inventory.txt
-bash-4.2$ cat inventory.txt
Do something
Do it again
Stop doing that
Wake up
-bash-4.2$

Now I should create a database out of this. 

-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent
-bash-4.2$ cd ..
-bash-4.2$ ls
index.html  permanent  WEB-INF
-bash-4.2$ cd WEB-INF/
-bash-4.2$ ls
classes  lib  src
-bash-4.2$ cd src/
-bash-4.2$ ls
-bash-4.2$ nano -w Four.java
-bash-4.2$ nano -w Task.java
-bash-4.2$ ls -l
total 8
-rw-r--r-- 1 dgerman faculty 566 Jul 17 14:40 Four.java
-rw-r--r-- 1 dgerman faculty 646 Jul 17 14:40 Task.java
-bash-4.2$ cat Four.java
package rctmpx;

import java.io.*;
import java.util.*;

public class Four {
  public static void main(String[] args) throws Exception {

    Scanner a = new Scanner(new File(args[0]));

    Integer id = 0;

    Map<Integer, Task> b = new HashMap<Integer, Task>();
    while (a.hasNextLine()) {
      Task c = new Task( id, a.nextLine() );
      b.put(id++, c);
    }
    System.out.println( b );

    FileOutputStream fout = new FileOutputStream("../../permanent/database");
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(b);


  }
}
-bash-4.2$ cat Task.java
package rctmpx;

public class Task implements java.io.Serializable {
  private Integer id;
  private String task;
  public Task(Integer id, String task) {
    this.id = id;
    this.task = task;
  }
  public String toString() {
    return "(" + this.id + ": [" + this.task + "])";
  }
  public Integer id() { return this.id; }
  public String task() { return this.task; }
  public static void main(String[] args) {
    Task a = new Task(1, "Go to Chicago.");
    Task b = new Task(2, "Come back from Chicago");
    System.out.println( a );
    System.out.println( b );
    System.out.println( b.task() );
    System.out.println( a.id() );

  }
}
-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/src
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   └── inventory.txt
└── WEB-INF
    ├── classes
    ├── lib
    └── src
        ├── Four.java
        └── Task.java

5 directories, 4 files
-bash-4.2$ $JAVA_HOME/bin/javac -d ../classes *.java
Picked up _JAVA_OPTIONS: -Xms512m -Xmx512m
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   └── inventory.txt
└── WEB-INF
    ├── classes
    │   └── rctmpx
    │       ├── Four.class
    │       └── Task.class
    ├── lib
    └── src
        ├── Four.java
        └── Task.java

6 directories, 6 files
-bash-4.2$ cd ../classes/
-bash-4.2$ $JAVA_HOME/bin/java rctmpx.Four ../../permanent/inventory.txt
Picked up _JAVA_OPTIONS: -Xms512m -Xmx512m
{0=(0: [Seneca]), 1=(1: [Time discovers truth.]), 2=(2: [Steven Wright]), 3=(3: [How do you know when you're out of invisble ink?]), 4=(4: [Marilyn Monroe]), 5=(5: [It's not true I had nothing on. I had the radio on.]), 6=(6: [Thomas Neil]), 7=(7: [Of those who say nothing few are silent.]), 8=(8: [Oscar Wilde]), 9=(9: [The only way to get rid of temptation is to yield to it.]), 10=(10: [Donald J Trump]), 11=(11: [Who is General Failure and why is he reading my hard disk?]), 12=(12: [Steven Wright]), 13=(13: [I almost had a psychic girlfriend but she left me before we met.])}
-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/classes
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   ├── database
│   └── inventory.txt
└── WEB-INF
    ├── classes
    │   └── rctmpx
    │       ├── Four.class
    │       └── Task.class
    ├── lib
    └── src
        ├── Four.java
        └── Task.java

6 directories, 7 files
-bash-4.2$ file ../../permanent/database
../../permanent/database: Java serialization data, version 5
-bash-4.2$ file ../../permanent/inventory.txt
../../permanent/inventory.txt: ASCII text
-bash-4.2$

The database is there now. 

Now I need a model and a controller for it and that's it. 

-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/classes
-bash-4.2$ cd ../src/
-bash-4.2$ ls -l
total 8
-rw-r--r-- 1 dgerman faculty 566 Jul 17 14:40 Four.java
-rw-r--r-- 1 dgerman faculty 646 Jul 17 14:40 Task.java
-bash-4.2$ nano -w Model.java
-bash-4.2$ cat Model.java
package rctmpx;

import java.io.*;
import java.util.*;

public class Model {
  private Model() {
    try {
      this.reset(); // load from database
    } catch (Exception e) {

    }
  }
  private static Model instance = new Model(); // at compile time, singleton
  public static Model getInstance() {
    return instance;
  }
  Integer nextAvailableId = 0;
  Map<Integer, Task> a;
  String pathToDatabase = "/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database";
                      // your username the folder                             and here name of the context
  synchronized void reset() throws Exception {
    FileInputStream fis = new FileInputStream(pathToDatabase);
    ObjectInputStream ois = new ObjectInputStream(fis);
    this.a = (HashMap<Integer, Task>) ois.readObject();
    ois.close();
    this.nextAvailableId = (this.a.keySet()).size();
  }
  Task retrieveTask(Integer id) {
    return a.get(id);
  }
  ArrayList<Task> retrieveAll() {
    ArrayList<Task> a = new ArrayList<Task>();
    for (Integer key : this.a.keySet()) {
      a.add(this.a.get(key));
    }
    return a;
  }
  synchronized void delete(Integer id) {
    this.a.remove(id);
  }
  synchronized void addTask(String task) {
    Integer id = nextAvailableId++;
    this.a.put(id, new Task(id, task));
  }
  synchronized void save() throws Exception {
    FileOutputStream fout = new FileOutputStream(pathToDatabase);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(this.a);
  }
}
-bash-4.2$ grep database Model.java
      this.reset(); // load from database
  String pathToDatabase = "/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database";
-bash-4.2$ ls /u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database
-bash-4.2$ ls -l /u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database
-rw-r--r-- 1 dgerman faculty 982 Jul 17 14:43 /u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/permanent/database
-bash-4.2$

This is the model. It needs to be compiled. 

Let's the controller then compile them together. 

-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/src
-bash-4.2$ nano -w Test.java
-bash-4.2$ ls -l
total 16
-rw-r--r-- 1 dgerman faculty  566 Jul 17 14:40 Four.java
-rw-r--r-- 1 dgerman faculty 1533 Jul 17 14:47 Model.java
-rw-r--r-- 1 dgerman faculty  646 Jul 17 14:40 Task.java
-rw-r--r-- 1 dgerman faculty 1252 Jul 17 14:50 Test.java
-bash-4.2$ $JAVA_HOME/bin/javac -d ../classes *.java
Picked up _JAVA_OPTIONS: -Xms512m -Xmx512m
Note: Model.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   ├── database
│   └── inventory.txt
└── WEB-INF
    ├── classes
    │   └── rctmpx
    │       ├── Four.class
    │       ├── Model.class
    │       ├── Task.class
    │       └── Test.class
    ├── lib
    └── src
        ├── Four.java
        ├── Model.java
        ├── Task.java
        └── Test.java

6 directories, 11 files
-bash-4.2$ cat Test.java
package rctmpx;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class Test extends HttpServlet {

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

    // Get (and keep!) a reference to the shared Model instance
    Model model = Model.getInstance();

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    String input = request.getParameter("input");

    if ("list".equals(input)) {
      out.println( model.retrieveAll() );
    } else if ("delete".equals(input)) {
      String what = request.getParameter("number");
      model.delete(Integer.parseInt(what));
      out.println( model.retrieveAll() );
    } else if ("add".equals(input)) {
      String what = request.getParameter("task");
      model.addTask(what);
      out.println( model.retrieveAll() );
    } else {
      out.println("<ul> <li> <code>?input=list</code> ");
      out.println(    " <li> <code>?input=delete&number=\\d+</code>");
      out.println(    " <li> <code>?input=add&task=(\\w+\\s+)+</code>");
      out.println("</ul>");
    }
  }
}
-bash-4.2$

Now we'd be completely ready if not for a minor deployment issue. 

 bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/src
-bash-4.2$ ls -l
total 16
-rw-r--r-- 1 dgerman faculty  566 Jul 17 14:40 Four.java
-rw-r--r-- 1 dgerman faculty 1533 Jul 17 14:47 Model.java
-rw-r--r-- 1 dgerman faculty  646 Jul 17 14:40 Task.java
-rw-r--r-- 1 dgerman faculty 1252 Jul 17 14:50 Test.java
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   ├── database
│   └── inventory.txt
└── WEB-INF
    ├── classes
    │   └── rctmpx
    │       ├── Four.class
    │       ├── Model.class
    │       ├── Task.class
    │       └── Test.class
    ├── lib
    └── src
        ├── Four.java
        ├── Model.java
        ├── Task.java
        └── Test.java

6 directories, 11 files
-bash-4.2$ nano -w ../web.xml
-bash-4.2$ tree ../..
../..
├── index.html
├── permanent
│   ├── database
│   └── inventory.txt
└── WEB-INF
    ├── classes
    │   └── rctmpx
    │       ├── Four.class
    │       ├── Model.class
    │       ├── Task.class
    │       └── Test.class
    ├── lib
    ├── src
    │   ├── Four.java
    │   ├── Model.java
    │   ├── Task.java
    │   └── Test.java
    └── web.xml

6 directories, 12 files
-bash-4.2$ cat ../web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>something</servlet-name>
    <servlet-class>rctmpx.Test</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>something</servlet-name>
    <url-pattern>/any/thing</url-pattern>
  </servlet-mapping>
</web-app>
-bash-4.2$

Now I should call the servlet and talk to it. 

-bash-4.2$ pwd
/u/dgerman/c212-workspace/apache-tomcat-7.0.35/webapps/stageTwo/WEB-INF/src
-bash-4.2$ cd $CATALINA_HOME
-bash-4.2$ cd webapps/
-bash-4.2$ cd ROOT/
-bash-4.2$ nano -w index.html
-bash-4.2$ cat index.html
Hi my name is Adrian and I like GSPs. <p>

<img src="http://andersoncreekhunting.com/wp-content/uploads/2015/09/DocGSP-NC-003-150x150.jpg"> <p>

Here's a link to my <a href="index.jsp"><code>index.jsp</code></a>. <p>

Here's my <a href="/stageTwo/any/thing">Stage Two</a>. <p>
-bash-4.2$