Hi David & Others,

I'll try to whip it into shape and post it. The code is actually super tiny, it's all the freaking .jar files that are required. Once packaged, it's just gigantic. I'm looking into doing some Ant magic so that the ant script will download the required jars from the actual sites and set them up for you. This actually might be a good thing for other projects (have you read the instructions for compiling Tomcat 4.0?).

One problem I have right now is that I got about half way through adding Users (with logins, logouts, and sign-ups) and then got distracted playing with XDoclet and using Struts again (booh. hiss. :-). Once I get the gear working, I'll post it.

Oh, and when I say simple, I mean S-I-M-P-L-E.

On Monday, January 6, 2003, at 11:45 AM, David Cuthill wrote:

Hi Zed,

I for one, would be interested in perusing the full source to your webapp. In a few weeks I will be starting a new project for which I have already specified components similar to yours: Maverick, Hibernate and some heavy form validation (FormProc?).

Perhaps Jeff and the guys could set up a '3rd party' CVS branch, where submissions such as yours can be published, which enhances the project whilst keeping the core code branch clean and lightweight?

David Cuthill


Zed A. Shaw wrote:
Hi folks,
I've been playing with several different web application frameworks, and decided to spend some time writing up a real simple little threaded discussion board in Maverick. I also managed to write a fairly complete base controller which integrates with FormProc to give you semi-automated form validation. I thought I'd send it to the list to see what people think. I've attached the maverick.xml and the SuperController.java files for people to look at. I also threw in one of the derived controllers to show how it is used. The entire threaded discussion forum is much to large to put in an e-mail, but I may throw it up on a website somewhere if people are interested in it as a learning project.
Anyway, Maverick is really cool. Thanks for the good work. Have you guys thought of hooking up some XDoclet stuff like struts and webwork have done?
---------------------------------------------------------------------- --
package com.zedshaw.mavforum.control;
import com.zedshaw.mavforum.data.*;
import cirrus.hibernate.*;
import org.infohazard.maverick.ctl.*;
import org.infohazard.maverick.flow.*;
import java.util.*;
import org.formproc.*;
import org.formproc.servlet.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
/**
* Description of the Class
*
*@author zedshaw
*@created December 16, 2002
*/
public class ForumList extends SuperController {
/**
* Description of the Method
*
*@param controllerNode Description of the Parameter
*@exception ConfigException Description of the Exception
*/
public void init(org.jdom.Element controllerNode) throws ConfigException {
// we only do this in the ForumController so that it is done once
super.init(controllerNode);
HibernateManager.init();
}
/**
* A logger for printing out messages.
*/
private static Log log = LogFactory.getLog(ForumList.class);
/**
* Constructor for the ForumController object
*/
public ForumList() {
super();
}
/**
* Description of the Method
*
*@param ctx Description of the Parameter
*@param formResult Description of the Parameter
*@param formModel Description of the Parameter
*@return Description of the Return Value
*@exception Exception Description of the Exception
*/
public String perform(ControllerContext ctx, FormResult formResult, Map formModel) throws Exception {
// get the forums and set them up as the model
Session sess = HibernateManager.getSession(ctx);
boolean hasErrorr = false;
// clear out the currentForum
ctx.getRequest().getSession().setAttribute("currentForum", null);
try {
List forums = sess.find("from forums in class Forum");
ctx.setModel(forums);
} catch (Exception e) {
ctx.setParam("errorReason", "Problem listing all the forums.");
e.printStackTrace();
hasErrorr = true;
} finally {
sess.disconnect();
}
return hasErrorr ? ERROR : SUCCESS;
}
}
---------------------------------------------------------------------- --
package com.zedshaw.mavforum.control;
import org.infohazard.maverick.ctl.*;
import org.infohazard.maverick.flow.*;
import java.util.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.MethodUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import org.formproc.*;
import org.formproc.servlet.*;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.jdom.*;
/**
* Description of the Class
*
*@author zedshaw
*@created December 16, 2002
*/
public class SuperController implements ControllerSingleton {
/**
* Common name for the typical "success" view.
*/
public final static String SUCCESS = "success";
/**
* Common name for the typical "error" view.
*/
public final static String ERROR = "error";
/**
* Indicates that there is an error in the form submitted.
*/
public final static String FORM_ERROR = "form_error";
/**
* This is the prefix for the methods, which the ACTION_KEY is appended to
*/
public final static String PERFORM_PREFIX = "perform";
/**
* A logger for printing out messages.
*/
private static Log log = LogFactory.getLog(ControllerSingleton.class);
/**
* The form manager used by this controller to verify forms.
*/
protected FormManager formManager = null;
/**
* The name of the form to use when processing the input.
*/
protected String formName = null;
/**
* Determines whether to use an ExtendedHttpForm or not.
*/
protected boolean isFormExtended = false;
/**
* Determines whether the form errors should be passed through to the
* controller or if an error in the form should be rejected with FORM_ERROR. A
* value of true means to pass the errors on to the controlle, and false means
* to reject.
*/
protected boolean isFormPassed = false;
/**
* Description of the Field
*/
protected boolean hasForm = false;
/**
* Initializes the singleton with the configuration node.
*
*@param controllerNode Description of the Parameter
*@exception ConfigException Description of the Exception
*/
public void init(org.jdom.Element controllerNode) throws ConfigException {
try {
formManager = new FormManager();
} catch (Exception e) {
log.error("Could not start the FormManager to process forms:" + e);
throw new ConfigException(e);
}
// process the <form> tags inside our controller statement
List children = controllerNode.getChildren("form");
Iterator i = children.iterator();
// there should only be one form tag, so we just do one hasNext() check
if (i.hasNext()) {
Element el = (Element) i.next();
log.info("Element: " + el + " " + el.getAttribute("name") + " " + el.getAttribute("extended"));
try {
formName = el.getAttribute("name").getValue();
} catch (Exception e) {
log.error("Could not read name attribute of form");
}
try {
isFormExtended = el.getAttribute("extended").getBooleanValue();
} catch (Exception e) {
// this means that the extended attribute was not set, so we default to isFormExtended=false
}
try {
isFormPassed = el.getAttribute("pass").getBooleanValue();
} catch (Exception e) {
// this means that the attribute was not set, so default to false
}
hasForm = true;
} else {
log.debug("Controller does not have a form, results will be raw request input.");
hasForm = false;
}
}
/**
* Sets up the servlet parameters and calls through to the parameterless
* rawPerform() method. Does not result in bean population.
*
*@param cctx Description of the Parameter
*@return Description of the Return Value
*@exception ServletException Description of the Exception
*@see Controller#perform
*/
public final String go(ControllerContext cctx) throws ServletException {
Map processedModel = null;
FormResult result = null;
String performResult = null;
// figure out if this controller has a form
if (hasForm) {
processedModel = new HashMap();
try {
if (isFormExtended) {
ExtendedHttpForm form = new ExtendedHttpForm(formName, processedModel);
formManager.configure(form);
result = form.process(cctx.getRequest());
} else {
HttpForm form = new HttpForm(formName, processedModel);
formManager.configure(form);
result = form.process(cctx.getRequest());
}
} catch (Exception e) {
log.error("Problem processing form " + formName + " because of: " + e);
return FORM_ERROR;
}
// reject the submission to the FORM_ERROR view if the form is not requested to be passed and
// it is invalid. Otherwise, the goods are just passed on to the perform method.
if (!isFormPassed && !result.isValid()) {
// looks like there were problems
cctx.setModel(result);
return FORM_ERROR;
}
} else {
// since they don't have a form, then we just set the processed model to the parameter map
log.warn("no form specified");
processedModel = cctx.getRequest().getParameterMap();
}
try {
performResult = perform(cctx, result, processedModel);
} catch (Exception e) {
// TODO: add exception handling
e.printStackTrace();
throw new ServletException(e);
}
return performResult;
}
/**
* This is the base perform method which does nothing but return success.
*
*@param ctx Description of the Parameter
*@param formResult Description of the Parameter
*@param formModel Description of the Parameter
*@return Description of the Return Value
*@exception Exception Description of the Exception
*/
public String perform(ControllerContext ctx, FormResult formResult, Map formModel) throws Exception {
log.error("Perform method called in SuperController, which means it wasn't properly overridden.");
return SUCCESS;
}
}
---------------------------------------------------------------------- --
-----
Zed A. Shaw
http://www.zedshaw.com/


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
[INVALID FOOTER]


-----
Zed A. Shaw
http://www.zedshaw.com/



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
[INVALID FOOTER]

Reply via email to