venice-main-classic/src/com/silverwrist/venice/servlets/CommunityOperations.java
Eric J. Bowersox 313a46818f moved the language and country lists OUT of the database and into properties
files as they are likely to change VERY infrequently; this simplifies a lot
of bits of code that would otherwise have to call through VeniceEngine, etc.
Also folded the LocaleFactory class method into the new International object
used for managing the lists.
2001-11-16 22:12:14 +00:00

445 lines
15 KiB
Java

/*
* 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 <http://www.mozilla.org/MPL/>.
*
* 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 <erbo@silcom.com>,
* 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();
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