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.
445 lines
15 KiB
Java
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
|
|
|
|
|
|
|