Fall Semester 2002


Lecture Notes Twenty-Seven: Discussion Forum with Java, XSLT, and JDBC.
There's a public folder in my account, and we start from it.

(Note: the notes below are funny, in the sense that

So read them with care and I promise to edit them before the end of October).

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt
burrowww.cs.indiana.edu% 
The database needs to be created and organized, so take a look at this.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/design
burrowww.cs.indiana.edu% ls -l
total 2
-rwxr-xr-x   1 dgerman  faculty      1208 Sep  2  2001 mysql_forum_dump.txt
burrowww.cs.indiana.edu% 
Here's the text of this file:
# MySQL dump 8.8
#
# Host: localhost    Database: forum
#--------------------------------------------------------
# Server version	3.23.23-beta

#
# Table structure for table 'board'
#

CREATE TABLE board (
  id bigint(20) DEFAULT '0' NOT NULL,
  name char(80) DEFAULT '' NOT NULL,
  description char(255) DEFAULT '' NOT NULL,
  PRIMARY KEY (id)
);

#
# Dumping data for table 'board'
#

INSERT INTO board VALUES (0,'XSLT Basics','How to create and use XSLT stylesheets and processors');
INSERT INTO board VALUES (1,'JAXP Programming Techniques','How to use JAXP 1.1');

#
# Table structure for table 'message'
#

CREATE TABLE message (
  id bigint(20) DEFAULT '0' NOT NULL,
  inReplyToID bigint(20) DEFAULT '0' NOT NULL,
  createMonth int(11) DEFAULT '0' NOT NULL,
  createDay int(11) DEFAULT '0' NOT NULL,
  createYear int(11) DEFAULT '0' NOT NULL,
  boardID bigint(20) DEFAULT '0' NOT NULL,
  subject varchar(80) DEFAULT '' NOT NULL,
  authorEmail varchar(80) DEFAULT '' NOT NULL,
  msgText text DEFAULT '' NOT NULL,
  PRIMARY KEY (id),
  KEY inReplyToID (inReplyToID),
  KEY createMonth (createMonth),
  KEY createDay (createDay),
  KEY boardID (boardID)
);
So let's follow these notes to create the database.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/design
burrowww.cs.indiana.edu% mysql -ua348 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 678 to server version: 3.23.27-beta

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql> use a348
Database changed
mysql> show tables like '%dgerman%';
+----------------------------+
| Tables_in_a348 (%dgerman%) |
+----------------------------+
| dgerman_ADMINISTRATORS     |
| dgerman_AUTHORS            |
| dgerman_BOOKS              |
| dgerman_BooksAndAuthors    |
| dgerman_BooksAndSubjects   |
| dgerman_PATRONS            |
| dgerman_ReviewAndRate      |
| dgerman_SUBJECTS           |
| dgerman_TRANSACTIONS       |
| dgerman_Transactions       |
| dgerman_accumulator        |
| dgerman_hangman            |
| dgerman_person             |
| dgerman_php_books          |
| dgerman_php_catboo         |
| dgerman_php_categories     |
| dgerman_student            |
| dgermant_AUTHORS           |
| dgermant_Transactions      |
+----------------------------+
19 rows in set (0.02 sec)

mysql>
It looks like I have plenty of tables, let's remove them all.

mysql> show tables like '%dgerman%';
+----------------------------+
| Tables_in_a348 (%dgerman%) |
+----------------------------+
| dgerman_accumulator        |
| dgerman_hangman            |
| dgerman_php_books          |
| dgerman_php_catboo         |
| dgerman_php_categories     |
+----------------------------+
5 rows in set (0.02 sec)

mysql> 
Let's now define the new ones.

mysql> CREATE TABLE dgerman_board (
    ->   id bigint(20) DEFAULT '0' NOT NULL,
    ->   name char(80) DEFAULT '' NOT NULL, 
    ->   description char(255) DEFAULT '' NOT NULL, 
    ->   PRIMARY KEY (id)
    -> ); 
Query OK, 0 rows affected (0.00 sec)

mysql> describe dgerman_board;
+-------------+------------+------+-----+---------+-------+---------------------------------+
| Field       | Type       | Null | Key | Default | Extra | Privileges                      |
+-------------+------------+------+-----+---------+-------+---------------------------------+
| id          | bigint(20) |      | PRI | 0       |       | select,insert,update,references |
| name        | char(80)   |      |     |         |       | select,insert,update,references |
| description | char(255)  |      |     |         |       | select,insert,update,references |
+-------------+------------+------+-----+---------+-------+---------------------------------+
3 rows in set (0.01 sec)

mysql> INSERT into dgerman_board        
    -> VALUES (0,'XSLT Basics','How to create and use XSLT stylesheets and processors');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT into dgerman_board 
    -> VALUES (1,'JAXP Programming Techniques','How to use JAXP 1.1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from dgerman_board;
+----+-----------------------------+-------------------------------------------------------+
| id | name                        | description                                           |
+----+-----------------------------+-------------------------------------------------------+
|  0 | XSLT Basics                 | How to create and use XSLT stylesheets and processors |
|  1 | JAXP Programming Techniques | How to use JAXP 1.1                                   |
+----+-----------------------------+-------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>

Now we need to create the second table.

mysql> CREATE TABLE dgerman_message (
    ->   id bigint(20) DEFAULT '0' NOT NULL,
    ->   inReplyToID bigint(20) DEFAULT '0' NOT NULL,
    ->   createMonth int(11) DEFAULT '0' NOT NULL, 
    ->   createDay int(11) DEFAULT '0' NOT NULL, 
    ->   createYear int(11) DEFAULT '0' NOT NULL, 
    ->   boardID bigint(20) DEFAULT '0' NOT NULL, 
    ->   subject varchar(80) DEFAULT '' NOT NULL, 
    ->   authorEmail varchar(80) DEFAULT '' NOT NULL, 
    ->   msgText text DEFAULT '' NOT NULL,
    ->   PRIMARY KEY (id), 
    ->   KEY inReplyToID (inReplyToID),  
    ->   KEY createMonth (createMonth), 
    ->   KEY createDay (createDay), 
    ->   KEY boardID (boardID) 
    -> ); 
Query OK, 0 rows affected (0.00 sec)

mysql> describe dgerman_message; 
+-------------+-------------+------+-----+---------+-------+---------------------------------+
| Field       | Type        | Null | Key | Default | Extra | Privileges                      |
+-------------+-------------+------+-----+---------+-------+---------------------------------+
| id          | bigint(20)  |      | PRI | 0       |       | select,insert,update,references |
| inReplyToID | bigint(20)  |      | MUL | 0       |       | select,insert,update,references |
| createMonth | int(11)     |      | MUL | 0       |       | select,insert,update,references |
| createDay   | int(11)     |      | MUL | 0       |       | select,insert,update,references |
| createYear  | int(11)     |      |     | 0       |       | select,insert,update,references |
| boardID     | bigint(20)  |      | MUL | 0       |       | select,insert,update,references |
| subject     | varchar(80) |      |     |         |       | select,insert,update,references |
| authorEmail | varchar(80) |      |     |         |       | select,insert,update,references |
| msgText     | text        |      |     |         |       | select,insert,update,references |
+-------------+-------------+------+-----+---------+-------+---------------------------------+
9 rows in set (0.00 sec)

mysql>
So now we have the (two) tables, one with the kind of data it needs inside, too.

I have a lot of source code to compile, and it's located in

/u/dgerman/public/javaxslt/discussion/source
Let's take a look at it.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% ls -ld *
-rwxr-xr-x   1 dgerman  faculty       533 Aug 14 15:20 BoardSummary.java
-rwxr-xr-x   1 dgerman  faculty      1409 Aug 14 15:21 BoardSummaryImpl.java
-rwxr-xr-x   1 dgerman  faculty      1472 Aug 14 15:23 BoardSummaryJDOM.java
-rwxr-xr-x   1 dgerman  faculty      5607 Aug 14 15:21 DBUtil.java
-rwxr-xr-x   1 dgerman  faculty      2689 Aug 14 15:20 DataAdapter.java
-rwxr-xr-x   1 dgerman  faculty       749 Aug 14 15:20 DataException.java
-rwxr-xr-x   1 dgerman  faculty       941 Aug 14 15:20 DateUtil.java
-rwxr-xr-x   1 dgerman  faculty      1350 Aug 14 15:20 DayMonthYear.java
-rwxr-xr-x   1 dgerman  faculty      1558 Aug 14 15:22 ErrorRenderer.java
-rwxr-xr-x   1 dgerman  faculty      4449 Aug 14 15:21 FakeDataAdapter.java
-rwxr-xr-x   1 dgerman  faculty      1467 Aug 14 15:23 ForumConfig.java
-rwxr-xr-x   1 dgerman  faculty      2393 Aug 14 15:22 ForumServlet.java
-rwxr-xr-x   1 dgerman  faculty       655 Aug 14 15:23 HomeJDOM.java
-rwxr-xr-x   1 dgerman  faculty      1167 Aug 14 15:22 HomeRenderer.java
-rwxr-xr-x   1 dgerman  faculty       640 Aug 14 15:22 HomeReqHandler.java
-rwxr-xr-x   1 dgerman  faculty     11121 Aug 14 15:21 JdbcDataAdapter.java
-rwxr-xr-x   1 dgerman  faculty       229 Aug 14 15:20 Message.java
-rwxr-xr-x   1 dgerman  faculty       693 Aug 14 15:21 MessageImpl.java
-rwxr-xr-x   1 dgerman  faculty       824 Aug 14 15:21 MessageSummary.java
-rwxr-xr-x   1 dgerman  faculty      2052 Aug 14 15:21 MessageSummaryImpl.java
-rwxr-xr-x   1 dgerman  faculty      2767 Aug 14 15:21 MessageTree.java
-rwxr-xr-x   1 dgerman  faculty      2214 Aug 14 15:21 MonthYear.java
-rwxr-xr-x   1 dgerman  faculty      1630 Aug 14 15:23 PostMessageJDOM.java
-rwxr-xr-x   1 dgerman  faculty      3134 Aug 14 15:22 PostMsgRenderer.java
-rwxr-xr-x   1 dgerman  faculty      5717 Aug 14 15:22 PostMsgReqHandler.java
-rwxr-xr-x   1 dgerman  faculty       389 Aug 14 15:22 Renderer.java
-rwxr-xr-x   1 dgerman  faculty       739 Aug 14 15:22 ReqHandler.java
-rwxr-xr-x   1 dgerman  faculty      1495 Aug 14 15:22 ReqHandlerRegistry.java
-rwxr-xr-x   1 dgerman  faculty      1859 Aug 14 15:23 ViewMessageJDOM.java
-rwxr-xr-x   1 dgerman  faculty      2513 Aug 14 15:23 ViewMonthJDOM.java
-rwxr-xr-x   1 dgerman  faculty      1211 Aug 14 15:23 ViewMonthRenderer.java
-rwxr-xr-x   1 dgerman  faculty      1524 Aug 14 15:23 ViewMonthReqHandler.java
-rwxr-xr-x   1 dgerman  faculty      1040 Aug 14 15:23 ViewMsgRenderer.java
-rwxr-xr-x   1 dgerman  faculty      1548 Aug 14 15:23 ViewMsgReqHandler.java
-rwxr-xr-x   1 dgerman  faculty      2558 Aug 14 15:23 XSLTRenderHelper.java
burrowww.cs.indiana.edu% 
Let's now see what we need to do to be able to compile all this code.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/common
burrowww.cs.indiana.edu% ls -l
total 30
-rw-r--r--   1 dgerman  faculty     28168 May 31 20:15 bookUtils.jar
drwxr-xr-x   3 dgerman  faculty       512 May 31 20:14 com
drwxr-xr-x   3 dgerman  faculty       512 Sep  2  2001 src
burrowww.cs.indiana.edu% cp bookUtils.jar ~/public/javaxslt/lib              
burrowww.cs.indiana.edu% cd ~/public/javaxslt/lib 
burrowww.cs.indiana.edu% ls -l
total 1377
-rwxr-xr-x   1 dgerman  faculty       656 Sep  2  2001 README.txt
-rw-r--r--   1 dgerman  faculty     28168 Aug 14 16:00 bookUtils.jar
-rwxr-xr-x   1 dgerman  faculty    187162 Sep  2  2001 crimson_1.1.jar
-rwxr-xr-x   1 dgerman  faculty     28404 Sep  2  2001 jaxp_1.1.jar
-rwxr-xr-x   1 dgerman  faculty     78541 Sep  2  2001 jdom_beta6.jar
-rwxr-xr-x   1 dgerman  faculty    117522 Sep  2  2001 junit_3.7.jar
-rwxr-xr-x   1 dgerman  faculty    109927 Sep  2  2001 mm.mysql-2.0.4-bin.jar
-rwxr-xr-x   1 dgerman  faculty     75849 Sep  2  2001 servlet_2.3.jar
-rwxr-xr-x   1 dgerman  faculty    732330 Sep  2  2001 xalan_2.1.jar
burrowww.cs.indiana.edu% 
After this we jar xvf the archives one by one, clean up and we have:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   3 dgerman  faculty       512 Aug 14 16:01 com
drwxr-xr-x   4 dgerman  faculty       512 Aug 14 16:06 javax
drwxr-xr-x   7 dgerman  faculty       512 Aug 14 16:07 org
burrowww.cs.indiana.edu% 
Now compiling is done in stages.

burrowww.cs.indiana.edu% grep -i "package com.oreilly.forum.domain" *.java
BoardSummary.java:package com.oreilly.forum.domain;
DateUtil.java:package com.oreilly.forum.domain;
DayMonthYear.java:package com.oreilly.forum.domain;
Message.java:package com.oreilly.forum.domain;
MessageImpl.java:package com.oreilly.forum.domain;
MessageSummary.java:package com.oreilly.forum.domain;
MessageSummaryImpl.java:package com.oreilly.forum.domain;
MessageTree.java:package com.oreilly.forum.domain;
MonthYear.java:package com.oreilly.forum.domain;
burrowww.cs.indiana.edu% javac -d . BoardSummary.java \
                                        DateUtil.java \
                                    DayMonthYear.java \
                                         Message.java \
                                     MessageImpl.java \
                                  MessageSummary.java \
                              MessageSummaryImpl.java \
                                     MessageTree.java \
                                       MonthYear.java 
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% 
We need to work out the dependencies. Here's what we have:

  1. com.oreilly.forum and com.oreilly.forum.domain don't need anything
  2. com.oreilly.forum.adapter needs only classes from the packages above
  3. com.oreilly.forum.fakeimpl/xml/jdbcimpl need only packages listed above
  4. com.oreilly.forum.servlet needs classes from the packages listed above
So we compile in four stages.

burrowww.cs.indiana.edu% javac -d . BoardSummary.java \   
                                    DateUtil.java     \
                                    DayMonthYear.java \
                                    Message.java      \
                                    MessageImpl.java  \
                                    MessageSummary.java \
                                    MessageSummaryImpl.java \
                                    MessageTree.java \
                                    MonthYear.java 
burrowww.cs.indiana.edu% 
Turns out this is not needed.

burrowww.cs.indiana.edu% diff JdbcDataAdapter.java JdbcDataAdapter.java~ 
6d5
< import com.oreilly.forum.fakeimpl.*;
burrowww.cs.indiana.edu% 
Turns out things are even more complicated.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% ls -ld ../*
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 ../design
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 ../docroot
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 ../prototype
drwxr-xr-x   3 dgerman  faculty       512 Aug 21 21:39 ../source
drwxr-xr-x   3 dgerman  faculty       512 Sep  2  2001 ../src
-rwxr-xr-x   1 dgerman  faculty      1321 Sep  2  2001 ../web.xml
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 ../xslt
burrowww.cs.indiana.edu%
The source and src directories are identical.

Let's see if we can compile the packages.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% du -a .
3       ./com/oreilly/forum/adapter/DataAdapter.java
1       ./com/oreilly/forum/adapter/DataException.java
5       ./com/oreilly/forum/adapter
1       ./com/oreilly/forum/domain/BoardSummary.java
2       ./com/oreilly/forum/domain/BoardSummaryImpl.java
1       ./com/oreilly/forum/domain/DateUtil.java
2       ./com/oreilly/forum/domain/DayMonthYear.java
1       ./com/oreilly/forum/domain/Message.java
1       ./com/oreilly/forum/domain/MessageImpl.java
1       ./com/oreilly/forum/domain/MessageSummary.java
3       ./com/oreilly/forum/domain/MessageSummaryImpl.java
3       ./com/oreilly/forum/domain/MessageTree.java
3       ./com/oreilly/forum/domain/MonthYear.java
19      ./com/oreilly/forum/domain
2       ./com/oreilly/forum/fakeimpl/BoardSummaryImpl.java
5       ./com/oreilly/forum/fakeimpl/FakeDataAdapter.java
8       ./com/oreilly/forum/fakeimpl
6       ./com/oreilly/forum/jdbcimpl/DBUtil.java
11      ./com/oreilly/forum/jdbcimpl/JdbcDataAdapter.java
18      ./com/oreilly/forum/jdbcimpl
2       ./com/oreilly/forum/servlet/ErrorRenderer.java
3       ./com/oreilly/forum/servlet/ForumServlet.java
2       ./com/oreilly/forum/servlet/HomeRenderer.java
1       ./com/oreilly/forum/servlet/HomeReqHandler.java
4       ./com/oreilly/forum/servlet/PostMsgRenderer.java
6       ./com/oreilly/forum/servlet/PostMsgReqHandler.java
1       ./com/oreilly/forum/servlet/Renderer.java
1       ./com/oreilly/forum/servlet/ReqHandler.java
2       ./com/oreilly/forum/servlet/ReqHandlerRegistry.java
2       ./com/oreilly/forum/servlet/ViewMonthRenderer.java
2       ./com/oreilly/forum/servlet/ViewMonthReqHandler.java
2       ./com/oreilly/forum/servlet/ViewMsgRenderer.java
2       ./com/oreilly/forum/servlet/ViewMsgReqHandler.java
3       ./com/oreilly/forum/servlet/XSLTRenderHelper.java
34      ./com/oreilly/forum/servlet
2       ./com/oreilly/forum/xml/BoardSummaryJDOM.java
1       ./com/oreilly/forum/xml/HomeJDOM.java
2       ./com/oreilly/forum/xml/PostMessageJDOM.java
2       ./com/oreilly/forum/xml/ViewMessageJDOM.java
3       ./com/oreilly/forum/xml/ViewMonthJDOM.java
11      ./com/oreilly/forum/xml
2       ./com/oreilly/forum/ForumConfig.java
98      ./com/oreilly/forum
99      ./com/oreilly
100     ./com
101     .
burrowww.cs.indiana.edu%
We'll be doing this one by one.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/domain/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/adapter/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/fakeimpl/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/xml/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/jdbcimpl/*.java 
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/servlet/*.java
burrowww.cs.indiana.edu% ls -l
total 1
drwxr-xr-x   3 dgerman  faculty       512 Aug 21 21:39 com
Here's the list of files that contain the source code:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% du -a . | grep java
3       ./com/oreilly/forum/adapter/DataAdapter.java
1       ./com/oreilly/forum/adapter/DataException.java
1       ./com/oreilly/forum/domain/BoardSummary.java
2       ./com/oreilly/forum/domain/BoardSummaryImpl.java
1       ./com/oreilly/forum/domain/DateUtil.java
2       ./com/oreilly/forum/domain/DayMonthYear.java
1       ./com/oreilly/forum/domain/Message.java
1       ./com/oreilly/forum/domain/MessageImpl.java
1       ./com/oreilly/forum/domain/MessageSummary.java
3       ./com/oreilly/forum/domain/MessageSummaryImpl.java
3       ./com/oreilly/forum/domain/MessageTree.java
3       ./com/oreilly/forum/domain/MonthYear.java
2       ./com/oreilly/forum/fakeimpl/BoardSummaryImpl.java
5       ./com/oreilly/forum/fakeimpl/FakeDataAdapter.java
6       ./com/oreilly/forum/jdbcimpl/DBUtil.java
11      ./com/oreilly/forum/jdbcimpl/JdbcDataAdapter.java
2       ./com/oreilly/forum/servlet/ErrorRenderer.java
3       ./com/oreilly/forum/servlet/ForumServlet.java
2       ./com/oreilly/forum/servlet/HomeRenderer.java
1       ./com/oreilly/forum/servlet/HomeReqHandler.java
4       ./com/oreilly/forum/servlet/PostMsgRenderer.java
6       ./com/oreilly/forum/servlet/PostMsgReqHandler.java
1       ./com/oreilly/forum/servlet/Renderer.java
1       ./com/oreilly/forum/servlet/ReqHandler.java
2       ./com/oreilly/forum/servlet/ReqHandlerRegistry.java
2       ./com/oreilly/forum/servlet/ViewMonthRenderer.java
2       ./com/oreilly/forum/servlet/ViewMonthReqHandler.java
2       ./com/oreilly/forum/servlet/ViewMsgRenderer.java
2       ./com/oreilly/forum/servlet/ViewMsgReqHandler.java
3       ./com/oreilly/forum/servlet/XSLTRenderHelper.java
2       ./com/oreilly/forum/xml/BoardSummaryJDOM.java
1       ./com/oreilly/forum/xml/HomeJDOM.java
2       ./com/oreilly/forum/xml/PostMessageJDOM.java
2       ./com/oreilly/forum/xml/ViewMessageJDOM.java
3       ./com/oreilly/forum/xml/ViewMonthJDOM.java
2       ./com/oreilly/forum/ForumConfig.java
burrowww.cs.indiana.edu%  
Here's the list of files that contain the compiled classes:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% du -a . | grep .class
2       ./com/oreilly/forum/adapter/DataAdapter.class
1       ./com/oreilly/forum/adapter/DataException.class
1       ./com/oreilly/forum/domain/BoardSummary.class
1       ./com/oreilly/forum/domain/BoardSummaryImpl.class
1       ./com/oreilly/forum/domain/DateUtil.class
2       ./com/oreilly/forum/domain/DayMonthYear.class
2       ./com/oreilly/forum/domain/MonthYear.class
1       ./com/oreilly/forum/domain/Message.class
1       ./com/oreilly/forum/domain/MessageSummary.class
1       ./com/oreilly/forum/domain/MessageImpl.class
2       ./com/oreilly/forum/domain/MessageSummaryImpl.class
2       ./com/oreilly/forum/domain/MessageTree.class
2       ./com/oreilly/forum/fakeimpl/BoardSummaryImpl.class
4       ./com/oreilly/forum/fakeimpl/FakeDataAdapter.class
4       ./com/oreilly/forum/jdbcimpl/DBUtil.class
7       ./com/oreilly/forum/jdbcimpl/JdbcDataAdapter.class
2       ./com/oreilly/forum/servlet/ErrorRenderer.class
1       ./com/oreilly/forum/servlet/Renderer.class
3       ./com/oreilly/forum/servlet/ForumServlet.class
2       ./com/oreilly/forum/servlet/ReqHandlerRegistry.class
1       ./com/oreilly/forum/servlet/ReqHandler.class
2       ./com/oreilly/forum/servlet/HomeRenderer.class
1       ./com/oreilly/forum/servlet/HomeReqHandler.class
3       ./com/oreilly/forum/servlet/PostMsgRenderer.class
4       ./com/oreilly/forum/servlet/PostMsgReqHandler.class
2       ./com/oreilly/forum/servlet/ViewMonthRenderer.class
2       ./com/oreilly/forum/servlet/ViewMonthReqHandler.class
2       ./com/oreilly/forum/servlet/ViewMsgRenderer.class
2       ./com/oreilly/forum/servlet/ViewMsgReqHandler.class
3       ./com/oreilly/forum/servlet/XSLTRenderHelper.class
2       ./com/oreilly/forum/xml/BoardSummaryJDOM.class
1       ./com/oreilly/forum/xml/HomeJDOM.class
2       ./com/oreilly/forum/xml/PostMessageJDOM.class
2       ./com/oreilly/forum/xml/ViewMessageJDOM.class
3       ./com/oreilly/forum/xml/ViewMonthJDOM.class
1       ./com/oreilly/forum/ForumConfig.class
burrowww.cs.indiana.edu% 
They may or may not be one to one.

At least what's good is that we compiled them.

Let's see what else is there.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion/source
burrowww.cs.indiana.edu% ls
com
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% ls 
design  docroot  prototype  source  src  web.xml  xslt
burrowww.cs.indiana.edu% cat web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC 
  "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
        <servlet>
                <servlet-name>forumServlet</servlet-name>
                <servlet-class>com.oreilly.forum.servlet.ForumServlet</servlet-class>
                <init-param>
                        <param-name>jdbcDriverClassName</param-name>
            <param-value>org.gjt.mm.mysql.Driver</param-value>
                        <!-- MySQL version is commented out:
            <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>
                        -->
                </init-param>
                <init-param>
                        <param-name>databaseURL</param-name>
            <param-value>jdbc:mysql://localhost:3306/forum</param-value>
                        <!-- MySQL version is commented out:
            <param-value>jdbc:odbc:forum</param-value>
                        -->
                </init-param>
                <init-param>
                        <param-name>adapterClassName</param-name>
                        <!-- Relational database version is commented out:
            -->
                        <param-value>com.oreilly.forum.jdbcimpl.JdbcDataAdapter</param-value>
            <!--
                        <param-value>com.oreilly.forum.fakeimpl.FakeDataAdapter</param-value>
            -->
                </init-param>
        </servlet>
        <servlet-mapping>
                <servlet-name>forumServlet</servlet-name>
                <url-pattern>/main/*</url-pattern>
        </servlet-mapping>
</web-app>
burrowww.cs.indiana.edu% 
We need to read into what it contains.

So we need to create a context.

Check this out first, though.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion
burrowww.cs.indiana.edu% ls -l
total 8
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 design
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 docroot
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 prototype
drwxr-xr-x   3 dgerman  faculty       512 Aug 21 21:39 source
drwxr-xr-x   3 dgerman  faculty       512 Sep  2  2001 src
-rwxr-xr-x   1 dgerman  faculty      1321 Sep  2  2001 web.xml
drwxr-xr-x   2 dgerman  faculty       512 Sep  2  2001 xslt
burrowww.cs.indiana.edu% ls -ld docroot/*
-rwxr-xr-x   1 dgerman  faculty       763 Sep  2  2001 docroot/forum.css
-rwxr-xr-x   1 dgerman  faculty       361 Sep  2  2001 docroot/index.html
burrowww.cs.indiana.edu% ls -ld xslt/*
-rwxr-xr-x   1 dgerman  faculty      2551 Sep  2  2001 xslt/home.xslt
-rwxr-xr-x   1 dgerman  faculty      5235 Sep  2  2001 xslt/postMsg.xslt
-rwxr-xr-x   1 dgerman  faculty      1807 Sep  2  2001 xslt/utils.xslt
-rwxr-xr-x   1 dgerman  faculty      3897 Sep  2  2001 xslt/viewMonth.xslt
-rwxr-xr-x   1 dgerman  faculty      3268 Sep  2  2001 xslt/viewMsg.xslt
burrowww.cs.indiana.edu% 
We now create the new context (note we have a few degrees of freedom).

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/discussion
burrowww.cs.indiana.edu% cd $CATALINA_HOME/webapps
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu% ls newsgroups
ls: newsgroups: No such file or directory
burrowww.cs.indiana.edu% mkdir newsgroups 
burrowww.cs.indiana.edu% emacs ../conf/server.xml
burrowww.cs.indiana.edu% grep newsgroups ../conf/server.xml
<Context path="/bulletinBoard" docBase="newsgroups" debug="0" reloadable="true" />
burrowww.cs.indiana.edu% 
We re-initialize the server.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 26867 24438  0 23:01:17 pts/4    0:00 grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:01 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 26376     1  0 22:11:00 pts/5    0:11 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 26890 24438  0 23:01:36 pts/4    0:00 grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:01 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% 
Here's the basic requirement:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu% ls -l
total 9
drwxr-xr-x   3 dgerman  faculty       512 Aug  1 10:40 0731
drwxr-xr-x   3 dgerman  faculty       512 Jun 11 00:09 ROOT
drwxr-xr-x   6 dgerman  faculty       512 Jun 11 00:09 examples
drwxr-xr-x   3 dgerman  faculty       512 Jun 11 00:09 manager
drwxr-xr-x   3 dgerman  faculty       512 Aug 21 23:06 newsgroups
drwxr-xr-x   3 dgerman  faculty       512 Aug  8 10:04 one
drwxr-xr-x   2 dgerman  faculty       512 Aug 21 23:08 six
drwxr-xr-x   9 dgerman  faculty       512 Jun 11 00:09 tomcat-docs
drwxr-xr-x   3 dgerman  faculty       512 Jun 11 00:09 webdav
burrowww.cs.indiana.edu% du -a newsgroups
1       newsgroups/WEB-INF/classes
1       newsgroups/WEB-INF/lib
3       newsgroups/WEB-INF
4       newsgroups
burrowww.cs.indiana.edu% grep newsgroups ../conf/server.xml
<Context path="/bulletinBoard" docBase="newsgroups" debug="0" reloadable="true" /> 
burrowww.cs.indiana.edu% 
Step one of bringing things together:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls -ld /u/dgerman/public/javaxslt/discussion/docroot/*
-rwxr-xr-x   1 dgerman  faculty       763 Sep  2  2001 /u/dgerman/public/javaxslt/discussion/docroot/forum.css
-rwxr-xr-x   1 dgerman  faculty       361 Sep  2  2001 /u/dgerman/public/javaxslt/discussion/docroot/index.html
burrowww.cs.indiana.edu% cp /u/dgerman/public/javaxslt/discussion/docroot/* .
burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   4 dgerman  faculty       512 Aug 21 23:06 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       361 Aug 21 23:16 index.html
burrowww.cs.indiana.edu% 
Now check the URL:
http://burrowww.cs.indiana.edu:19200/bulletinBoard
It won't work until we bring in the web.xml provided:

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt/discussion/web.xml
/u/dgerman/public/javaxslt/discussion/web.xml
burrowww.cs.indiana.edu% cp /u/dgerman/public/javaxslt/discussion/web.xml . 
burrowww.cs.indiana.edu% ls -l
total 5
drwxr-xr-x   4 dgerman  faculty       512 Aug 21 23:06 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       361 Aug 21 23:16 index.html
-rwxr-xr-x   1 dgerman  faculty      1321 Aug 21 23:21 web.xml
burrowww.cs.indiana.edu% 
Just the web.xml file without the actual servlets is useless, so we bring those in.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls -l
total 5
drwxr-xr-x   4 dgerman  faculty       512 Aug 21 23:06 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       361 Aug 21 23:16 index.html
-rwxr-xr-x   1 dgerman  faculty      1321 Aug 21 23:21 web.xml
burrowww.cs.indiana.edu% cd WE*
burrowww.cs.indiana.edu% cd classes
burrowww.cs.indiana.edu% ls
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt/discussion/source
com
burrowww.cs.indiana.edu% cp -r /u/dgerman/public/javaxslt/discussion/source/* . 
burrowww.cs.indiana.edu% 
Change forum into bulletinBoard in index.html then look for the main servlet.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls -l
total 4
drwxr-xr-x   4 dgerman  faculty       512 Aug 21 23:06 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       359 Aug 21 23:32 index.html
-rwxr-xr-x   1 dgerman  faculty       794 Aug 21 23:44 web.xml
burrowww.cs.indiana.edu% cat web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC 
   "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
   "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
  <servlet>
    <servlet-name>forumServlet</servlet-name>
    <servlet-class>com.oreilly.forum.servlet.ForumServlet</servlet-class>
    <init-param>
      <param-name>jdbcDriverClassName</param-name>
      <param-value>org.gjt.mm.mysql.Driver</param-value>
    </init-param>
    <init-param>
      <param-name>databaseURL</param-name>
      <param-value>jdbc:mysql://localhost:3306/forum</param-value>
    </init-param>
    <init-param>
      <param-name>adapterClassName</param-name>
      <param-value>com.oreilly.forum.jdbcimpl.JdbcDataAdapter</param-value>
    </init-param>
  </servlet>
</web-app>burrowww.cs.indiana.edu% pico index.html
burrowww.cs.indiana.edu% cat index.html 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <title>Discussion Forum Web Application</title>
        </head>
        <body>
                <p><a href="/bulletinBoard/forumServlet">Launch the discussion forum...</a></p>
        </body>
</html>
burrowww.cs.indiana.edu%
We bring the necessary driver in our path, too:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/lib
burrowww.cs.indiana.edu% ls /u/dgerman/public/mm*
/u/dgerman/public/mm.mysql-2.0.2-bin.jar
burrowww.cs.indiana.edu% cp /u/dgerman/public/mm.mysql-2.0.2-bin.jar . 
burrowww.cs.indiana.edu% ls -l
total 70
-rw-r--r--   1 dgerman  faculty     71328 Aug 21 23:53 mm.mysql-2.0.2-bin.jar
burrowww.cs.indiana.edu% 
A few more (final) changes and double-checks.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 27644 24438  0 23:57:05 pts/4    0:00 grep dgerman
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 27669 24438  0 23:57:31 pts/4    0:00 grep dgerman
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 27655     1  6 23:57:26 pts/4    0:04 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% cat index.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <title>Discussion Forum Web Application</title>
        </head>
        <body>
                <p><a href="/bulletinBoard/forumServlet">Launch the discussion forum...</a></p>
        </body>
</html>
burrowww.cs.indiana.edu% cat web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC 
   "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
   "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
  <servlet>
    <servlet-name>forumServlet</servlet-name>
    <servlet-class>com.oreilly.forum.servlet.ForumServlet</servlet-class>
    <init-param>
      <param-name>jdbcDriverClassName</param-name>
      <param-value>org.gjt.mm.mysql.Driver</param-value>
    </init-param>
    <init-param>
      <param-name>databaseURL</param-name>
      <param-value>jdbc:mysql://localhost/a348</param-value>
    </init-param>
    <init-param>
      <param-name>adapterClassName</param-name>
      <param-value>com.oreilly.forum.jdbcimpl.JdbcDataAdapter</param-value>
    </init-param>
  </servlet>
</web-app>
burrowww.cs.indiana.edu% 
And a few minor ones, some more.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls -l
total 4
drwxr-xr-x   4 dgerman  faculty       512 Aug 21 23:06 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       375 Aug 22 00:02 index.html
-rwxr-xr-x   1 dgerman  faculty       789 Aug 21 23:52 web.xml
burrowww.cs.indiana.edu% pico index.html
burrowww.cs.indiana.edu% cat index.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <title>Discussion Forum Web Application</title>
        </head>
        <body>
                <p><img src="http://www.cs.indiana.edu/classes/a113-dger">
                   <a href="/bulletinBoard/servlet/forumServlet">Launch the discussion forum...</a></p>
        </body>
</html>
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 27998 24438  0 00:03:09 pts/4    0:00 grep dgerman
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 27655     1  0 23:57:26 pts/4    0:12 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 28020 24438  0 00:03:31 pts/4    0:00 grep dgerman
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu%
The problem was that web.xml was not in the right place:
burrowww.cs.indiana.edu% du    
8       ./WEB-INF/classes/com/oreilly/forum/adapter
33      ./WEB-INF/classes/com/oreilly/forum/domain
14      ./WEB-INF/classes/com/oreilly/forum/fakeimpl
29      ./WEB-INF/classes/com/oreilly/forum/jdbcimpl
64      ./WEB-INF/classes/com/oreilly/forum/servlet
21      ./WEB-INF/classes/com/oreilly/forum/xml
173     ./WEB-INF/classes/com/oreilly/forum
174     ./WEB-INF/classes/com/oreilly
175     ./WEB-INF/classes/com
176     ./WEB-INF/classes
71      ./WEB-INF/lib
249     ./WEB-INF
252     .
burrowww.cs.indiana.edu% du -a | grep web.xml 
1       ./WEB-INF/web.xml
burrowww.cs.indiana.edu% cat index.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <title>Discussion Forum Web Application</title>
        </head>
        <body>
                <p><img src="http://www.cs.indiana.edu/classes/a113-dger/left.gif">
                   <a href="/bulletinBoard/servlet/forumServlet">Launch the discussion forum...</a></p>
        </body>
</html>
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 28359 24438  0 00:19:06 pts/4    0:00 grep dgerman
 dgerman 28335     1  0 00:17:40 pts/4    0:12 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 28381 24438  0 00:19:25 pts/4    0:00 grep dgerman
burrowww.cs.indiana.edu%
Now we start and things finally work, to exhibit the first good error:

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
 dgerman 28402 24438  0 00:22:06 pts/4    0:00 grep dgerman
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 28426 24438  0 00:22:23 pts/4    0:00 grep dgerman
 dgerman 28412     1  8 00:22:16 pts/4    0:05 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
 dgerman 24438 24434  0 19:20:42 pts/4    0:02 -csh
 dgerman 26327 26323  0 22:08:30 pts/5    0:00 -csh
burrowww.cs.indiana.edu%
The error is this:
General error: Access denied for user: '@localhost' to database 'a348' 

com.oreilly.forum.adapter.DataException: General error: Access denied for user: '@localhost' to database 'a348'
        at com.oreilly.forum.jdbcimpl.JdbcDataAdapter.getAllBoards(JdbcDataAdapter.java:189)
        at com.oreilly.forum.servlet.HomeRenderer.render(HomeRenderer.java:26)
        at com.oreilly.forum.servlet.ForumServlet.doGet(ForumServlet.java:68)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:450)
        at org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:180)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
        at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
        at java.lang.Thread.run(Thread.java:484)
And you know that something needs to be changed.

burrowww.cs.indiana.edu% ls -l
total 28
-rw-r--r--   1 dgerman  faculty      3554 Aug 21 23:27 DBUtil.class
-rwxr-xr-x   1 dgerman  faculty      5607 Aug 21 23:27 DBUtil.java
-rw-r--r--   1 dgerman  faculty      6672 Aug 21 23:27 JdbcDataAdapter.class
-rwxr-xr-x   1 dgerman  faculty     11121 Aug 21 23:27 JdbcDataAdapter.java
burrowww.cs.indiana.edu% grep DriverManager *.java
DBUtil.java:            return DriverManager.getConnection(dbURL);
burrowww.cs.indiana.edu% pico DBUtil.java
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum/jdbcimpl
burrowww.cs.indiana.edu% grep a348 DB*
DBUtil.java:              "jdbc:mysql://localhost/a348", "a348", "a348AG"
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum/jdbcimpl
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% cd ..  
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/jdbcimpl/*.java
burrowww.cs.indiana.edu% 
Now the error changes:

General error: Table 'a348.Board' doesn't exist 

com.oreilly.forum.adapter.DataException: General error: Table 'a348.Board' doesn't exist
        at com.oreilly.forum.jdbcimpl.JdbcDataAdapter.getAllBoards(JdbcDataAdapter.java:189)
        at com.oreilly.forum.servlet.HomeRenderer.render(HomeRenderer.java:26)
        at com.oreilly.forum.servlet.ForumServlet.doGet(ForumServlet.java:68)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
        at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
        at java.lang.Thread.run(Thread.java:484)
So now we need to bring up to date all the tables' names:
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum
burrowww.cs.indiana.edu% grep " Board " *.java */*.java
jdbcimpl/JdbcDataAdapter.java:                    "SELECT id, name, description FROM Board "
jdbcimpl/JdbcDataAdapter.java:                "SELECT name, description FROM Board WHERE id=" + boardID);
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/jdbcimpl/*.java
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% 
This only happens in two places, and after we compile, we get a new error.

General error: Table 'a348.Message' doesn't exist 

com.oreilly.forum.adapter.DataException: General error: Table 'a348.Message' doesn't exist
        at com.oreilly.forum.jdbcimpl.JdbcDataAdapter.getAllBoards(JdbcDataAdapter.java:189)
        at com.oreilly.forum.servlet.HomeRenderer.render(HomeRenderer.java:26)
        at com.oreilly.forum.servlet.ForumServlet.doGet(ForumServlet.java:68)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
        at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
        at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
        at java.lang.Thread.run(Thread.java:484)
We're getting closer.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% cd com
burrowww.cs.indiana.edu% cd ore*
burrowww.cs.indiana.edu% cd for*
burrowww.cs.indiana.edu% ls
ForumConfig.class  ForumConfig.java  adapter  domain  fakeimpl  jdbcimpl  servlet  xml
burrowww.cs.indiana.edu% grep " Message " *.java */*.java
adapter/DataAdapter.java:    public abstract Message getMessage(long msgID) throws DataException;
adapter/DataAdapter.java:    public abstract Message replyToMessage(long origMsgID, String msgSubject,
adapter/DataAdapter.java:    public abstract Message postNewMessage(long boardID, String msgSubject,
domain/Message.java:public interface Message extends MessageSummary {
domain/MessageImpl.java: * An implementation of the Message interface.
domain/MessageImpl.java:public class MessageImpl extends MessageSummaryImpl implements Message {
fakeimpl/FakeDataAdapter.java:    public Message getMessage(long msgID) throws DataException {
fakeimpl/FakeDataAdapter.java:        Message msg = (Message) this.messageMap.get(new Long(msgID));
fakeimpl/FakeDataAdapter.java:    public Message replyToMessage(long origMsgID, String msgSubject,
fakeimpl/FakeDataAdapter.java:        Message msg = new MessageImpl(msgID, new DayMonthYear(), origMsg.getBoard(),
fakeimpl/FakeDataAdapter.java:    public Message postNewMessage(long boardID, String msgSubject,
fakeimpl/FakeDataAdapter.java:        Message msg = new MessageImpl(msgID, new DayMonthYear(), boardSum,
jdbcimpl/JdbcDataAdapter.java:    public Message getMessage(long msgID) throws DataException {
jdbcimpl/JdbcDataAdapter.java:                    + "FROM Message WHERE id="
jdbcimpl/JdbcDataAdapter.java:    public Message replyToMessage(long origMsgID,
jdbcimpl/JdbcDataAdapter.java:        Message inReplyToMsg = this.getMessage(origMsgID);
jdbcimpl/JdbcDataAdapter.java:    public Message postNewMessage(long boardID, String msgSubject,
jdbcimpl/JdbcDataAdapter.java:                    + "FROM Message WHERE createMonth="
jdbcimpl/JdbcDataAdapter.java:                + "FROM Message "
jdbcimpl/JdbcDataAdapter.java:    private Message insertMessage(BoardSummary board, long inReplyToID,
jdbcimpl/JdbcDataAdapter.java:            stmt = con.prepareStatement("INSERT INTO Message "
servlet/PostMsgReqHandler.java:                Message inResponseToMsg = adapter.getMessage(origMsgID);
servlet/PostMsgReqHandler.java:            Message msg = null;
servlet/ViewMsgRenderer.java:    private Message message;
servlet/ViewMsgReqHandler.java:            Message msg = adapter.getMessage(Long.parseLong(msgIDStr));
xml/ViewMessageJDOM.java: * Generate JDOM for the View Message page.
burrowww.cs.indiana.edu% pico jdbcimpl/JdbcDataAdapter.java 
burrowww.cs.indiana.edu% grep dgerman_message *.java */*.java
jdbcimpl/JdbcDataAdapter.java:                    + "FROM dgerman_message WHERE id="
jdbcimpl/JdbcDataAdapter.java:                    + "FROM dgerman_message WHERE createMonth="
jdbcimpl/JdbcDataAdapter.java:                + "FROM dgerman_message "
jdbcimpl/JdbcDataAdapter.java:            stmt = con.prepareStatement("INSERT INTO dgerman_message "
burrowww.cs.indiana.edu% cd ../../..
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/jdbcimpl/*.java 
burrowww.cs.indiana.edu% 
Now we try again and we get a different error.

First we put the xslt stylesheets where they belong (we forgot that).

burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   4 dgerman  faculty       512 Aug 22 00:17 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 21 23:16 forum.css
-rwxr-xr-x   1 dgerman  faculty       459 Aug 22 00:05 index.html
burrowww.cs.indiana.edu% mkdir xslt
burrowww.cs.indiana.edu% ls 
WEB-INF  forum.css  index.html  xslt
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt/discussion/xslt
home.xslt  postMsg.xslt  utils.xslt  viewMonth.xslt  viewMsg.xslt
burrowww.cs.indiana.edu% cp /u/dgerman/public/javaxslt/discussion/xslt/* xslt
burrowww.cs.indiana.edu% ls xslt
home.xslt  postMsg.xslt  utils.xslt  viewMonth.xslt  viewMsg.xslt
burrowww.cs.indiana.edu%
Sure enough that's not enough.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% echo $CLASSPATH
/u/dgerman/public/javaxslt/lib:.:/u/dgerman/tomcat/jakarta-tomcat-4.0.4/common/lib/servlet.jar
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   3 dgerman  faculty       512 Aug 14 16:01 com
drwxr-xr-x   4 dgerman  faculty       512 Aug 14 16:06 javax
drwxr-xr-x   7 dgerman  faculty       512 Aug 14 16:07 org
burrowww.cs.indiana.edu% cp -r org $CATALINA_HOME/webapps/newsgroups/WE*/lib
burrowww.cs.indiana.edu% quota -v
Disk quotas for dgerman (uid 10867):
Filesystem     usage  quota  limit    timeleft  files  quota  limit    timeleft
/nfs/paca/home/user1
               42108 100000 102400               3287      0      0            
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% du -a . | grep Document
6       ./javax/xml/parsers/DocumentBuilderFactory.class
3       ./javax/xml/parsers/DocumentBuilder.class
2       ./org/apache/crimson/jaxp/DocumentBuilderFactoryImpl.class
4       ./org/apache/crimson/jaxp/DocumentBuilderImpl.class
13      ./org/apache/crimson/tree/XmlDocumentBuilder.class
1       ./org/apache/crimson/tree/XmlDocument$1.class
2       ./org/apache/crimson/tree/XmlDocument$DocFragNode.class
3       ./org/apache/crimson/tree/XmlDocument$EntityRefNode.class
2       ./org/apache/crimson/tree/XmlDocument$ExtWriteContext.class
2       ./org/apache/crimson/tree/XmlDocument$Catalog.class
17      ./org/apache/crimson/tree/XmlDocument.class
1       ./org/apache/crimson/tree/DocumentEx.class
5       ./org/apache/xalan/stree/DocumentImpl.class
1       ./org/apache/xalan/stree/DocumentFragmentImpl.class
3       ./org/apache/xalan/stree/DocumentTypeImpl.class
6       ./org/apache/xalan/templates/FuncDocument.class
2       ./org/apache/xalan/transformer/QueuedStartDocument.class
1       ./org/xml/sax/DocumentHandler.class
2       ./org/w3c/dom/Document.class
1       ./org/w3c/dom/DocumentType.class
1       ./org/w3c/dom/DocumentFragment.class
1       ./org/w3c/dom/range/DocumentRange.class
1       ./org/w3c/dom/traversal/DocumentTraversal.class
8       ./org/jdom/Document.class
burrowww.cs.indiana.edu% 
I made an archive out of javax and placed it in common/lib for Tomcat.

burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   3 dgerman  faculty       512 Aug 14 16:01 com
drwxr-xr-x   4 dgerman  faculty       512 Aug 14 16:06 javax
drwxr-xr-x   7 dgerman  faculty       512 Aug 14 16:07 org
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% jar cvf extra.jar com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/oreilly/(in = 0) (out= 0)(stored 0%)
adding: com/oreilly/javaxslt/(in = 0) (out= 0)(stored 0%)
adding: com/oreilly/javaxslt/swingtrans/(in = 0) (out= 0)(stored 0%)
adding: com/oreilly/javaxslt/swingtrans/ErrorListenerModel.class(in = 4254) (out= 2114)(deflated 50%)
adding: com/oreilly/javaxslt/swingtrans/SwingTransformer$1.class(in = 715) (out= 370)(deflated 48%)
adding: com/oreilly/javaxslt/swingtrans/SwingTransformer$2.class(in = 715) (out= 370)(deflated 48%)
adding: com/oreilly/javaxslt/swingtrans/SwingTransformer$3.class(in = 1235) (out= 638)(deflated 48%)
adding: com/oreilly/javaxslt/swingtrans/SwingTransformer.class(in = 3840) (out= 1809)(deflated 52%)
adding: com/oreilly/javaxslt/swingtrans/XMLFileFilter.class(in = 611) (out= 424)(deflated 30%)
adding: com/oreilly/javaxslt/swingtrans/XSLTFileFilter.class(in = 653) (out= 445)(deflated 31%)
adding: com/oreilly/javaxslt/swingtrans/TransformerWindow$1.class(in = 657) (out= 363)(deflated 44%)
adding: com/oreilly/javaxslt/swingtrans/TransformerWindow$2.class(in = 762) (out= 424)(deflated 44%)
adding: com/oreilly/javaxslt/swingtrans/TransformerWindow.class(in = 5191) (out= 2557)(deflated 50%)
adding: com/oreilly/javaxslt/swingtrans/XMLOutputPanel.class(in = 2062) (out= 1138)(deflated 44%)
adding: com/oreilly/javaxslt/util/(in = 0) (out= 0)(stored 0%)
adding: com/oreilly/javaxslt/util/AbstractXMLReader.class(in = 2469) (out= 1023)(deflated 58%)
adding: com/oreilly/javaxslt/util/BufferedHttpResponseWrapper.class(in = 1847) (out= 847)(deflated 54%)
adding: com/oreilly/javaxslt/util/BufferedServletOutputStream.class(in = 702) (out= 412)(deflated 41%)
adding: com/oreilly/javaxslt/util/CSVXMLReader.class(in = 2974) (out= 1679)(deflated 43%)
adding: com/oreilly/javaxslt/util/DOMUtil.class(in = 2984) (out= 1489)(deflated 50%)
adding: com/oreilly/javaxslt/util/ResultCache$MapKey.class(in = 706) (out= 442)(deflated 37%)
adding: com/oreilly/javaxslt/util/ResultCache$MapValue.class(in = 1365) (out= 703)(deflated 48%)
adding: com/oreilly/javaxslt/util/ResultCache.class(in = 1287) (out= 674)(deflated 47%)
adding: com/oreilly/javaxslt/util/SimpleCSVProcessor.class(in = 2566) (out= 1340)(deflated 47%)
adding: com/oreilly/javaxslt/util/Stopwatch.class(in = 1049) (out= 615)(deflated 41%)
adding: com/oreilly/javaxslt/util/StylesheetCache$MapEntry.class(in = 489) (out= 323)(deflated 33%)
adding: com/oreilly/javaxslt/util/StylesheetCache.class(in = 1687) (out= 850)(deflated 49%)
adding: com/oreilly/javaxslt/util/StylesheetFilter.class(in = 3034) (out= 1515)(deflated 50%)
burrowww.cs.indiana.edu% ls -l
total 31
drwxr-xr-x   3 dgerman  faculty       512 Aug 14 16:01 com
-rw-r--r--   1 dgerman  faculty     28168 Aug 22 01:38 extra.jar
drwxr-xr-x   4 dgerman  faculty       512 Aug 14 16:06 javax
drwxr-xr-x   7 dgerman  faculty       512 Aug 14 16:07 org
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/public/javaxslt/lib
burrowww.cs.indiana.edu% cp extra.jar $CATALINA_HOME/common/lin 
burrowww.cs.indiana.edu% cd $CATALINA_HOME/common 
burrowww.cs.indiana.edu% ls
classes  lib  lin
burrowww.cs.indiana.edu% mv lin lib/extra.jar
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/common
burrowww.cs.indiana.edu% ls lib
abitmore.jar    jdbc2_0-stdext.jar  mail.jar              servlet.jar        xerces.jar
activation.jar  jndi.jar            naming-common.jar     tyrex-0.9.7.0.jar
extra.jar       jta-spec1_0_1.jar   naming-resources.jar  tyrex.license
burrowww.cs.indiana.edu% 
Start and stop the server, as we normally do.

Now the last incongruous thing is that we need xslt inside WEB-INF not above it.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/common/lib
burrowww.cs.indiana.edu% cd $CATALINA_HOME
burrowww.cs.indiana.edu% cd webapps/news*
burrowww.cs.indiana.edu% ls 
WEB-INF  forum.css  index.html  xslt
burrowww.cs.indiana.edu% mv xslt WE*
burrowww.cs.indiana.edu% ls
WEB-INF  forum.css  index.html
burrowww.cs.indiana.edu% ls WE*
classes  lib  web.xml  xslt
burrowww.cs.indiana.edu% 
And that (finally) does it. Well, actually, almost.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups
burrowww.cs.indiana.edu% ls
WEB-INF  forum.css  index.html
burrowww.cs.indiana.edu% cd WE*
burrowww.cs.indiana.edu% ls
classes  lib  web.xml  xslt
burrowww.cs.indiana.edu% cd xslt
burrowww.cs.indiana.edu% ls
home.xslt  postMsg.xslt  utils.xslt  viewMonth.xslt  viewMsg.xslt
burrowww.cs.indiana.edu% grep forum *
home.xslt:                              <link href="{$rootDir}forum.css" 
home.xslt:      ** Output a box for each board in the discussion forum
home.xslt:       "/forum/main/postMsg?mode=postNewMsg&boardID={$boardID}">Post Message</a>
home.xslt:      "/forum/main/viewMonth?boardID={$boardID}&month={@month}&year={@year}">
postMsg.xslt:        <link href="{$rootDir}forum.css"
viewMonth.xslt:                         <link href="{$rootDir}forum.css" 
viewMsg.xslt:                           <link href="{$rootDir}forum.css" 
burrowww.cs.indiana.edu% 
Adjust the resource URLs first.

Then notice that forum.css does not exist.

So here's what we do:

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum
burrowww.cs.indiana.edu% grep rootDir *.java */*.java
servlet/XSLTRenderHelper.java:            trans.setParameter("rootDir", "/forum/");
burrowww.cs.indiana.edu% pico servlet/XSLTRenderHelper.java
burrowww.cs.indiana.edu% grep rootDir *.java */*.java 
servlet/XSLTRenderHelper.java:            trans.setParameter("rootDir", "/bulletinBoard/");
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum
burrowww.cs.indiana.edu% cd ../../../
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/servlet/*.java 
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt
License-ASF.txt   README.txt  chapters  discussion        exampleList.xml   lib
License-JDOM.txt  build.xml   common    exampleList.html  exampleList.xslt
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt/discussion
design  docroot  prototype  source  src  web.xml  xslt
burrowww.cs.indiana.edu% ls /u/dgerman/public/javaxslt/discussion/docroot
forum.css  index.html
burrowww.cs.indiana.edu% cp /u/dgerman/public/javaxslt/discussion/docroot/forum.css .
burrowww.cs.indiana.edu% ls -l
total 3
drwxr-xr-x   5 dgerman  faculty       512 Aug 22 01:43 WEB-INF
-rwxr-xr-x   1 dgerman  faculty       763 Aug 22 01:51 forum.css
-rwxr-xr-x   1 dgerman  faculty       459 Aug 22 00:05 index.html
burrowww.cs.indiana.edu% 
But that was wrong.

Here's the problem:

burrowww.cs.indiana.edu% cd /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum
burrowww.cs.indiana.edu% pico pico servlet/XSLTRenderHelper.java^C
burrowww.cs.indiana.edu% pico servlet/XSLTRenderHelper.java
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum
burrowww.cs.indiana.edu% cd ../../..
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/servlet/*.java 
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk

burrowww.cs.indiana.edu% burrowww.cs.indiana.edu% 
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% 
And it finally works. No kidding.

Actually not.

Still one more small minor thing to do:

burrowww.cs.indiana.edu% cp /u/dgerman/public/javaxslt/discussion/xslt/* . 
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/xslt
burrowww.cs.indiana.edu% 
Does this help?

If we make the following changes:

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/xslt
burrowww.cs.indiana.edu% cd ..
burrowww.cs.indiana.edu% pico web.xml
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF
burrowww.cs.indiana.edu% cd ../..
burrowww.cs.indiana.edu% mv newsgroups forum^C
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% $CATALINA_HOME/binstartup.sh
/u/dgerman/tomcat/jakarta-tomcat-4.0.4/binstartup.sh: Command not found
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu%
That's not all.

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps
burrowww.cs.indiana.edu% cd newsgroups
burrowww.cs.indiana.edu% ls
WEB-INF  forum.css  index.html
burrowww.cs.indiana.edu% cd WE*
burrowww.cs.indiana.edu% ls
classes  lib  web.xml  xslt
burrowww.cs.indiana.edu% cd xslt
burrowww.cs.indiana.edu% ls
home.xslt  postMsg.xslt  utils.xslt  viewMonth.xslt  viewMsg.xslt
burrowww.cs.indiana.edu% grep forum *
home.xslt:                              <link href="{$rootDir}forum.css" 
home.xslt:      ** Output a box for each board in the discussion forum
home.xslt:       "/forum/main/postMsg?mode=postNewMsg&boardID={$boardID}">Post Message</a>
home.xslt:      "/forum/main/viewMonth?boardID={$boardID}&month={@month}&year={@year}">
postMsg.xslt:        <link href="{$rootDir}forum.css"
viewMonth.xslt:                         <link href="{$rootDir}forum.css" 
viewMsg.xslt:                           <link href="{$rootDir}forum.css" 
burrowww.cs.indiana.edu% emacs home.xslt
burrowww.cs.indiana.edu% diff home.xslt home.xslt~
54c54
<        "/bulletinBoard/main/postMsg?mode=postNewMsg&boardID={$boardID}">Post Message</a>
---
>        "/forum/main/postMsg?mode=postNewMsg&boardID={$boardID}">Post Message</a>
62c62
<       "/bulletinBoard/main/viewMonth?boardID={$boardID}&month={@month}&year={@year}">
---
>       "/forum/main/viewMonth?boardID={$boardID}&month={@month}&year={@year}">
burrowww.cs.indiana.edu% 
But now watch out, because we need to update the post message servlets too.

jdbcimpl/JdbcDataAdapter.java:            long newMsgID = DBUtil.getNextID("Message", con);
Change and compile:
jdbcimpl/JdbcDataAdapter.java:        return monthsWithMessages;
jdbcimpl/JdbcDataAdapter.java:    private Message insertMessage(BoardSummary board, long inReplyToID,
jdbcimpl/JdbcDataAdapter.java:            long newMsgID = DBUtil.getNextID("Message", con);
jdbcimpl/JdbcDataAdapter.java:            return new MessageImpl(newMsgID, createDate,
burrowww.cs.indiana.edu% cd jdbcimpl  
burrowww.cs.indiana.edu% pico JdbcDataAdapter.java
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes/com/oreilly/forum/jdbcimpl
burrowww.cs.indiana.edu% cd ../../../..
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/webapps/newsgroups/WEB-INF/classes
burrowww.cs.indiana.edu% ls
com
burrowww.cs.indiana.edu% javac -d . com/oreilly/forum/jdbcimpl/*.java
burrowww.cs.indiana.edu% 
Finished.

(What did you expect?)

But the difficult part only now starts.

The question is this (now that it finally works):

Why does it work?
(And that's for you to find out, of course.)


Last updated: Aug 31, 2002 by Adrian German for A348/A548