001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Portal/Sources/es/udc/mypersonalizer/portal/controller/actions/content/AddWorkspaceAction.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.conventions.UserAndGroupConventions;
045: import es.udc.mypersonalizer.kernel.model.actions.ActionProcessorSingleton;
046: import es.udc.mypersonalizer.kernel.model.editors.DesktopLayoutEditor;
047: import es.udc.mypersonalizer.kernel.model.editors.EditorFactory;
048: import es.udc.mypersonalizer.kernel.model.repository.interfaces.DesktopLayout;
049: import es.udc.mypersonalizer.kernel.model.repository.interfaces.WorkspaceLayout;
050: import es.udc.mypersonalizer.kernel.util.exceptions.ActionNotAllowedException;
051: import es.udc.mypersonalizer.kernel.util.exceptions.InternalErrorException;
052: import es.udc.mypersonalizer.portal.controller.session.SessionIdentifierCookieManagerSingleton;
053: import es.udc.mypersonalizer.portal.controller.session.SessionManager;
054: import es.udc.mypersonalizer.portal.conventions.RequestParameterConventions;
055: import es.udc.mypersonalizer.portal.model.permissions.UserCredentials;
056: import es.udc.mypersonalizer.portal.model.types.content.AddWorkspaceEvent;
057: import es.udc.mypersonalizer.portal.model.types.content.AddWorkspaceResult;
058: import java.util.*;
059: import javax.servlet.http.HttpServletRequest;
060: import javax.servlet.http.HttpServletResponse;
061: import org.apache.commons.beanutils.PropertyUtils;
062: import org.apache.struts.action.ActionErrors;
063: import org.apache.struts.action.ActionForm;
064: import org.apache.struts.action.ActionForward;
065: import org.apache.struts.action.ActionMapping;
066:
067: /**
068: * This action adds a workspace to the user's desktop. If the user is a normal
069: * user, this action can add one of the workspaces that the
070: * <tt>mypersonalizer</tt> user already has, adding also the same services and
071: * with the same layout. If the user is <tt>mypersonalizer</tt>, adds one of
072: * the WorkspaceDefinitions that the system has, creating an empty
073: * workspace. It calls the model action called
074: * <tt>AddWorkspaceAction</tt>, which must be registered in configuration.
075: * It also performs the adequate updates in the session (changes the desktop
076: * layout, the available workspaces....)<p>
077: *
078: * It receives as a parameter a struts action form which must have been
079: * populated with the following data:
080: * <ul>
081: * <li><tt>workspace</tt>: If the user is "mypersonalizer", this parameter
082: * will contain the "workspace type" of the workspace to be added. If
083: * it is a normal user, it will be the identifier
084: * of the mypersonalizer workspace that must be cloned to create the new
085: * one.</li>
086: * <li><tt>workspaceName</tt>: (OPTIONAL) The name the user wants to
087: * assign to the new workspace.</li>
088: * </ul>
089: *
090: * This action requires a <tt>Success</tt> forward, which will usually point
091: * to the action which shows the desktop contents to the user to let him/her
092: * change them, which is usully called <tt>ChangeDesktopContent.do</tt>.<p>
093: *
094: * @author Daniel Fernandez
095: * @since 1.0
096: */
097: public class AddWorkspaceAction extends DefaultAction {
098:
099: /**
100: * Name of the model action for adding a workspace.
101: * This is "AddWorkspaceAction".
102: */
103: private static final String ADD_WORKSPACE_ACTION = "AddWorkspaceAction";
104:
105: protected ActionForward doExecute(ActionMapping mapping,
106: ActionForm form, HttpServletRequest request,
107: HttpServletResponse response) throws Exception {
108:
109: ActionErrors errors = new ActionErrors();
110:
111: try {
112:
113: ActionProcessorSingleton actionProcessorSingleton = ActionProcessorSingleton
114: .getInstance();
115:
116: UserCredentials userCredentials = SessionManager
117: .getUserCredentials(request);
118:
119: /*
120: * This variable will indicate whether the user is
121: * mypersonalizer or not.
122: */
123: boolean isMyPersonalizer = userCredentials
124: .getLoginName()
125: .equals(
126: UserAndGroupConventions.MYPERSONALIZER_LOGIN_NAME);
127:
128: /* We get the action parameters from the action form */
129: String workspace = (String) PropertyUtils
130: .getSimpleProperty(form,
131: RequestParameterConventions.WORKSPACE);
132:
133: if ((workspace == null) || (workspace.trim().equals(""))) {
134: throw new InternalErrorException(
135: "Badly formed parameters");
136: }
137:
138: Long workspaceLayoutIdentifier = null;
139: String workspaceType = null;
140:
141: if (isMyPersonalizer) {
142: workspaceType = workspace;
143: } else {
144: try {
145: workspaceLayoutIdentifier = new Long(workspace);
146: } catch (Exception e) {
147: throw new InternalErrorException(
148: "Badly formed parameters");
149: }
150: }
151:
152: String workspaceName = null;
153: try {
154: workspaceName = (String) PropertyUtils
155: .getSimpleProperty(
156: form,
157: RequestParameterConventions.WORKSPACE_NAME);
158: } catch (NoSuchMethodException e) {
159: }
160:
161: /* We check the correctness of the workspaceName */
162: if ((workspaceName != null)
163: && (workspaceName.trim().equals(""))) {
164: workspaceName = null;
165: }
166:
167: /*
168: * We get the desktopLayout from the Session, as we need its
169: * timeStamp and identifier.
170: */
171: DesktopLayout desktopLayout = SessionManager
172: .getDesktopLayout(request);
173: EditorFactory editorFactory = EditorFactory.getInstance();
174: DesktopLayoutEditor desktopLayoutEditor = editorFactory
175: .createDesktopLayoutEditor(desktopLayout
176: .getProperty());
177:
178: Long desktopLayoutIdentifier = desktopLayout
179: .getIdentifier();
180: Long timeStamp = desktopLayoutEditor.getTimeStamp();
181:
182: /*
183: * New we create the event, which will be different depending
184: * on whether the user is mypersonalizer or not.
185: */
186: AddWorkspaceEvent addWorkspaceEvent = null;
187:
188: if (isMyPersonalizer) {
189: addWorkspaceEvent = new AddWorkspaceEvent(
190: userCredentials, desktopLayoutIdentifier,
191: workspaceType, workspaceName, timeStamp);
192: } else {
193: addWorkspaceEvent = new AddWorkspaceEvent(
194: userCredentials, desktopLayoutIdentifier,
195: workspaceLayoutIdentifier, workspaceName,
196: timeStamp);
197: }
198:
199: /*
200: * We execute the action
201: */
202: AddWorkspaceResult addWorkspaceResult = (AddWorkspaceResult) actionProcessorSingleton
203: .execute(ADD_WORKSPACE_ACTION, addWorkspaceEvent);
204:
205: /*
206: * We get the data from the action result.
207: */
208: DesktopLayout newDesktopLayout = addWorkspaceResult
209: .getDesktopLayout();
210: WorkspaceLayout newWorkspaceLayout = addWorkspaceResult
211: .getNewWorkspaceLayout();
212: Collection newServiceButtonsStates = addWorkspaceResult
213: .getNewServiceButtonsStates();
214:
215: /*
216: * We check if the user had workspaces previously
217: */
218: boolean workspacesExistedPreviously = SessionManager
219: .getUserHasWorkspaces(request);
220:
221: /*
222: * And we put the data into the session.
223: */
224: SessionManager.setDesktopLayout(request, newDesktopLayout);
225: SessionManager.addAvailableWorkspace(request,
226: newWorkspaceLayout);
227:
228: if (!workspacesExistedPreviously) {
229:
230: SessionManager.setCurrentWorkspace(request,
231: newWorkspaceLayout, newServiceButtonsStates);
232:
233: /*
234: * The session cookie, which contains the current workspace
235: * identifier, is updated.
236: */
237: SessionIdentifierCookieManagerSingleton sessionIdentifierCookieManagerSingleton = SessionIdentifierCookieManagerSingleton
238: .getInstance();
239:
240: sessionIdentifierCookieManagerSingleton
241: .updateCookieWorkspace(request, response,
242: userCredentials.getLoginName(),
243: newWorkspaceLayout.getIdentifier());
244:
245: }
246:
247: } catch (ActionNotAllowedException e) {
248: /*
249: * This cannot happen, as the user is only shown the workspaces
250: * which he / she can add. If this happens, something tricky is
251: * being made with URLs.
252: */
253: throw new InternalErrorException(e);
254: }
255:
256: return mapping
257: .findForward(DefaultAction.ACTION_SUCCESS_FORWARD);
258: }
259:
260: }
|