001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Portal/Sources/es/udc/mypersonalizer/portal/controller/actions/content/ChangeWorkspacesOrderAction.java,v 1.1.1.1 2004/03/25 12:08:40 fbellas Exp $
003: * $Revision: 1.1.1.1 $
004: * $Date: 2004/03/25 12:08:40 $
005: *
006: * =============================================================================
007: *
008: * Copyright (c) 2003, The MyPersonalizer Development Group
009: * (http://www.tic.udc.es/~fbellas/mypersonalizer/index.html) at
010: * University Of A Coruna
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * - Redistributions of source code must retain the above copyright notice,
017: * this list of conditions and the following disclaimer.
018: *
019: * - Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * - Neither the name of the University Of A Coruna nor the names of its
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
028: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
029: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
030: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
031: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
032: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
033: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
034: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
035: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
036: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
037: * POSSIBILITY OF SUCH DAMAGE.
038: *
039: */
040:
041: package es.udc.mypersonalizer.portal.controller.actions.content;
042:
043: import es.udc.mypersonalizer.kernel.controller.actions.DefaultAction;
044: import es.udc.mypersonalizer.kernel.model.actions.ActionProcessorSingleton;
045: import es.udc.mypersonalizer.kernel.model.editors.DesktopLayoutEditor;
046: import es.udc.mypersonalizer.kernel.model.editors.EditorFactory;
047: import es.udc.mypersonalizer.kernel.model.repository.interfaces.DesktopLayout;
048: import es.udc.mypersonalizer.kernel.util.exceptions.InstanceNotFoundException;
049: import es.udc.mypersonalizer.kernel.util.exceptions.InternalErrorException;
050: import es.udc.mypersonalizer.portal.controller.session.KeyChecker;
051: import es.udc.mypersonalizer.portal.controller.session.SessionManager;
052: import es.udc.mypersonalizer.portal.conventions.RequestParameterConventions;
053: import es.udc.mypersonalizer.portal.model.permissions.UserCredentials;
054: import es.udc.mypersonalizer.portal.model.types.content.ChangeWorkspacesOrderEvent;
055: import java.util.*;
056: import javax.servlet.http.HttpServletRequest;
057: import javax.servlet.http.HttpServletResponse;
058: import org.apache.commons.beanutils.PropertyUtils;
059: import org.apache.struts.action.ActionForm;
060: import org.apache.struts.action.ActionForward;
061: import org.apache.struts.action.ActionMapping;
062:
063: /**
064: * This action changes the order in which workspace layouts are displayed to
065: * the user by changing the order in which they're stored by the DesktopLayout.
066: * It calls the model action called <tt>ChangeWorkspacesOrderAction</tt>,
067: * which must be registered in configuration. It also changes the needed data
068: * in the session: the desktop layout and the list of available workspaces.<p>
069: *
070: * It receives as a parameter a struts action form which must have been
071: * populated with the following data:
072: * <ul>
073: * <li><tt>workspaceLayoutIdentifiers</tt>: A comma-separated list containing
074: * the identifiers of the workspace layouts, in the order in which the
075: * user wants them to appear.</li>
076: * </ul>
077: *
078: * This action requires a <tt>Success</tt> forward, which will usually point
079: * to to the action which shows the desktop contents to the user to let him/her
080: * change them, which is usully called <tt>ChangeDesktopContent.do</tt>.<p>
081: *
082: * @author Daniel Fernandez
083: * @since 1.0
084: */
085: public class ChangeWorkspacesOrderAction extends DefaultAction {
086:
087: /**
088: * Name of the model action for changing the order of the workspaces.
089: * This is "ChangeWorkspacesOrderAction".
090: */
091: private static final String CHANGE_WORKSPACES_ORDER_ACTION = "ChangeWorkspacesOrderAction";
092:
093: protected ActionForward doExecute(ActionMapping mapping,
094: ActionForm form, HttpServletRequest request,
095: HttpServletResponse response) throws Exception {
096:
097: ActionProcessorSingleton actionProcessorSingleton = ActionProcessorSingleton
098: .getInstance();
099:
100: UserCredentials userCredentials = SessionManager
101: .getUserCredentials(request);
102:
103: /* We get the action parameters from the action form */
104: String workspaceLayoutIdentifiersStr = (String) PropertyUtils
105: .getSimpleProperty(
106: form,
107: RequestParameterConventions.WORKSPACE_LAYOUT_IDENTIFIERS);
108: StringTokenizer parameterTokens = new StringTokenizer(
109: workspaceLayoutIdentifiersStr, ", ");
110: List workspaceLayoutIdentifiers = new ArrayList();
111: try {
112: while (parameterTokens.hasMoreTokens()) {
113:
114: Long currentWorkspaceLayoutIdentifier = new Long(
115: parameterTokens.nextToken());
116:
117: /*
118: * We have to check whether the workspace is one of the
119: * valid ones for the user's desktop.
120: */
121: if (!KeyChecker.isValidWorkspaceLayoutIdentifier(
122: request, currentWorkspaceLayoutIdentifier)) {
123: throw new InstanceNotFoundException(
124: currentWorkspaceLayoutIdentifier,
125: "WorkspaceLayout");
126: }
127:
128: workspaceLayoutIdentifiers
129: .add(currentWorkspaceLayoutIdentifier);
130:
131: }
132: } catch (InstanceNotFoundException e) {
133: throw e;
134: } catch (Exception e) {
135: throw new InternalErrorException("Badly formed parameters");
136: }
137:
138: /*
139: * If there are no workspaces, this action cannot be executed.
140: */
141: if (!SessionManager.getUserHasWorkspaces(request)) {
142: throw new NoActiveWorkspacesException(
143: "Cannot change order: " + "no workspaces present");
144: }
145:
146: /*
147: * We get the desktopLayout from the Session, as we need its
148: * timeStamp and identifier.
149: */
150: DesktopLayout desktopLayout = SessionManager
151: .getDesktopLayout(request);
152: EditorFactory editorFactory = EditorFactory.getInstance();
153: DesktopLayoutEditor desktopLayoutEditor = editorFactory
154: .createDesktopLayoutEditor(desktopLayout.getProperty());
155:
156: Long desktopLayoutIdentifier = desktopLayout.getIdentifier();
157: Long timeStamp = desktopLayoutEditor.getTimeStamp();
158:
159: ChangeWorkspacesOrderEvent changeWorkspacesOrderEvent = new ChangeWorkspacesOrderEvent(
160: userCredentials, desktopLayoutIdentifier,
161: workspaceLayoutIdentifiers, timeStamp);
162:
163: DesktopLayout newDesktopLayout = (DesktopLayout) actionProcessorSingleton
164: .execute(CHANGE_WORKSPACES_ORDER_ACTION,
165: changeWorkspacesOrderEvent);
166:
167: /*
168: * And we put the data into the session.
169: */
170: SessionManager.setDesktopLayout(request, newDesktopLayout);
171: SessionManager.reOrderAvailableWorkspaces(request);
172:
173: return mapping
174: .findForward(DefaultAction.ACTION_SUCCESS_FORWARD);
175: }
176:
177: }
|