Finally got a useful action map coded. Before, the controller was just simply printing Strings. Now, Classes are being instantiated from a Properties file and the Action interface is working as it should. The latest version of the Controller is posted.
You can see that I have a default Action set up too. If for unknown reasons, a user finds themselves in a place the Controller can’t handle, the default Action kicks in. This could be caused by a user mistype or by a dead link.
package net.fuzzylemon.acronym ;
/**
* @file Controller.java
* @Author chris
* @date Dec 8, 2002
* @time 3:45:18 PM
*
* Scope:
* - handles common tasks like authentication
* - examines the requests from the user
* - invokes JavaBeans
* - controls error handling
* - controls module flow
*/
import java.io.IOException ;
import java.io.InputStream ;
import java.io.PrintWriter ;
import java.util.Properties ;
import javax.servlet.ServletConfig ;
import javax.servlet.ServletContext ;
import javax.servlet.ServletException ;
import javax.servlet.http.HttpServlet ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpSession ;
import net.fuzzylemon.acronym.action.Action ;
import net.fuzzylemon.util.UrlParser ;
public class Controller extends HttpServlet {
private Properties actionMap = new Properties ();
private Action action = null ;
public void doGet ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
doPost ( req , res );
}
public void doPost ( HttpServletRequest req , HttpServletResponse res )
throws ServletException , IOException {
PrintWriter out = res . getWriter ();
HttpSession session = req . getSession ();
String pathInfo = UrlParser . stripLeadingCharacter ( req . getPathInfo ());
res . setContentType ( "text/plain" );
out . println ( "action was: " + session . getAttribute ( "action" ));
// if no matching action is found, set action to be default
try {
action = setAction ( pathInfo );
session . setAttribute ( "action" , actionMap . getProperty ( pathInfo ));
action . perform ( this , req , res );
} catch ( NullPointerException ne ) {
action = setAction ( "default" );
session . setAttribute ( "action" , actionMap . getProperty ( "default" ));
action . perform ( this , req , res );
}
out . println ( "session ID: " + session . getId ());
out . println ( "action is: " + session . getAttribute ( "action" ));
}
public void init () {
try {
ServletConfig config = getServletConfig ();
ServletContext context = config . getServletContext ();
String actionMapFile = config . getInitParameter ( "actionMapFile" );
System . out . println ( "actionMapFile is " + actionMapFile );
//load file from jar file
InputStream in = context . getResourceAsStream ( actionMapFile );
actionMap . load ( in );
in . close ();
} catch ( IOException e ) {
log ( "cannot open action map." );
e . printStackTrace ();
} catch ( NullPointerException ne ) {
log ( "null action map!" );
ne . printStackTrace ();
}
}
private Action setAction ( String string )
throws NullPointerException {
Action action = null ;
try {
action = ( Action ) Class . forName ( actionMap . getProperty ( string )). newInstance ();
} catch ( InstantiationException e ) {
log ( e . getMessage ());
} catch ( IllegalAccessException e ) {
log ( e . getMessage ());
} catch ( ClassNotFoundException e ) {
log ( "ClassNotFoundException in " + this . getClass (). toString ());
log ( e . getMessage ());
}
return action ;
}
}