/* * The contents of this file are subject to the Mozilla Public License Version 1.1 * (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at . * * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT * WARRANTY OF ANY KIND, either express or implied. See the License for the specific * language governing rights and limitations under the License. * * The Original Code is the Venice Web Communities System. * * The Initial Developer of the Original Code is Eric J. Bowersox , * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.venice.servlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.log4j.*; import com.silverwrist.venice.ValidationException; import com.silverwrist.venice.core.*; import com.silverwrist.venice.servlets.format.*; public class ConfOperations extends VeniceServlet { /*-------------------------------------------------------------------------------- * Static data members *-------------------------------------------------------------------------------- */ private static Category logger = Category.getInstance(ConfOperations.class.getName()); /*-------------------------------------------------------------------------------- * Internal functions *-------------------------------------------------------------------------------- */ private static SIGContext getSIGParameter(ServletRequest request, UserContext user) throws ValidationException, DataException { String str = request.getParameter("sig"); if (str==null) { // no SIG parameter - bail out now! logger.error("SIG parameter not specified!"); throw new ValidationException("No SIG specified."); } // end if try { // turn the string into a SIGID, and thence to a SIGContext int sigid = Integer.parseInt(str); return user.getSIGContext(sigid); } // end try catch (NumberFormatException nfe) { // error in Integer.parseInt logger.error("Cannot convert SIG parameter '" + str + "'!"); throw new ValidationException("Invalid SIG parameter."); } // end catch } // end getSIGParameter private static ConferenceContext getConferenceParameter(ServletRequest request, SIGContext sig) throws ValidationException, DataException, AccessError { String str = request.getParameter("conf"); if (str==null) { // no conference parameter - bail out now! logger.error("Conference parameter not specified!"); throw new ValidationException("No conference specified."); } // end if try { // turn the string into a ConfID, and thence to a ConferenceContext int confid = Integer.parseInt(str); return sig.getConferenceContext(confid); } // end try catch (NumberFormatException nfe) { // error in Integer.parseInt logger.error("Cannot convert conference parameter '" + str + "'!"); throw new ValidationException("Invalid conference parameter."); } // end catch } // end getConferenceParameter private CreateConferenceDialog makeCreateConferenceDialog() throws ServletException { final String desired_name = "CreateConferenceDialog"; DialogCache cache = DialogCache.getDialogCache(getServletContext()); if (!(cache.isCached(desired_name))) { // create a template and save it off CreateConferenceDialog template = new CreateConferenceDialog(); cache.saveTemplate(template); } // end if // return a new copy return (CreateConferenceDialog)(cache.getNewDialog(desired_name)); } // end makeCreateConferenceDialog private static boolean validateNewTopic(ServletRequest request) throws ValidationException { boolean is_title_null, is_zp_null; String foo = request.getParameter("title"); if (foo==null) throw new ValidationException("Title parameter was not specified."); is_title_null = (foo.length()==0); foo = request.getParameter("pseud"); if (foo==null) throw new ValidationException("Pseud parameter was not specified."); foo = request.getParameter("pb"); if (foo==null) throw new ValidationException("Body text was not specified."); is_zp_null = (foo.length()==0); return is_title_null || is_zp_null; } // end validateNewTopic /*-------------------------------------------------------------------------------- * Overrides from class HttpServlet *-------------------------------------------------------------------------------- */ public String getServletInfo() { String rc = "ConfOperations servlet - General conference operations (list, create, etc.)\n" + "Part of the Venice Web Communities System\n"; return rc; } // end getServletInfo public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UserContext user = getUserContext(request); RenderData rdat = createRenderData(request,response); String page_title = null; Object content = null; SIGContext sig = null; try { // all conference commands require a SIG parameter as well sig = getSIGParameter(request,user); changeMenuSIG(request,sig); } // end try catch (ValidationException ve) { // no SIG specified page_title = "Error"; content = new ErrorBox(null,ve.getMessage(),"top"); } // end catch catch (DataException de) { // error looking up the SIG page_title = "Database Error"; content = new ErrorBox(page_title,"Database error finding SIG: " + de.getMessage(),"top"); } // end catch if (content==null) { // get the command we want to use String cmd = request.getParameter("cmd"); if (cmd==null) cmd = "???"; if (cmd.equals("C")) { // "C" = "Create conference" if (sig.canCreateConference()) { // make the create conference dialog! CreateConferenceDialog dlg = makeCreateConferenceDialog(); dlg.setupDialog(getVeniceEngine(),sig); content = dlg; page_title = dlg.getTitle(); } // end if else { // we can't create conferences page_title = "Error"; content = new ErrorBox("SIG Error","You are not permitted to create conferences in this SIG.","top"); } // end else } // end if else if (cmd.equals("T")) { // "T" = "Create topic" (requires conference parameter) try { // start by getting the conference parameter ConferenceContext conf = getConferenceParameter(request,sig); // create the New Topic form NewTopicForm ntf = new NewTopicForm(sig,conf); ntf.setupNewRequest(); content = ntf; page_title = "Create New Topic"; } // end try catch (ValidationException ve) { // we can't get the conference parameter page_title = "Error"; content = new ErrorBox(null,ve.getMessage(), "sigprofile?sig=" + String.valueOf(sig.getSIGID())); } // end catch catch (AccessError ae) { // we have some sort of access problem page_title = "Access Error"; content = new ErrorBox(page_title,ae.getMessage(), "sigprofile?sig=" + String.valueOf(sig.getSIGID())); } // end catch catch (DataException de) { // some sort of error in the database page_title = "Database Error"; content = new ErrorBox(page_title,"Database error finding conference: " + de.getMessage(), "sigprofile?sig=" + String.valueOf(sig.getSIGID())); } // end catch } // end else else { // any unrecognized command jumps us to "conference list" try { // show the conference listing content = new ConferenceListing(sig); page_title = "Conference Listing: " + sig.getName(); } // end try catch (DataException de) { // something wrong in the database page_title = "Database Error"; content = new ErrorBox(page_title,"Database error finding conferences: " + de.getMessage(), "sigprofile?sig=" + String.valueOf(sig.getSIGID())); } // end catch catch (AccessError ae) { // some lack of access is causing problems page_title = "Access Error"; content = new ErrorBox(page_title,ae.getMessage(), "sigprofile?sig=" + String.valueOf(sig.getSIGID())); } // end catch } // end else } // end if (SIG parameter retrieved OK) BaseJSPData basedat = new BaseJSPData(page_title,"confops?" + request.getQueryString(),content); basedat.transfer(getServletContext(),rdat); } // end doGet public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UserContext user = getUserContext(request); RenderData rdat = createRenderData(request,response); String page_title = null; Object content = null; SIGContext sig = null; String location; try { // all conference commands require a SIG parameter as well sig = getSIGParameter(request,user); changeMenuSIG(request,sig); location = "confops?sig=" + String.valueOf(sig.getSIGID()); } // end try catch (ValidationException ve) { // no SIG specified page_title = "Error"; content = new ErrorBox(null,ve.getMessage(),"top"); location = "top"; } // end catch catch (DataException de) { // error looking up the SIG page_title = "Database Error"; content = new ErrorBox(page_title,"Database error finding SIG: " + de.getMessage(),"top"); location = "top"; } // end catch if (content==null) { // get the command we want to use String cmd = request.getParameter("cmd"); if (cmd==null) cmd = "???"; if (cmd.equals("C")) { // "C" = "Create Conference" if (sig.canCreateConference()) { // load up the create conference dialog! CreateConferenceDialog dlg = makeCreateConferenceDialog(); dlg.setupDialog(getVeniceEngine(),sig); if (dlg.isButtonClicked(request,"cancel")) { // they chickened out - go back to the conference list rdat.redirectTo(location); return; } // end if if (dlg.isButtonClicked(request,"create")) { // OK, they actually want to create the new conference... dlg.loadValues(request); // load the form data try { // attempt to create the conference! ConferenceContext conf = dlg.doDialog(sig); // success! go to the conference's topic list rdat.redirectTo("confdisp?sig=" + String.valueOf(sig.getSIGID()) + "&conf=" + String.valueOf(conf.getConfID())); return; } // end try catch (ValidationException ve) { // validation error - throw it back to the user dlg.resetOnError(ve.getMessage() + " Please try again."); content = dlg; page_title = dlg.getTitle(); } // end catch catch (AccessError ae) { // some sort of access error - display an error dialog page_title = "Access Error"; content = new ErrorBox(page_title,ae.getMessage(),location); } // end catch catch (DataException de) { // database error creating the conference page_title = "Database Error"; content = new ErrorBox(page_title,"Database error creating conference: " + de.getMessage(), location); } // end catch } // end if else { // error - don't know what button was clicked page_title = "Internal Error"; logger.error("no known button click on ConfOperations.doPost, cmd=C"); content = new ErrorBox(page_title,"Unknown command button pressed",location); } // end else } // end if else { // we can't create conferences page_title = "Error"; content = new ErrorBox("SIG Error","You are not permitted to create conferences in this SIG.", location); } // end else } // end if ("C" command) else if (cmd.equals("T")) { // "T" command = Create New Topic (requires conference parameter) ConferenceContext conf = null; try { // start by getting the conference parameter conf = getConferenceParameter(request,sig); } // end try catch (ValidationException ve) { // we can't get the conference parameter page_title = "Error"; content = new ErrorBox(null,ve.getMessage(),location); } // end catch catch (AccessError ae) { // we have some sort of access problem page_title = "Access Error"; content = new ErrorBox(page_title,ae.getMessage(),location); } // end catch catch (DataException de) { // some sort of error in the database page_title = "Database Error"; content = new ErrorBox(page_title,"Database error finding conference: " + de.getMessage(),location); } // end catch if (content==null) { // determine what to do based on the button pressed String on_error = "confdisp?sig=" + String.valueOf(sig.getSIGID()) + "&conf=" + String.valueOf(conf.getConfID()); if (isImageButtonClicked(request,"cancel")) { // the user chickened out - go back to the conference display rdat.redirectTo(on_error); return; } // end if if (isImageButtonClicked(request,"preview")) { // generate a preview and redisplay the form NewTopicForm ntf = new NewTopicForm(sig,conf); try { // do a preview generation ntf.generatePreview(getVeniceEngine(),request); if (ntf.isNullRequest()) { // no title or text specified - this is a "204 No Content" return rdat.nullResponse(); return; } // end if content = ntf; page_title = "Preview New Topic"; } // end try catch (ValidationException ve) { // something messed up in the preview generation page_title = "Error"; content = new ErrorBox(null,ve.getMessage(),on_error); } // end catch } // end if ("preview" button clicked) else if (isImageButtonClicked(request,"post")) { // OK, let's do a post request! try { // first validate that we've got all the parameters if (validateNewTopic(request)) { // this is a null request - send a null response rdat.nullResponse(); return; } // end if // add the new topic! TopicContext topic = conf.addTopic(request.getParameter("title"),request.getParameter("pseud"), request.getParameter("pb")); final String yes = "Y"; if (yes.equals(request.getParameter("attach"))) { // we need to upload an attachment for this post TopicMessageContext msg = topic.getMessage(0); // load the "zero post" content = new AttachmentForm(sig,conf,msg,on_error); page_title = "Upload Attachment"; } // end if else { // the post is complete, we need only jump to the topic // TODO: jump straight to the new topic rdat.redirectTo(on_error); return; } // end else } // end try catch (ValidationException ve) { // the validation of parameters failed page_title = "Error"; content = new ErrorBox(null,ve.getMessage(),on_error); } // end catch catch (DataException de) { // display a database error page_title = "Database Error"; content = new ErrorBox(page_title,"Database error adding topic: " + de.getMessage(),on_error); } // end catch catch (AccessError ae) { // some sort of access problem page_title = "Access Error"; content = new ErrorBox(page_title,ae.getMessage(),on_error); } // end catch } // end else if else { // we don't know what button was pressed page_title = "Internal Error"; logger.error("no known button click on ConfOperations.doPost, cmd=T"); content = new ErrorBox(page_title,"Unknown command button pressed",on_error); } // end else } // end if (we got the conference parameter OK) } // end else if ("T" command) else { // unrecognized command! page_title = "Internal Error"; logger.error("invalid command to ConfOperations.doPost: " + cmd); content = new ErrorBox(page_title,"Invalid command to ConfOperations.doPost",location); } // end else } // end if (SIG parameter retrieved OK) BaseJSPData basedat = new BaseJSPData(page_title,location,content); basedat.transfer(getServletContext(),rdat); } // end doPost } // end class ConfOperations