001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Admin/Sources/es/udc/mypersonalizer/admin/http/controller/actions/propertyeditor/ProcessEditPropertyCompoundValueAction.java,v 1.1.1.1 2004/03/25 12:08:38 fbellas Exp $
003: * $Revision: 1.1.1.1 $
004: * $Date: 2004/03/25 12:08:38 $
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.admin.http.controller.actions.propertyeditor;
042:
043: import java.util.Collection;
044: import java.util.Iterator;
045: import java.util.Map;
046: import java.util.HashMap;
047:
048: import javax.servlet.http.HttpServletRequest;
049: import javax.servlet.http.HttpServletResponse;
050:
051: import org.apache.struts.action.ActionForm;
052: import org.apache.struts.action.ActionMapping;
053: import org.apache.struts.action.ActionForward;
054:
055: import es.udc.mypersonalizer.kernel.model.metainfo.MetaProperty;
056: import es.udc.mypersonalizer.kernel.model.properties.Property;
057: import es.udc.mypersonalizer.kernel.model.properties.CompoundProperty;
058: import es.udc.mypersonalizer.kernel.model.properties.IllegalStringValuesException;
059:
060: import es.udc.mypersonalizer.admin.http.controller.actions.propertyeditor.interfaces.PropertyEditorConfigurationRegistry;
061: import es.udc.mypersonalizer.admin.http.controller.actions.propertyeditor.interfaces.PropertyAccessStrategy;
062: import es.udc.mypersonalizer.admin.http.controller.actions.propertyeditor.util.PropertyEditorHelper;
063: import es.udc.mypersonalizer.admin.http.controller.actions.util.ControllerHelper;
064: import es.udc.mypersonalizer.admin.http.view.actionforms.propertyeditor.EditPropertyValueForm;
065: import es.udc.mypersonalizer.admin.http.view.viewobjects.propertyeditor.ViewProperty;
066:
067: /**
068: * This action is invoked to edit the value of a <code>CompoundProperty</code>.
069: * It retrieves its parameters from {@link EditPropertyValueForm}, then it
070: * processes new values for each contained property and updates it.
071: * <p>
072: * After the above, it redirects to <code>UpdateCompoundProperty</code> action
073: * else returns to the previous frm.
074: * <p>
075: * Of course, properties updated are only those simple and single-valued of
076: * the current compound property value. Multi-valued and compound ones are
077: * not updated because the user can only give new values to properties that
078: * are simple and single-valued using text boxes, if the property is not of
079: * this kind, the JSP page displays links for editing the properties instead
080: * of text-boxes.
081: *
082: * @author Abel Iago Toral Quiroga
083: * @since 1.0
084: */
085: public class ProcessEditPropertyCompoundValueAction extends
086: PropertyEditorAction {
087:
088: protected ActionForward doExecuteWork(ActionMapping mapping,
089: ActionForm form, HttpServletRequest request,
090: HttpServletResponse response) throws Exception {
091:
092: /* Get parameters */
093: EditPropertyValueForm frm = (EditPropertyValueForm) form;
094: String peConfigurationIdentifier = frm.getPeConfId();
095: String serviceIdentifier = frm.getServId();
096: String propertyIdentifier = frm.getPropId();
097: String propertyStructureName = frm.getPropertyStructureName();
098: String propertySimpleName = frm.getPropertySimpleName();
099:
100: /* Get simple and single-valued properties to modify */
101: String[] simpleNames = frm.getSimpleNames();
102:
103: /* Get index of the value of this compound property to update */
104: int index = frm.getIndex();
105:
106: /* Get property access strategy */
107: PropertyAccessStrategy propertyAccessStrategy = PropertyEditorConfigurationRegistry
108: .getConfiguration(peConfigurationIdentifier)
109: .getPropertyAccessStrategy();
110:
111: /* Get the root property that is being edited */
112: Property rootProperty = propertyAccessStrategy.findProperty(
113: request, propertyIdentifier);
114:
115: /* Update propertyStructrueName with current compound property */
116: String currentPropertyStructureName = propertyStructureName;
117: if (!propertyStructureName.equals("")) {
118: currentPropertyStructureName += "." + propertySimpleName
119: + ".";
120: }
121: currentPropertyStructureName += index;
122:
123: /* Create a map with updated properties */
124: Map updatedProperties = new HashMap();
125:
126: /* Modify property of the current property */
127: Map formattedErrorMessages = new HashMap();
128: int i = 0;
129: while (i < simpleNames.length) {
130: /* Get the name of the property to modify and its new value */
131: String simpleName = (String) simpleNames[i];
132: String singleValue = request.getParameter(simpleName);
133:
134: /* Add property to map of updated properties */
135: PropertyEditorHelper.addUpdatedProperty(updatedProperties,
136: currentPropertyStructureName, simpleName,
137: singleValue);
138:
139: /* Get the property to modify */
140: Property currentProperty = PropertyEditorHelper
141: .findProperty(rootProperty,
142: currentPropertyStructureName, simpleName);
143:
144: /* Confirm a valid value */
145: String[] valuesAsString = null;
146: if ((singleValue != null) && (singleValue.length() > 0)) {
147: valuesAsString = new String[1];
148: valuesAsString[0] = singleValue;
149: } else {
150: valuesAsString = new String[0];
151: }
152:
153: /* Set the new property value */
154: try {
155: currentProperty.setValuesAsString(valuesAsString);
156: } catch (IllegalStringValuesException e) {
157: String formattedErrorMessage = ControllerHelper
158: .getFormattedErrorMessage(
159: getResources(request),
160: "ErrorMessages.incorrectValue");
161: formattedErrorMessages.put(simpleName,
162: formattedErrorMessage);
163: }
164: i++;
165: }
166:
167: /* Check for specific strategy errors */
168: if (formattedErrorMessages.size() == 0) {
169: Map validateErrors = propertyAccessStrategy
170: .validateProperties(propertyIdentifier,
171: rootProperty, updatedProperties);
172: formattedErrorMessages = PropertyEditorHelper
173: .getFormattedErrorMessages(getResources(request),
174: validateErrors);
175: }
176:
177: /* Do forward */
178: if (formattedErrorMessages.size() == 0) {
179: propertyAccessStrategy.updateProperty(request,
180: propertyIdentifier, rootProperty);
181:
182: return PropertyEditorHelper
183: .getReturnToUpdatePropertyForward(mapping,
184: "UpdateCompoundProperty",
185: peConfigurationIdentifier,
186: serviceIdentifier, propertyIdentifier,
187: propertyStructureName, propertySimpleName);
188:
189: } else {
190: /* Create a view-object with properties information to
191: return to previous frm */
192: MetaProperty metaCompoundProperty = PropertyEditorHelper
193: .findMetaProperty(serviceIdentifier,
194: propertyStructureName, propertySimpleName);
195:
196: Property property = PropertyEditorHelper.findProperty(
197: rootProperty, propertyStructureName,
198: propertySimpleName);
199:
200: Collection viewPropertiesList = PropertyEditorHelper
201: .getViewPropertiesList((CompoundProperty) property,
202: metaCompoundProperty, index);
203:
204: /* Check properties that had been gived an incorrect value */
205: Iterator iterator = viewPropertiesList.iterator();
206: while (iterator.hasNext()) {
207: ViewProperty viewProperty = (ViewProperty) iterator
208: .next();
209: String propertyName = viewProperty.getSimpleName();
210: if (formattedErrorMessages.get(propertyName) != null) {
211: viewProperty
212: .setFormattedErrorMessage((String) formattedErrorMessages
213: .get(propertyName));
214: }
215: }
216:
217: /* Return to previous frm */
218: request.setAttribute("properties", viewPropertiesList);
219: return mapping.findForward("EditPropertyCompoundValueJSP");
220: }
221: }
222: }
|