/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/site/trunk/site-tool/tool/src/java/org/sakaiproject/site/tool/AdminSitesAction.java $
* $Id: AdminSitesAction.java 113961 2012-10-04 05:19:17Z steve.swinsburg@gmail.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (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.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.site.tool;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.alias.api.Alias;
import org.sakaiproject.alias.cover.AliasService;
import org.sakaiproject.authz.api.AuthzGroup;
import org.sakaiproject.authz.api.GroupNotDefinedException;
import org.sakaiproject.authz.api.Role;
import org.sakaiproject.authz.cover.AuthzGroupService;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.cheftool.Context;
import org.sakaiproject.cheftool.JetspeedRunData;
import org.sakaiproject.cheftool.PagedResourceActionII;
import org.sakaiproject.cheftool.RunData;
import org.sakaiproject.cheftool.VelocityPortlet;
import org.sakaiproject.cheftool.api.Menu;
import org.sakaiproject.cheftool.api.MenuItem;
import org.sakaiproject.cheftool.menu.MenuDivider;
import org.sakaiproject.cheftool.menu.MenuEntry;
import org.sakaiproject.cheftool.menu.MenuField;
import org.sakaiproject.cheftool.menu.MenuImpl;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.courier.api.ObservingCourier;
import org.sakaiproject.entity.api.Entity;
import org.sakaiproject.entity.api.ResourcePropertiesEdit;
import org.sakaiproject.event.api.SessionState;
import org.sakaiproject.exception.IdInvalidException;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.IdUsedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.javax.PagingPosition;
import org.sakaiproject.site.api.Group;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SitePage;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserNotDefinedException;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.sakaiproject.util.ResourceLoader;
import org.sakaiproject.util.StringUtil;
import org.sakaiproject.util.Validator;
/**
* <p>
* SitesAction is the Sakai admin sites editor.
* </p>
*/
public class AdminSitesAction extends PagedResourceActionII
{
private static Log M_log = LogFactory.getLog(AdminSitesAction.class);
/** State holding the site id for site id search. */
protected static final String STATE_SEARCH_SITE_ID = "search_site";
/** State holding the user id for user id search. */
protected static final String STATE_SEARCH_USER_ID = "search_user";
protected static final String FORM_SEARCH_SITEID = "search_site";
protected static final String FORM_SEARCH_USERID = "search_user";
private final static String FORM_URL_BASE = "form_url_base";
private final static String FORM_URL_ALIAS = "form_url_alias";
private final static String FORM_URL_ALIAS_FULL = "form_url_alias_full";
private static ResourceLoader rb = new ResourceLoader("admin");
/** Name of state attribute for Site instance id */
private static final String STATE_SITE_INSTANCE_ID = "site.instance.id";
/**
* {@inheritDoc}
*/
protected List readResourcesPage(SessionState state, int first, int last)
{
// search?
String search = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH));
String siteId = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH_SITE_ID));
String userId = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH_USER_ID));
// Boolean userOnly = (Boolean) state.getAttribute(STATE_SEARCH_USER);
// if site id specified, use that
if (siteId != null)
{
List rv = new Vector();
try
{
Site site = SiteService.getSite(siteId);
rv.add(site);
}
catch (IdUnusedException e)
{
}
return rv;
}
// if userId specified, use that
else if (userId != null)
{
List rv = new Vector();
Site userSite = findUserSiteByUserIdCriteria(userId);
if ( userSite == null ) {
return rv;
}
rv.add(userSite);
return rv;
}
// search for non-user sites, using the criteria
else if (search != null)
{
return SiteService.getSites(org.sakaiproject.site.api.SiteService.SelectionType.NON_USER, null, search, null,
org.sakaiproject.site.api.SiteService.SortType.TITLE_ASC, new PagingPosition(first, last));
}
// otherwise just show a page of all
else
{
return SiteService.getSites(org.sakaiproject.site.api.SiteService.SelectionType.ANY, null, search, null,
org.sakaiproject.site.api.SiteService.SortType.TITLE_ASC, new PagingPosition(first, last));
}
}
/**
* {@inheritDoc}
*/
protected int sizeResources(SessionState state)
{
// search?
String search = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH));
String siteId = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH_SITE_ID));
String userId = StringUtil.trimToNull((String) state.getAttribute(STATE_SEARCH_USER_ID));
// search for non-user sites, using the criteria
if (siteId != null)
{
try
{
Site site = SiteService.getSite(siteId);
return 1;
}
catch (IdUnusedException e)
{
}
return 0;
}
else if (userId != null)
{
Site userSite = findUserSiteByUserIdCriteria(userId);
if ( userSite == null ) {
return 0;
}
return 1;
}
else if (search != null)
{
return SiteService.countSites(org.sakaiproject.site.api.SiteService.SelectionType.NON_USER, null, search, null);
}
else
{
return SiteService.countSites(org.sakaiproject.site.api.SiteService.SelectionType.ANY, null, search, null);
}
}
/**
* Searches for a user's workspace site by resolving the given ID to
* a {@link User} object and calculating the target {@link Site}'s
* ID from that object. As implemented, supports user PK and EID
* inputs. Be aware that searching for users by EID can result in
* the lazy creation of Sakai user records, or at least user ID
* mapping records.
*
* @see #findUserByPk(String)
* @see #findUserByEid(String)
* @see #findUserSite(User)
* @param formSubmittedUserId typically end-user provided search
* criteria; must not be <code>null</code>
* @return the user's workspace site or <code>null</code> if no
* such user or no such site
*/
protected Site findUserSiteByUserIdCriteria(String formSubmittedUserId) {
User user = findUserByPk(formSubmittedUserId);
if ( user == null ) {
user = findUserByEid(formSubmittedUserId); // be warned, this might lazily create a user record
}
if ( user == null ) {
return null;
}
Site userSite = findUserSite(user);
return userSite;
}
/**
* Search for a {@link User} object by primary key (i.e. <code>User.id</code>).
*
* @see UserDirectoryService#getUser(String)
* @param userPk a String to be treated as a user's Sakai-internal primary key;
* must not be <code>null</code>
* @return a resolved {@link User} or <code>null</code>, signifying no results
*/
protected User findUserByPk(String userPk) {
try {
User user = UserDirectoryService.getUser(userPk);
return user;
} catch ( UserNotDefinedException e ) {
if ( Log.isDebugEnabled() ) {
Log.debug("chef", "Failed to find a user record by PK [pk = " + userPk + "]",
e);
}
return null;
}
}
/**
* Search for a {@link User} object by user "enterprise identifier",
* (i.e. <code>User.eid</code>).
*
* @see UserDirectoryService#getUserByEid(String)
* @param eid a String to be treated as a user's "enterprise identifier";
* must not be <code>null</code>
* @return a resolved {@link User} or <code>null</code>, signifying no results
*/
protected User findUserByEid(String eid) {
try {
User user = UserDirectoryService.getUserByEid(eid);
return user;
} catch ( UserNotDefinedException e ) {
if ( Log.isDebugEnabled() ) {
Log.debug("chef", "Failed to find a user record by EID [eid = " + eid + "]",
e);
}
return null;
}
}
/**
* Search for the given {@link User}'s workspace {@link Site}.
*
* @param knownUser user having a Sakai primary key (doesn't necessarily
* mean the user has actually signed in yet). Must not be <code>null</code>
* @return the user's workspace site or <code>null<code> if no such thing, e.g.
* if the user has not yet logged in.
*/
protected Site findUserSite(User knownUser) {
String userDbId = knownUser.getId();
String userEid = knownUser.getEid();
String userMyWorkspaceSiteDbId = SiteService.getUserSiteId(userDbId);
try {
Site userSite = SiteService.getSite(userMyWorkspaceSiteDbId); // exceptional if no results
return userSite;
} catch ( IdUnusedException e ) {
if ( Log.isDebugEnabled() ) {
Log.debug("chef", "Failed to locate a workspace for user [user id = " + userDbId +
"][user eid = " + userEid + "][site id = " + userMyWorkspaceSiteDbId + "]", e);
}
return null;
}
}
/**
* Populate the state object, if needed.
*/
protected void initState(SessionState state, VelocityPortlet portlet, JetspeedRunData rundata)
{
super.initState(state, portlet, rundata);
// // setup the observer to notify our main panel
// if (state.getAttribute(STATE_OBSERVER) == null)
// {
// // the delivery location for this tool
// String deliveryId = clientWindowId(state, portlet.getID());
//
// // the html element to update on delivery
// String elementId = mainPanelUpdateId(portlet.getID());
//
// // the event resource reference pattern to watch for
// String pattern = SiteService.siteReference("");
//
// state.setAttribute(STATE_OBSERVER, new EventObservingCourier(deliveryId, elementId, pattern));
// }
}
/**
* build the context
*/
public String buildMainPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state)
{
context.put("tlang", rb);
// if not logged in as the super user, we won't do anything
if (!SecurityService.isSuperUser())
{
context.put("tlang",rb);
return (String) getContext(rundata).get("template") + "_noaccess";
}
String template = null;
// get the Sakai session
Session session = SessionManager.getCurrentSession();
// get the Tool session
ToolSession toolSession = SessionManager.getCurrentToolSession();
// check mode and dispatch
String mode = (String) state.getAttribute("mode");
if (mode == null)
{
template = buildListContext(state, context);
}
else if (mode.equals("new"))
{
template = buildNewContext(state, context);
}
else if (mode.equals("edit"))
{
template = buildEditContext(state, context);
}
else if (mode.equals("confirm"))
{
template = buildConfirmRemoveContext(state, context);
}
else if (mode.equals("saveas"))
{
template = buildSaveasContext(state, context);
}
else if (mode.equals("pages"))
{
template = buildPagesContext(state, context);
}
else if (mode.equals("newPage"))
{
template = buildNewPageContext(state, context);
}
else if (mode.equals("editPage"))
{
template = buildEditPageContext(state, context);
}
else if (mode.equals("properties"))
{
template = buildPropertiesContext(state, context);
}
else if (mode.equals("pageProperties"))
{
template = buildPagePropertiesContext(state, context);
}
else if (mode.equals("toolProperties"))
{
template = buildToolPropertiesContext(state, context);
}
else if (mode.equals("groups"))
{
template = buildGroupsContext(state, context);
}
else if (mode.equals("newGroup"))
{
template = buildNewGroupContext(state, context);
}
else if (mode.equals("editGroup"))
{
template = buildEditGroupContext(state, context);
}
else if (mode.equals("tools"))
{
template = buildToolsContext(state, context);
}
else if (mode.equals("newTool"))
{
template = buildNewToolContext(state, context);
}
else if (mode.equals("editTool"))
{
template = buildEditToolContext(state, context);
}
// else if (mode.equals("newMember"))
// {
// template = buildNewMemberContext(state, context);
// }
else
{
Log.warn("chef", "SitesAction: mode: " + mode);
template = buildListContext(state, context);
}
String prefix = (String) getContext(rundata).get("template");
return prefix + template;
} // buildMainPanelContext
/**
* Build the context for the main list mode.
*/
private String buildListContext(SessionState state, Context context)
{
// put the service in the context (used for allow update calls on each site)
context.put("service", SiteService.getInstance());
// prepare the paging of realms
List sites = prepPage(state);
context.put("sites", sites);
// we need the Realms, too!
context.put("realms", AuthzGroupService.getInstance());
// build the menu
Menu bar = new MenuImpl();
if (SiteService.allowAddSite(null))
{
bar.add(new MenuEntry(rb.getString("sitact.newsit"), "doNew"));
}
// add the paging commands
//addListPagingMenus(bar, state);
int pageSize = Integer.valueOf(state.getAttribute(STATE_PAGESIZE).toString()).intValue();
int currentPageNubmer = Integer.valueOf(state.getAttribute(STATE_CURRENT_PAGE).toString()).intValue();
int startNumber = pageSize * (currentPageNubmer - 1) + 1;
int endNumber = pageSize * currentPageNubmer;
int totalNumber = 0;
try
{
totalNumber = Integer.valueOf(state.getAttribute(STATE_NUM_MESSAGES).toString()).intValue();
}
catch (java.lang.NullPointerException ignore) {}
catch (java.lang.NumberFormatException ignore) {}
if (totalNumber < endNumber) endNumber = totalNumber;
context.put("startEndTotalNumbers", new Integer[]{Integer.valueOf(startNumber),Integer.valueOf(endNumber),Integer.valueOf(totalNumber)});
context.put("totalNumber", Integer.valueOf(totalNumber));
pagingInfoToContext(state, context);
// add the search commands
addSearchMenus(bar, state);
// more search
bar.add(new MenuDivider());
bar
.add(new MenuField(FORM_SEARCH_SITEID, "toolbar2", "doSearch_site_id", (String) state
.getAttribute(STATE_SEARCH_SITE_ID)));
bar.add(new MenuEntry(rb.getString("sitlis.sid"), null, true, MenuItem.CHECKED_NA, "doSearch_site_id", "toolbar2"));
if (state.getAttribute(STATE_SEARCH_SITE_ID) != null)
{
bar.add(new MenuEntry(rb_praII.getString("sea.cleasea"), "doSearch_clear"));
}
bar.add(new MenuDivider());
bar
.add(new MenuField(FORM_SEARCH_USERID, "toolbar3", "doSearch_user_id", (String) state
.getAttribute(STATE_SEARCH_USER_ID)));
bar.add(new MenuEntry(rb.getString("sitlis.uid"), null, true, MenuItem.CHECKED_NA, "doSearch_user_id", "toolbar3"));
if (state.getAttribute(STATE_SEARCH_USER_ID) != null)
{
bar.add(new MenuEntry(rb_praII.getString("sea.cleasea"), "doSearch_clear"));
}
// add the refresh commands
addRefreshMenus(bar, state);
if (bar.size() > 0)
{
context.put(Menu.CONTEXT_MENU, bar);
}
// inform the observing courier that we just updated the page...
// if there are pending requests to do so they can be cleared
justDelivered(state);
return "_list";
} // buildListContext
/**
* Build the context for the new site mode.
*/
private String buildNewContext(SessionState state, Context context)
{
// name the html form for user edit fields
context.put("tlang", rb);
context.put("form-name", "site-form");
return "_edit";
} // buildNewContext
/**
* Build the context for the edit site mode.
*/
private String buildEditContext(SessionState state, Context context)
{
// get the site to edit
context.put("tlang", rb);
Site site = (Site) state.getAttribute("site");
context.put("site", site);
// name the html form for user edit fields
context.put("form-name", "site-form");
// get alias base path
String aliasBaseUrl = ServerConfigurationService.getPortalUrl() + Entity.SEPARATOR + "site" + Entity.SEPARATOR;
boolean displaySiteAlias = displaySiteAlias();
String alias;
context.put("displaySiteAlias", Boolean.valueOf(displaySiteAlias));
if (displaySiteAlias)
{
alias = getSiteAlias(site!=null?site.getReference():"");
if (alias != null) {
String urlAliasFull = aliasBaseUrl + alias;
context.put(FORM_URL_ALIAS_FULL, urlAliasFull);
}
context.put(FORM_URL_BASE, aliasBaseUrl);
context.put(FORM_URL_ALIAS, alias);
}
// build the menu
// we need the form fields for the remove...
Menu bar = new MenuImpl();
if (site!= null && SiteService.allowRemoveSite(site.getId()))
{
bar.add(new MenuEntry(rb.getString("sitact.remsit"), null, true, MenuItem.CHECKED_NA, "doRemove", null));
}
bar.add(new MenuEntry(rb.getString("sitact.savas"), null, true, MenuItem.CHECKED_NA, "doSaveas_request", null));
context.put(Menu.CONTEXT_MENU, bar);
return "_edit";
} // buildEditContext
/**
* Build the context for the new site mode.
*/
private String buildConfirmRemoveContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
return "_confirm_remove";
} // buildConfirmRemoveContext
/**
* Build the context for the new site mode.
*/
private String buildSaveasContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
return "_saveas";
} // buildSaveasContext
/**
* Build the context for the new member mode
*/
/*
* private String buildNewMemberContext(SessionState state, Context context) { return "_add_member"; } // buildNewMemberContext
*/
/**
* Build the context for the pages display in edit mode.
*/
private String buildPagesContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
// put all site's pages into the context
List pages = site.getPages();
context.put("pages", pages);
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.newpag"), "doNew_page"));
context.put(Menu.CONTEXT_MENU, bar);
return "_pages";
} // buildPagesContext
/**
* Build the context for the new page mode.
*/
private String buildNewPageContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "page-form");
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
context.put("site", site);
context.put("page", page);
context.put("layouts", layoutsList());
return "_edit_page";
} // buildNewPageContext
/**
* Build the context for the edit page mode.
*/
private String buildEditPageContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "page-form");
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
context.put("site", site);
context.put("page", page);
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.rempag"), null, true, MenuItem.CHECKED_NA, "doRemove_page"));
context.put(Menu.CONTEXT_MENU, bar);
context.put("layouts", layoutsList());
context.put("titleCustom", String.valueOf( page.getTitleCustom() ) );
return "_edit_page";
} // buildEditPageContext
/**
* Build the context for the properties edit in edit mode.
*/
private String buildPropertiesContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
return "_properties";
}
/**
* Build the context for the properties edit in edit mode.
*/
private String buildPagePropertiesContext(SessionState state, Context context)
{
context.put("tlang", rb);
SitePage page = (SitePage) state.getAttribute("page");
if(page != null) {
// read the form - if rejected, leave things as they are
context.put("page", page);
}
return "_page_properties";
}
/**
* Build the context for the properties edit in edit mode.
*/
private String buildToolPropertiesContext(SessionState state, Context context)
{
context.put("tlang", rb);
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
if(tool != null) {
// read the form - if rejected, leave things as they are
context.put("tool", tool);
}
return "_tool_properties";
}
/**
* Build the context for the groups display in edit mode.
*/
private String buildGroupsContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
// put all site's groups into the context
Collection groups = site.getGroups();
context.put("groups", groups);
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.newgrp"), "doNew_group"));
context.put(Menu.CONTEXT_MENU, bar);
return "_groups";
} // buildGroupsContext
/**
* Build the context for the new group mode.
*/
private String buildNewGroupContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "page-form");
Site site = (Site) state.getAttribute("site");
Group group = (Group) state.getAttribute("group");
context.put("site", site);
context.put("group", group);
return "_edit_group";
} // buildNewGroupContext
/**
* Build the context for the edit group mode.
*/
private String buildEditGroupContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "group-form");
Site site = (Site) state.getAttribute("site");
Group group = (Group) state.getAttribute("group");
context.put("site", site);
context.put("group", group);
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.remgrp"), null, true, MenuItem.CHECKED_NA, "doRemove_group"));
context.put(Menu.CONTEXT_MENU, bar);
return "_edit_group";
} // buildEditGroupContext
/**
* Build the context for the tools display in edit mode.
*/
private String buildToolsContext(SessionState state, Context context)
{
context.put("tlang", rb);
// get the site to edit
Site site = (Site) state.getAttribute("site");
context.put("site", site);
// get the page being edited
SitePage page = (SitePage) state.getAttribute("page");
context.put("page", page);
// put all page's tools into the context
List tools = page.getTools();
context.put("tools", tools);
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.newtoo"), "doNew_tool"));
context.put(Menu.CONTEXT_MENU, bar);
return "_tools";
} // buildToolsContext
/**
* Build the context for the new tool mode.
*/
private String buildNewToolContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "tool-form");
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
context.put("site", site);
context.put("page", page);
context.put("tool", tool);
List features = findNonHelperTools();
context.put("features", features);
return "_edit_tool";
} // buildNewToolContext
/**
* Get the list of all tools that are not helper tools.
*
* @return The list of all tools that are not helper to.
*/
private List findNonHelperTools()
{
class ToolTitleComparator implements Comparator{
public int compare(Object tool0, Object tool1) {
return ((Tool)tool0).getTitle().compareTo( ((Tool)tool1).getTitle() );
}
}
// get all tools
Set all = ToolManager.findTools(null, null);
// get the helpers
Set categories = new HashSet();
categories.add("sakai.helper");
Set helpers = ToolManager.findTools(categories, null);
// remove the helpers from all
all.removeAll(helpers);
// make a list for sorting
List features = new Vector();
features.addAll(all);
//Collections.sort(features);
Collections.sort(features, new ToolTitleComparator());
return features;
}
/**
* Build the context for the edit tool mode.
*/
private String buildEditToolContext(SessionState state, Context context)
{
context.put("tlang", rb);
// name the html form for user edit fields
context.put("form-name", "tool-form");
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
context.put("site", site);
context.put("page", page);
context.put("tool", tool);
List features = findNonHelperTools();
context.put("features", features);
context.put("toolReg", tool.getTool());
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("sitact.remtoo"), null, true, MenuItem.CHECKED_NA, "doRemove_tool"));
context.put(Menu.CONTEXT_MENU, bar);
return "_edit_tool";
} // buildEditToolContext
/**
* Handle a request for a new site.
*/
public void doNew(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "new");
// mark the site as new, so on cancel it can be deleted
state.setAttribute("new", "true");
// disable auto-updates while in view mode
ObservingCourier courier = (ObservingCourier) state.getAttribute(STATE_OBSERVER);
if (courier != null) courier.disable();
} // doNew
/**
* Handle a request to edit a site.
*/
public void doEdit(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
String id = data.getParameters().getString("id");
if (SiteService.allowUpdateSite(id))
{
// get the site
try
{
Site site = SiteService.getSite(id);
state.setAttribute("site", site);
// RealmEdit realm = AuthzGroupService.editRealm("/site/" + id); // %%% use a site service call -ggolden
// state.setAttribute("realm", realm);
state.setAttribute("mode", "edit");
// disable auto-updates while in view mode
ObservingCourier courier = (ObservingCourier) state.getAttribute(STATE_OBSERVER);
if (courier != null) courier.disable();
}
catch (IdUnusedException e)
{
Log.warn("chef", "SitesAction.doEdit: site not found: " + id);
addAlert(state, rb.getFormattedMessage("siteact.site", new Object[]{id}));
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
}
}
else
{
addAlert(state, rb.getFormattedMessage("youdonot1", new Object[]{id}));
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
}
} // doEdit
/**
* Handle a request to save the site edit (from the site edit form).
*/
public void doSave(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the form - if rejected, leave things as they are
if (!readSiteForm(data, state)) return;
doSave_edit(data, context);
} // doSave
/**
* Handle a request to save the edit from either page or tools list mode - no form to read in.
*/
public void doSave_props_edit(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the properties form
readPropertiesForm(data, state);
doSave_edit(data, context);
}
/**
* Handle a request to save the edit from either page or tools list mode - no form to read in.
*/
public void doSave_page_props_edit(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the properties form
readPagePropertiesForm(data, state);
doSave_edit(data, context);
}
/**
* Handle a request to save the edit from either page or tools list mode - no form to read in.
*/
public void doSave_tool_props_edit(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the properties form
readToolPropertiesForm(data, state);
doSave_edit(data, context);
}
/**
* Handle a request to save the edit from either page or tools list mode - no form to read in.
*/
public void doSave_edit(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// commit the change
Site site = (Site) state.getAttribute("site");
if (site != null)
{
String url_alias = StringUtil.trimToNull(data.getParameters().getString("url_alias"));
// set an alias for the site
if(url_alias!=null)
{
state.setAttribute(STATE_SITE_INSTANCE_ID, site.getId());
setSiteAlias(url_alias, site.getReference(), state);
}
// bring the mail archive service's channel for this site in sync with the site's setting
// syncWithMailArchive(site);
try
{
SiteService.save(site);
}
catch (PermissionException e)
{
Log.warn("chef", "SitesAction.doSave_edit: " + e);
}
catch (IdUnusedException e)
{
Log.warn("chef", "SitesAction.doSave_edit: " + e);
}
// save the realm, too
// RealmEdit realm = (RealmEdit) state.getAttribute("realm");
// AuthzGroupService.commitEdit(realm);
}
// cleanup
cleanState(state);
// return to main mode
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
// TODO: hard coding this frame id is fragile, portal dependent, and needs to be fixed -ggolden
schedulePeerFrameRefresh("sitenav");
} // doSave_edit
/**
* Go into saveas mode
*/
public void doSaveas_request(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
//if (!readSiteForm(data, state)) return;
// go to saveas mode
state.setAttribute("mode", "saveas");
} // doSaveas_request
/**
* Handle a request to save-as the site as a new site.
*/
public void doSaveas(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the form
String id = data.getParameters().getString("id");
// get the site to copy from
Site site = (Site) state.getAttribute("site");
try
{
// make a new site with this id and as a structural copy of site
Site newSite = SiteService.addSite(id, site);
}
catch (IdUsedException e)
{
addAlert(state, rb.getFormattedMessage("sitact.thesitid", new Object[]{id}));
return;
}
catch (IdInvalidException e)
{
addAlert(state, rb.getFormattedMessage("sitact.thesitid2", new Object[]{id}));
return;
}
catch (PermissionException e)
{
addAlert(state, rb.getFormattedMessage("sitact.youdonot2", new Object[]{id}));
return;
}
cleanState(state);
// return to main mode
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
// TODO: hard coding this frame id is fragile, portal dependent, and needs to be fixed -ggolden
schedulePeerFrameRefresh("sitenav");
} // doSaveas
/**
* cancel the saveas request, return to edit
*/
public void doCancel_saveas(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// return to main mode
state.setAttribute("mode", "edit");
} // doCancel_saveas
/**
* doCancel called when "eventSubmit_doCancel" is in the request parameters to cancel site edits
*/
public void doCancel(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// cancel the realm edit - it will be removed if the site is removed
// RealmEdit realm = (RealmEdit) state.getAttribute("realm");
// if (realm != null)
// {
// AuthzGroupService.cancelEdit(realm);
// }
// get the site
Site site = (Site) state.getAttribute("site");
if (site != null)
{
// if this was a new, delete the site
if ("true".equals(state.getAttribute("new")))
{
// remove the site
try
{
SiteService.removeSite(site);
}
catch (PermissionException e)
{
addAlert(state, rb.getFormattedMessage("sitact.youdonot3", new Object[]{site.getId()}));
} catch (IdUnusedException e) {
addAlert(state, rb.getFormattedMessage("sitact.thesitid2", new Object[]{site.getId()}));
}
// catch (IdUnusedException e)
// {
// addAlert(state, rb.getFormattedMessage("sitact.notfound", new Object[]{site.getId()}));
// }
}
}
// cleanup
cleanState(state);
// return to main mode
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
} // doCancel
/**
* doRemove called when "eventSubmit_doRemove" is in the request parameters to confirm removal of the site
*/
public void doRemove(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
//if (!readSiteForm(data, state)) return;
// go to remove confirm mode
state.setAttribute("mode", "confirm");
} // doRemove
/**
* doRemove_confirmed called when "eventSubmit_doRemove_confirmed" is in the request parameters to remove the site
*/
public void doRemove_confirmed(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// get the site
Site site = (Site) state.getAttribute("site");
// cancel the realm edit - the site remove will remove the realm
// RealmEdit realm = (RealmEdit) state.getAttribute("realm");
// AuthzGroupService.cancelEdit(realm);
// remove the site
try
{
SiteService.removeSite(site);
}
catch (PermissionException e)
{
addAlert(state, rb.getFormattedMessage("sitact.youdonot3", new Object[]{site.getId()}));
} catch (IdUnusedException e) {
addAlert(state, rb.getFormattedMessage("sitact.thesitid2", new Object[]{site.getId()}));
}
// catch (IdUnusedException e)
// {
// addAlert(state, rb.getFormattedMessage("sitact.notfound", new Object[]{site.getId()}));
// }
// cleanup
cleanState(state);
// go to main mode
state.removeAttribute("mode");
// make sure auto-updates are enabled
enableObserver(state);
// TODO: hard coding this frame id is fragile, portal dependent, and needs to be fixed -ggolden
schedulePeerFrameRefresh("sitenav");
} // doRemove_confirmed
/**
* doCancel_remove called when "eventSubmit_doCancel_remove" is in the request parameters to cancel site removal
*/
public void doCancel_remove(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// return to edit mode
state.setAttribute("mode", "edit");
} // doCancel_remove
/**
* Read the site form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readSiteForm(RunData data, SessionState state)
{
// read the form
String id = StringUtil.trimToNull(data.getParameters().getString("id"));
String title = StringUtil.trimToNull(data.getParameters().getString("title"));
String type = StringUtil.trimToNull(data.getParameters().getString("type"));
String shortDescription = StringUtil.trimToNull(data.getParameters().getString("shortDescription"));
String description = StringUtil.trimToNull(data.getParameters().getString("description"));
boolean joinable = data.getParameters().getBoolean("joinable");
String joinerRole = StringUtil.trimToNull(data.getParameters().getString("joinerRole"));
String icon = StringUtil.trimToNull(data.getParameters().getString("icon"));
String info = StringUtil.trimToNull(data.getParameters().getString("info"));
boolean published = data.getParameters().getBoolean("published");
boolean softlyDeleted = data.getParameters().getBoolean("softlyDeleted");
String skin = StringUtil.trimToNull(data.getParameters().getString("skin"));
boolean pubView = data.getParameters().getBoolean("pubView");
boolean customOrder = data.getParameters().getBoolean("customOrder");
// get the site
Site site = (Site) state.getAttribute("site");
// add if needed
if (site == null)
{
try
{
site = SiteService.addSite(id, type);
// put the site in the state
state.setAttribute("site", site);
}
catch (IdUsedException e)
{
addAlert(state, rb.getFormattedMessage("sitact.thesitid", new Object[]{id}));
return false;
}
catch (IdInvalidException e)
{
addAlert(state, rb.getFormattedMessage("sitact.thesitid2", new Object[]{id}));
return false;
}
catch (PermissionException e)
{
addAlert(state, rb.getFormattedMessage("sitact.youdonot2", new Object[]{id}));
return false;
}
}
// update
if (site != null)
{
if (joinable)
{
// check if there is a qualifed role in the role field
if ((joinerRole == null) || (joinerRole.equals("")))
{
addAlert(state, rb.getString("sitact.sperol"));
return false;
}
Vector roles = new Vector();
Vector roleIds = new Vector();
AuthzGroup realm = null;
try
{
realm = AuthzGroupService.getAuthzGroup(site.getReference());
roles.addAll(realm.getRoles());
}
catch (GroupNotDefinedException e)
{
// use the type's template, if defined
String realmTemplate = "!site.template";
if (type != null)
{
realmTemplate = realmTemplate + "." + type;
}
try
{
AuthzGroup r = AuthzGroupService.getAuthzGroup(realmTemplate);
roles.addAll(r.getRoles());
}
catch (GroupNotDefinedException err)
{
try
{
AuthzGroup rr = AuthzGroupService.getAuthzGroup("!site.template");
roles.addAll(rr.getRoles());
}
catch (GroupNotDefinedException ee)
{
}
}
}
for (int i = 0; i < roles.size(); i++)
{
roleIds.add(((Role) roles.elementAt(i)).getId());
}
if (!roleIds.contains(joinerRole))
{
addAlert(state, rb.getString("sitact.sperol"));
return false;
}
}
site.setTitle(title);
site.setShortDescription(shortDescription);
site.setDescription(description);
site.setJoinable(joinable);
site.setJoinerRole(joinerRole);
site.setIconUrl(icon);
site.setInfoUrl(info);
site.setSkin(skin);
site.setType(type);
site.setPubView(pubView);
site.setPublished(published);
site.setSoftlyDeleted(softlyDeleted);
site.setCustomPageOrdered(customOrder);
}
return true;
} // readSiteForm
/**
* Switch to page display mode within a site edit.
*/
public void doPages(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readSiteForm(data, state)) return;
state.setAttribute("mode", "pages");
} // doPages
/**
* Switch to property edit mode within a site edit.
*/
public void doProperties(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
// read the form - if rejected, leave things as they are
if (!readSiteForm(data, state)) return;
state.setAttribute("mode", "properties");
}
/**
* Switch to property edit mode within a tool edit.
*/
public void doToolProperties(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
// read the form - if rejected, leave things as they are
if (!readToolForm(data, state)) return;
state.setAttribute("mode", "toolProperties");
}
/**
* Switch to property edit mode within a page edit.
*/
public void doPageProperties(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
SitePage page = (SitePage) state.getAttribute("page");
// read the form - if rejected, leave things as they are
if (!readPageForm(data, state)) return;
state.setAttribute("mode", "pageProperties");
}
/**
* Handle a request to create a new page in the site edit.
*/
public void doNew_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "newPage");
// make the page so we have the id
Site site = (Site) state.getAttribute("site");
SitePage page = site.addPage();
state.setAttribute("page", page);
// mark the site as new, so on cancel it can be deleted
state.setAttribute("newPage", "true");
} // doNew_page
/**
* Handle a request to create a new property in the site edit.
*/
public void doNew_property(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the properties form
readPropertiesForm(data, state);
}
/**
* Edit an existing page.
*/
public void doEdit_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editPage");
String id = data.getParameters().getString("id");
// get the page
Site site = (Site) state.getAttribute("site");
SitePage page = site.getPage(id);
state.setAttribute("page", page);
} // doEdit_page
/**
* Move the page up in the order.
*/
public void doEdit_page_up(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
String id = data.getParameters().getString("id");
// get the page
Site site = (Site) state.getAttribute("site");
SitePage page = site.getPage(id);
state.setAttribute("page", page);
// move it
page.moveUp();
} // doEdit_page_up
/**
* Move the page down in the order.
*/
public void doEdit_page_down(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
String id = data.getParameters().getString("id");
// get the page
Site site = (Site) state.getAttribute("site");
SitePage page = site.getPage(id);
state.setAttribute("page", page);
// move it
page.moveDown();
} // doEdit_page_down
/**
* save the page edited, and save the site edit
*/
public void doSave_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readPageForm(data, state)) return;
// done with the page
state.removeAttribute("page");
// commit the entire site edit
doSave_edit(data, context);
} // doSave_page
/**
* save the page edited, and return to the pages mode
*/
public void doDone_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readPageForm(data, state)) return;
// done with the page
state.removeAttribute("page");
// return to main mode
state.setAttribute("mode", "pages");
} // doDone_page
/**
* cancel a page edit, return to the pages list
*/
public void doCancel_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
// if the page was new, remove it
if ("true".equals(state.getAttribute("newPage")))
{
site.removePage(page);
}
// %%% do we need the old page around for a restore; did we already modify it? - ggolden
// done with the page
state.removeAttribute("page");
// return to main mode
state.setAttribute("mode", "pages");
} // doCancel_page
/**
* cancel a page edit, return to the pages list
*/
public void doCancel_page_props(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editPage");
} // doCancel_page_prop
/**
* cancel a page edit, return to the pages list
*/
public void doCancel_tool_props(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editTool");
} // doCancel_tool_prop
/**
* Handle a request to remove the page being edited.
*/
public void doRemove_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
// remove the page (no confirm)
site.removePage(page);
// done with the page
state.removeAttribute("page");
// return to pages mode
state.setAttribute("mode", "pages");
} // doRemove_page
/**
* Switch to group display mode within a site edit.
*/
public void doGroups(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readSiteForm(data, state)) return;
state.setAttribute("mode", "groups");
} // doGroups
/**
* Edit an existing group.
*/
public void doEdit_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editGroup");
String id = data.getParameters().getString("id");
// get the group
Site site = (Site) state.getAttribute("site");
Group group = site.getGroup(id);
state.setAttribute("group", group);
} // doEdit_group
/**
* save the group edited, and save the site edit
*/
public void doSave_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readGroupForm(data, state)) return;
// done with the group
state.removeAttribute("group");
// commit the entire site edit
doSave_edit(data, context);
} // doSave_group
/**
* save the group edited, and return to the groups mode
*/
public void doDone_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readGroupForm(data, state)) return;
// done with the group
state.removeAttribute("group");
// return to main mode
state.setAttribute("mode", "groups");
} // doDone_group
/**
* cancel a group edit, return to the groups list
*/
public void doCancel_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
Group group = (Group) state.getAttribute("group");
// if the page was new, remove it
if ("true".equals(state.getAttribute("newGroup")))
{
site.removeGroup(group);
}
// %%% do we need the old group around for a restore; did we already modify it? - ggolden
// done with the group
state.removeAttribute("group");
// return to main mode
state.setAttribute("mode", "groups");
} // doCancel_group
/**
* Handle a request to remove the group being edited.
*/
public void doRemove_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
Group group = (Group) state.getAttribute("group");
// remove the page (no confirm)
site.removeGroup(group);
// done with the page
state.removeAttribute("group");
// return to pages mode
state.setAttribute("mode", "groups");
} // doRemove_group
/**
* Handle a request to create a new group in the site edit.
*/
public void doNew_group(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "newGroup");
// make the page so we have the id
Site site = (Site) state.getAttribute("site");
Group group = site.addGroup();
state.setAttribute("group", group);
// mark the site as new, so on cancel it can be deleted
state.setAttribute("newGroup", "true");
} // doRemove_group
/**
* Switch back to edit main info mode from another edit mode (like pages).
*/
public void doEdit_to_main(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "edit");
} // doEdit_to_main
/**
* Switch back to edit main info mode properties edit mode
*/
public void doEdit_props_to_main(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the properties form
readPropertiesForm(data, state);
if(state.getAttribute("mode").equals("properties")) {
state.setAttribute("mode", "edit");
}
}
/**
* Switch back to edit main info mode properties edit mode
*/
public void doEdit_props_to_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the properties form
readPropertiesForm(data, state);
if(state.getAttribute("mode").equals("pageProperties")) {
state.setAttribute("mode", "editPage");
}
}
/**
* Switch back to edit main info mode properties edit mode
*/
public void doEdit_props_to_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the properties form
readPropertiesForm(data, state);
if(state.getAttribute("mode").equals("toolProperties")) {
state.setAttribute("mode", "editTool");
}
}
/**
* Read the page form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readPageForm(RunData data, SessionState state)
{
// get the page - it's there
SitePage page = (SitePage) state.getAttribute("page");
// read the form
String title = StringUtil.trimToNull(data.getParameters().getString("title"));
page.setTitle(title);
try
{
// this comes in 1 based, convert to 0 based
int layout = Integer.parseInt(data.getParameters().getString("layout")) - 1;
page.setLayout(layout);
}
catch (Exception e)
{
Log.warn("chef", this + ".readPageForm(): reading layout: " + e);
}
boolean popup = data.getParameters().getBoolean("popup");
page.setPopup(popup);
boolean custom = data.getParameters().getBoolean("custom");
page.setTitleCustom(custom);
if (title == null)
{
addAlert(state, rb.getString("sitact.plespe"));
return false;
}
else
{
return true;
}
} // readPageForm
/**
* Read the properties form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readPropertiesForm(RunData data, SessionState state)
{
if(state.getAttribute("tool")!= null) {
return readToolPropertiesForm(data, state);
}
if(state.getAttribute("page")!= null) {
return readPagePropertiesForm(data, state);
}
if(state.getAttribute("site")!= null) {
return readSitePropertiesForm(data, state);
}
return true;
}
/**
* Read the properties form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readSitePropertiesForm(RunData data, SessionState state) {
// get the site
Site site = (Site) state.getAttribute("site");
ResourcePropertiesEdit props = site.getPropertiesEdit();
// check each property for possible update
for (Iterator i = props.getPropertyNames(); i.hasNext();)
{
String name = (String) i.next();
String formValue = StringUtil.trimToNull(data.getParameters().getString("param_" + name));
// update the properties or remove
if (formValue != null)
{
props.addProperty(name, formValue);
}
else
{
props.removeProperty(name);
}
}
// see if there's a new one
String formName = StringUtil.trimToNull(data.getParameters().getString("new_name"));
if (formName != null)
{
String formValue = StringUtil.trimToNull(data.getParameters().getString("new_value"));
if (formValue != null)
{
props.addProperty(formName, formValue);
}
}
return true;
}
/**
* Read the properties form and update the page in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readPagePropertiesForm(RunData data, SessionState state) {
// get the site
SitePage page = (SitePage) state.getAttribute("page");
ResourcePropertiesEdit props = page.getPropertiesEdit();
// check each property for possible update
for (Iterator i = props.getPropertyNames(); i.hasNext();)
{
String name = (String) i.next();
String formValue = StringUtil.trimToNull(data.getParameters().getString("param_" + name));
// update the properties or remove
if (formValue != null)
{
props.addProperty(name, formValue);
}
else
{
props.removeProperty(name);
}
}
// see if there's a new one
String formName = StringUtil.trimToNull(data.getParameters().getString("new_name"));
if (formName != null)
{
String formValue = StringUtil.trimToNull(data.getParameters().getString("new_value"));
if (formValue != null)
{
props.addProperty(formName, formValue);
}
}
return true;
}
/**
* Read the properties form and update the page in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readToolPropertiesForm(RunData data, SessionState state) {
// get the site
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
Tool t = tool.getTool();
//update properties
if (t != null)
{
// read in any params
for (Enumeration iParams = tool.getPlacementConfig().propertyNames(); iParams.hasMoreElements();)
{
String paramName = (String) iParams.nextElement();
String formValue = StringUtil.trimToNull(data.getParameters().getString("param_" + paramName));
// update the properties or remove
if (formValue != null)
{
tool.getPlacementConfig().setProperty(paramName, formValue);
}
else
{
tool.getPlacementConfig().remove(paramName);
}
}
}
// see if there's a new one
String formName = StringUtil.trimToNull(data.getParameters().getString("new_name"));
if (formName != null)
{
String formValue = StringUtil.trimToNull(data.getParameters().getString("new_value"));
if (formValue != null)
{
tool.getPlacementConfig().setProperty(formName, formValue);
}
}
return true;
}
/**
* Read the group form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readGroupForm(RunData data, SessionState state)
{
// get the group - it's there
Group group = (Group) state.getAttribute("group");
// read the form
String title = StringUtil.trimToNull(data.getParameters().getString("title"));
group.setTitle(title);
String description = StringUtil.trimToNull(data.getParameters().getString("description"));
group.setDescription(description);
if (title == null)
{
addAlert(state, rb.getString("sitgrp.plespe"));
return false;
}
else
{
return true;
}
} // readGroupForm
/**
* Switch to tools display mode within a site edit.
*/
public void doTools(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readPageForm(data, state)) return;
state.setAttribute("mode", "tools");
} // doTools
/**
* create a new tool in the page edit.
*/
public void doNew_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "newTool");
// make the tool so we have the id
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = page.addTool();
state.setAttribute("tool", tool);
// mark the site as new, so on cancel it can be deleted
state.setAttribute("newTool", "true");
} // doNew_tool
/**
* Edit an existing tool.
*/
public void doEdit_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editTool");
String id = data.getParameters().getString("id");
// get the tool
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = page.getTool(id);
state.setAttribute("tool", tool);
} // doEdit_tool
/**
* Move the tool up in the order.
*/
public void doEdit_tool_up(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
String id = data.getParameters().getString("id");
// get the tool
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = page.getTool(id);
// move it
tool.moveUp();
} // doEdit_tool_up
/**
* Move the tool down in the order.
*/
public void doEdit_tool_down(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
String id = data.getParameters().getString("id");
// get the tool
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = page.getTool(id);
// move it
tool.moveDown();
} // doEdit_tool_down
/**
* save the tool edited, and save the site edit.
*/
public void doSave_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the form - if rejected, leave things as they are
if (!readToolForm(data, state)) return;
// done with the tool
state.removeAttribute("tool");
// commit the entire site edit
doSave_edit(data, context);
} // doSave_tool
/**
* save the tool edited, and return to the tools mode
*/
public void doDone_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
if (!"POST".equals(data.getRequest().getMethod())) {
return;
}
// read the form - if rejected, leave things as they are
if (!readToolForm(data, state)) return;
// done with the tool
state.removeAttribute("tool");
// return to main mode
state.setAttribute("mode", "tools");
} // doDone_tool
/**
* save the tool's selected feature, continue editing the tool
*/
public void doDone_feature(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// read the form - if rejected, leave things as they are
if (!readToolFeatureForm(data, state)) return;
// go into edit mode
state.setAttribute("mode", "editTool");
} // doDone_feature
/**
* cancel a tool edit, return to the tools list
*/
public void doCancel_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
Site site = (Site) state.getAttribute("site");
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
// if the tool was new, remove it
if ("true".equals(state.getAttribute("newTool")))
{
page.removeTool(tool);
}
// %%% do we need the old tool around for a restore; did we already modify it? - ggolden
// done with the tool
state.removeAttribute("tool");
// return to tools mode
state.setAttribute("mode", "tools");
} // doCancel_tool
/**
* Handle a request to remove the tool being edited.
*/
public void doRemove_tool(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
SitePage page = (SitePage) state.getAttribute("page");
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
// remove the tool (no confirm)
page.removeTool(tool);
// done with the tool
state.removeAttribute("tool");
// return to tools mode
state.setAttribute("mode", "tools");
} // doRemove_tool
/**
* Switch back to edit page info mode from another edit mode (like tools).
*/
public void doEdit_to_page(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
state.setAttribute("mode", "editPage");
} // doEdit_to_page
/**
* Handle a request to regenerate the ids in the site under edit.
*/
public void doIds(RunData data, Context context)
{
SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid());
// get the site
Site site = (Site) state.getAttribute("site");
site.regenerateIds();
addAlert(state, rb.getString("sitact.thesit"));
}
/**
* Handle a Search request.
*/
public void doSearch(RunData runData, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) runData).getJs_peid();
SessionState state = ((JetspeedRunData) runData).getPortletSessionState(peid);
// clear the search(s)
state.removeAttribute(STATE_SEARCH);
state.removeAttribute(STATE_SEARCH_SITE_ID);
state.removeAttribute(STATE_SEARCH_USER_ID);
super.doSearch(runData, context);
} // doSearch
/**
* Handle a Search request - for site id
*/
public void doSearch_site_id(RunData runData, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) runData).getJs_peid();
SessionState state = ((JetspeedRunData) runData).getPortletSessionState(peid);
// clear the search(s)
state.removeAttribute(STATE_SEARCH);
state.removeAttribute(STATE_SEARCH_SITE_ID);
state.removeAttribute(STATE_SEARCH_USER_ID);
// read the search form field into the state object
String search = StringUtil.trimToNull(runData.getParameters().getString(FORM_SEARCH_SITEID));
// set the flag to go to the prev page on the next list
if (search != null)
{
state.setAttribute(STATE_SEARCH_SITE_ID, search);
}
} // doSearch_site_id
/**
* Handle a Search request - for user my workspace
*/
public void doSearch_user_id(RunData runData, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) runData).getJs_peid();
SessionState state = ((JetspeedRunData) runData).getPortletSessionState(peid);
// clear the search(s)
state.removeAttribute(STATE_SEARCH);
state.removeAttribute(STATE_SEARCH_SITE_ID);
state.removeAttribute(STATE_SEARCH_USER_ID);
// read the search form field into the state object
String search = StringUtil.trimToNull(runData.getParameters().getString(FORM_SEARCH_USERID));
// set the flag to go to the prev page on the next list
if (search != null)
{
state.setAttribute(STATE_SEARCH_USER_ID, search);
}
// start paging again from the top of the list
resetPaging(state);
} // doSearch_user_id
/**
* Handle a Search Clear request.
*/
public void doSearch_clear(RunData runData, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) runData).getJs_peid();
SessionState state = ((JetspeedRunData) runData).getPortletSessionState(peid);
// clear the search(s)
state.removeAttribute(STATE_SEARCH);
state.removeAttribute(STATE_SEARCH_SITE_ID);
state.removeAttribute(STATE_SEARCH_USER_ID);
// start paging again from the top of the list
resetPaging(state);
// turn on auto refresh
enableObserver(state);
} // doSearch_clear
/**
* Read the tool form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readToolForm(RunData data, SessionState state)
{
// get the tool - it's there
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
// read the form
String title = StringUtil.trimToNull(data.getParameters().getString("title"));
tool.setTitle(title);
// read the layout hints
String hints = StringUtil.trimToNull(data.getParameters().getString("layoutHints"));
if (hints != null)
{
// strip all whitespace
hints = hints.replaceAll("\\s",""); // strip all whitespace
}
tool.setLayoutHints(hints);
Tool t = tool.getTool();
if (t != null)
{
// read in any params
for (Enumeration iParams = t.getRegisteredConfig().propertyNames(); iParams.hasMoreElements();)
{
String paramName = (String) iParams.nextElement();
String formName = "param_" + paramName;
String value = data.getParameters().getString(formName);
if (value != null)
{
value = StringUtil.trimToNull(value);
// if we have a value
if (value != null)
{
// if this value is not the same as the tool's registered, set it in the placement
if (!value.equals(t.getRegisteredConfig().getProperty(paramName)))
{
tool.getPlacementConfig().setProperty(paramName, value);
}
// otherwise clear it
else
{
tool.getPlacementConfig().remove(paramName);
}
}
// if no value
else
{
tool.getPlacementConfig().remove(paramName);
}
}
}
}
else
{
addAlert(state, rb.getString("sitact.plesel"));
return false;
}
return true;
} // readToolForm
/**
* Read the tool feature form and update the site in state.
*
* @return true if the form is accepted, false if there's a validation error (an alertMessage will be set)
*/
private boolean readToolFeatureForm(RunData data, SessionState state)
{
// get the tool - it's there
ToolConfiguration tool = (ToolConfiguration) state.getAttribute("tool");
// read the form
String feature = data.getParameters().getString("feature");
// get this feature
Tool t = tool.getTool();
// if the feature has changed, update the default configuration
if ((t == null) || (!feature.equals(t.getId())))
{
tool.setTool(feature, ToolManager.getTool(feature));
tool.setTitle(ToolManager.getTool(feature).getTitle());
tool.getPlacementConfig().clear();
}
return true;
} // readToolFeatureForm
/**
* Clean up all possible state value when done an edit.
*/
private void cleanState(SessionState state)
{
state.removeAttribute("site");
state.removeAttribute("page");
state.removeAttribute("tool");
state.removeAttribute("new");
state.removeAttribute("newPage");
state.removeAttribute("newTool");
// clear the search, so after an edit or delete, the search is not automatically re-run
state.removeAttribute(STATE_SEARCH);
state.removeAttribute(STATE_SEARCH_SITE_ID);
state.removeAttribute(STATE_SEARCH_USER_ID);
} // cleanState
public boolean displaySiteAlias() {
if (ServerConfigurationService.getBoolean("wsetup.disable.siteAlias", false)) {
return false;
}
return true;
}
/**
* Create a list of the valid layout names.
*
* @return A List (String) of the value layout names.
*/
private List layoutsList()
{
List rv = new Vector();
String[] layoutNames = SiteService.getLayoutNames();
for (int i = 0; i < layoutNames.length; i++)
{
rv.add(layoutNames[i]);
}
return rv;
} // layoutsList
/**
* get one alias for site, if it exists
* @param channelReference
* @return
*/
private String getSiteAlias(String reference)
{
String alias = null;
if (reference != null)
{
// get the email alias when an Email Archive tool has been selected
List aliases = AliasService.getAliases(reference, 1, 1);
if (aliases.size() > 0) {
alias = ((Alias) aliases.get(0)).getId();
}
}
return alias;
}
private void setSiteAlias(String alias, String siteReference, SessionState state)
{
/*
* The point of these site aliases is to have easy-to-recall,
* easy-to-guess URLs. So we take a very conservative approach
* here and disallow any aliases which would require special
* encoding or would simply be ignored when building a valid
* resource reference or outputting that reference as a URL.
*/
boolean isSimpleResourceName = alias.equals(Validator.escapeResourceName(alias));
boolean isSimpleUrl = alias.equals(Validator.escapeUrl(alias));
if ( !(isSimpleResourceName) || !(isSimpleUrl) ) {
addAlert(state, rb.getFormattedMessage("sitedipag.alias.isinval", new Object[]{alias}));
M_log.warn(this + ".updateSiteInfo: " + rb.getFormattedMessage("sitedipag.alias.isinval", new Object[]{alias}));
}
else if (StringUtil.trimToNull(alias) != null && StringUtil.trimToNull(siteReference) != null)
{
String currentAlias = StringUtil.trimToNull(getSiteAlias(siteReference));
if (currentAlias == null || !currentAlias.equals(alias))
{
try {
AliasService.setAlias(alias, siteReference);
} catch (IdUsedException ee) {
addAlert(state, rb.getFormattedMessage("sitedipag.alias.exists", new Object[]{alias}));
M_log.warn(this + ".setSiteAlias: " + rb.getFormattedMessage("sitedipag.alias.exists", new Object[]{alias}));
} catch (IdInvalidException ee) {
addAlert(state, rb.getFormattedMessage("sitedipag.alias.isinval", new Object[]{alias}));
M_log.warn(this + ".setSiteAlias: " + rb.getFormattedMessage("sitedipag.alias.isinval", new Object[]{alias}));
} catch (PermissionException ee) {
addAlert(state, rb.getFormattedMessage("sitedipag.alias.nopermission", new Object[]{SessionManager.getCurrentSessionUserId()}));
M_log.warn(this + ".setSiteAlias: " + rb.getFormattedMessage("sitedipag.alias.nopermission", new Object[]{SessionManager.getCurrentSessionUserId()}));
}
}
}
}
}