/*
* 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 CommunityOperations extends VeniceServlet
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static final String UNJOIN_CONFIRM_ATTR = "servlets.CommunityOperations.unjoin.confirm";
private static final String UNJOIN_CONFIRM_PARAM = "confirm";
private static Category logger = Category.getInstance(CommunityOperations.class);
/*--------------------------------------------------------------------------------
* Internal functions
*--------------------------------------------------------------------------------
*/
private JoinKeyDialog makeJoinKeyDialog()
{
final String desired_name = "JoinKeyDialog";
DialogCache cache = DialogCache.getDialogCache(getServletContext());
if (!(cache.isCached(desired_name)))
{ // create a template and save it off
JoinKeyDialog template = new JoinKeyDialog();
cache.saveTemplate(template);
} // end if
// return a new copy
return (JoinKeyDialog)(cache.getNewDialog(desired_name));
} // end makeJoinKeyDialog
private CreateCommunityDialog makeCreateCommunityDialog() throws ServletException
{
final String desired_name = "CreateCommunityDialog";
DialogCache cache = DialogCache.getDialogCache(getServletContext());
if (!(cache.isCached(desired_name)))
{ // create a template and save it off
CreateCommunityDialog template = new CreateCommunityDialog(getCountryList(),getLanguageList());
cache.saveTemplate(template);
} // end if
// return a new copy
return (CreateCommunityDialog)(cache.getNewDialog(desired_name));
} // end makeCreateCommunityDialog
/*--------------------------------------------------------------------------------
* Overrides from class HttpServlet
*--------------------------------------------------------------------------------
*/
public String getServletInfo()
{
String rc = "CommunityOperations servlet - General community operations (join, unjoin, etc.)\n"
+ "Part of the Venice Web Communities System\n";
return rc;
} // end getServletInfo
/*--------------------------------------------------------------------------------
* Overrides from class VeniceServlet
*--------------------------------------------------------------------------------
*/
protected VeniceContent doVeniceGet(HttpServletRequest request, VeniceEngine engine,
UserContext user, RenderData rdat)
throws ServletException, IOException, VeniceServletResult
{
// get the command we want to use
String cmd = getStandardCommandParam(request);
setMyLocation(request,"sigops?" + request.getQueryString());
if (cmd.equals("J"))
{ // "J" = "Join" (requires community parameter)
CommunityContext comm = getCommunityParameter(request,user,true,"top");
if (!(comm.canJoin())) // not permitted to join!
return new ErrorBox("Community Error","You are not permitted to join this community.","top");
if (comm.isPublicCommunity())
{ // attempt to join right now! (no join key required)
try
{ // call down to join the community
comm.join(null);
// success! display the "welcome" page
clearMenu(request); // force the clear to regen the menus
changeMenuCommunity(request,comm);
return new CommunityWelcome(comm);
} // end try
catch (AccessError ae)
{ // access error
return new ErrorBox("Access Error","Unable to join community: " + ae.getMessage(),"top");
} // end catch
catch (DataException de)
{ // data exception doing something
return new ErrorBox("Database Error","Database error joining community: " + de.getMessage(),"top");
} // end catch
} // end if (public community)
else
{ // we need to prompt them for the join key....
JoinKeyDialog dlg = makeJoinKeyDialog();
dlg.setupDialog(comm);
changeMenuCommunity(request,comm);
return dlg;
} // end else (private community)
} // end if ("J" command)
if (cmd.equals("U"))
{ // "U" = "Unjoin (requires community parameter)
CommunityContext comm = getCommunityParameter(request,user,true,"top");
if (!(comm.canUnjoin()))
return new ErrorBox("Community Error","You cannot unjoin this community.","top");
// OK, let's test for a confirmation...
if (ConfirmBox.isConfirmed(request,UNJOIN_CONFIRM_ATTR,UNJOIN_CONFIRM_PARAM))
{ // OK, if you say so, let's unjoin!
try
{ // do the unjoin now...
comm.unjoin();
} // end try
catch (AccessError ae)
{ // access error
return new ErrorBox("Access Error","Unable to unjoin community: " + ae.getMessage(),"top");
} // end catch
catch (DataException de)
{ // data exception doing something
return new ErrorBox("Database Error","Database error unjoining community: " + de.getMessage(),"top");
} // end catch
// after which, redirect back to the top
clearMenu(request);
throw new RedirectResult("top");
} // end if
else
{ // not a proper confirmation - display the confirm box
String message = "Are you sure you want to unjoin the '" + comm.getName() + "' community?";
return new ConfirmBox(request,UNJOIN_CONFIRM_ATTR,UNJOIN_CONFIRM_PARAM,"Unjoining community",
message,"sigops?cmd=U&sig=" + comm.getCommunityID(),"sig/" + comm.getAlias());
} // end else
} // end if ("U" command)
if (cmd.equals("C"))
{ // "C" - Create community (no parameters)
if (!(user.canCreateCommunity()))
return new ErrorBox("Community Error","You are not permitted to create communities.","top");
// present the "Create New Community" dialog
CreateCommunityDialog dlg = makeCreateCommunityDialog();
dlg.setupDialog(engine);
dlg.setFieldValue("language","en-US");
dlg.setFieldValue("country","US");
changeMenuTop(request);
return dlg;
} // end if ("C" command)
if (cmd.equals("I"))
{ // "I" - Send Invitation (requires community parameter)
CommunityContext comm = getCommunityParameter(request,user,true,"top");
if (!(comm.canSendInvitation()))
return new ErrorBox("Community Error","You are not permitted to send an invitation.",
"sig/" + comm.getAlias());
// present the "Invitation" dialog
return new Invitation(comm);
} // end if ("I" command)
if (cmd.equals("M"))
{ // "M" = List Members
CommunityContext comm = getCommunityParameter(request,user,true,"top");
if (logger.isDebugEnabled())
logger.debug("Member list for community: " + comm.getName());
try
{ // return the view dialog
ViewCommunityMembers view = new ViewCommunityMembers(engine,comm);
view.doInitialList();
changeMenuCommunity(request,comm);
return view;
} // end try
catch (DataException de)
{ // unable to get community members list
return new ErrorBox("Database Error","Database error getting community members list: "
+ de.getMessage(),"top");
} // end catch
} // end if ("M" command)
// this is an error!
logger.error("invalid command to CommunityOperations.doGet: " + cmd);
return new ErrorBox("Internal Error","Invalid command to CommunityOperations.doGet","top");
} // end doVeniceGet
protected VeniceContent doVenicePost(HttpServletRequest request, VeniceEngine engine,
UserContext user, RenderData rdat)
throws ServletException, IOException, VeniceServletResult
{
// get the command we want to use
String cmd = getStandardCommandParam(request);
setMyLocation(request,"sigops?cmd=" + cmd);
if (cmd.equals("J"))
{ // "J" = Join Community (requires community parameter)
CommunityContext comm = getCommunityParameter(request,user,true,"top");
setMyLocation(request,"sigops?cmd=J&sig=" + comm.getCommunityID());
JoinKeyDialog dlg = makeJoinKeyDialog();
if (dlg.isButtonClicked(request,"cancel")) // cancel - go back to community opening page
throw new RedirectResult("sig/" + comm.getAlias());
if (!(comm.canJoin())) // not permitted to join!
return new ErrorBox("Community Error","You are not permitted to join this community.","top");
if (dlg.isButtonClicked(request,"join"))
{ // OK, go join the community
dlg.loadValues(request); // load the dialog
try
{ // attempt to join the community!
dlg.doDialog(comm);
// success! display the "welcome" page
clearMenu(request); // force the clear to regen the menus
changeMenuCommunity(request,comm);
return new CommunityWelcome(comm);
} // end try
catch (ValidationException ve)
{ // here, a validation exception causes us to recycle and retry
dlg.resetOnError(ve.getMessage() + " Please try again.");
changeMenuCommunity(request,comm);
} // end catch
catch (AccessError ae)
{ // this is probably a bogus key - let them retry
dlg.resetOnError(ae.getMessage() + " Please try again.");
changeMenuCommunity(request,comm);
} // end catch
catch (DataException de)
{ // database error joining something
return new ErrorBox("Database Error","Database error joining community: " + de.getMessage(),"top");
} // end catch
return dlg; // recycle and try aagin
} // end if ("join" clicked)
// error - don't know what button was clicked
logger.error("no known button click on CommunityOperations.doPost, cmd=J");
return new ErrorBox("Internal Error","Unknown command button pressed","top");
} // end if ("J" command)
if (cmd.equals("C"))
{ // "C" = Create New Community
if (!(user.canCreateCommunity()))
return new ErrorBox("Community Error","You are not permitted to create communities.","top");
// load the "Create Communities" dialog
CreateCommunityDialog dlg = makeCreateCommunityDialog();
dlg.setupDialog(engine);
if (dlg.isButtonClicked(request,"cancel")) // cancel - go back to top
throw new RedirectResult("top");
if (dlg.isButtonClicked(request,"create"))
{ // OK, they actually want to create the new community...
dlg.loadValues(request); // load the form data
try
{ // attempt to create the community!
CommunityContext comm = dlg.doDialog(user);
// created successfully - display a "new community welcome" page
changeMenuCommunity(request,comm); // display menus for the first time!
return new NewCommunityWelcome(comm);
} // end try
catch (ValidationException ve)
{ // here, a validation exception causes us to recycle and retry
dlg.resetOnError(ve.getMessage() + " Please try again.");
changeMenuTop(request);
} // end catch
catch (AccessError ae)
{ // this is probably a bogus key - let them retry
dlg.resetOnError(ae.getMessage() + " Please try again.");
changeMenuTop(request);
} // end catch
catch (DataException de)
{ // database error doing something
return new ErrorBox("Database Error","Database error creating community: " + de.getMessage(),"top");
} // end catch
return dlg; // put the dialog back up
} // end if ("create" pressed)
// error - don't know what button was clicked
logger.error("no known button click on CommunityOperations.doPost, cmd=C");
return new ErrorBox("Internal Error","Unknown command button pressed","top");
} // end if ("C" command)
if (cmd.equals("I"))
{ // "I" = Send invitation (requires community parameter)
CommunityContext comm = getCommunityParameter(request,user,true,"top");
setMyLocation(request,"sigops?cmd=I&sig=" + comm.getCommunityID());
String on_error = "sig/" + comm.getAlias();
if (isImageButtonClicked(request,"cancel")) // cancel - go back to community opening page
throw new RedirectResult(on_error);
if (isImageButtonClicked(request,"send"))
{ // the "send" button was pressed
try
{ // send out the invitation
comm.sendInvitation(request.getParameter("addr"),request.getParameter("pb"));
} // end try
catch (AccessError ae)
{ // access error - display error box
return new ErrorBox("Access Error",ae.getMessage(),on_error);
} // end catch
catch (DataException de)
{ // database error doing something
return new ErrorBox("Database Error","Database error sending invitation: " + de.getMessage(),
on_error);
} // end catch
catch (EmailException ee)
{ // error sending the email message
return new ErrorBox("E-Mail Error","Error sending e-mail: " + ee.getMessage(),on_error);
} // end catch
// all sent - go back to community profile display
throw new RedirectResult(on_error);
} // end if ("send" pressed)
// error - don't know what button was clicked
logger.error("no known button click on CommunityOperations.doPost, cmd=I");
return new ErrorBox("Internal Error","Unknown command button pressed",on_error);
} // end if ("I" command)
if (cmd.equals("M"))
{ // "M" = Display Members List
CommunityContext comm = getCommunityParameter(request,user,true,"top");
setMyLocation(request,"sigops?cmd=M&sig=" + comm.getCommunityID());
String on_error = "sig/" + comm.getAlias();
if (logger.isDebugEnabled())
logger.debug("Member list for community: " + comm.getName());
try
{ // generate the members list
ViewCommunityMembers view = new ViewCommunityMembers(engine,comm);
view.doSearch(request);
changeMenuCommunity(request,comm);
return view;
} // end try
catch (ValidationException ve)
{ // validation error - throw it back to the user
return new ErrorBox(null,ve.getMessage() + " Please try again.",
"sigops?cmd=M&sig=" + comm.getCommunityID());
} // end catch
catch (DataException de)
{ // unable to get community members list
return new ErrorBox("Database Error","Database error getting community members list: "
+ de.getMessage(),on_error);
} // end catch
} // end if ("M" command)
// this is an error!
logger.error("invalid command to CommunityOperations.doPost: " + cmd);
return new ErrorBox("Internal Error","Invalid command to CommunityOperations.doPost","top");
} // end doVenicePost
} // end class CommunityOperations