001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.dynamicdatalists.action;
016    
017    import com.liferay.portal.kernel.servlet.SessionErrors;
018    import com.liferay.portal.kernel.upload.UploadPortletRequest;
019    import com.liferay.portal.kernel.util.Constants;
020    import com.liferay.portal.kernel.util.ParamUtil;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.security.auth.PrincipalException;
023    import com.liferay.portal.service.ServiceContext;
024    import com.liferay.portal.service.ServiceContextFactory;
025    import com.liferay.portal.struts.PortletAction;
026    import com.liferay.portal.theme.ThemeDisplay;
027    import com.liferay.portal.util.PortalUtil;
028    import com.liferay.portal.util.WebKeys;
029    import com.liferay.portlet.documentlibrary.FileSizeException;
030    import com.liferay.portlet.dynamicdatalists.NoSuchRecordException;
031    import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
032    import com.liferay.portlet.dynamicdatalists.model.DDLRecordConstants;
033    import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
034    import com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalServiceUtil;
035    import com.liferay.portlet.dynamicdatalists.service.DDLRecordServiceUtil;
036    import com.liferay.portlet.dynamicdatalists.service.DDLRecordSetLocalServiceUtil;
037    import com.liferay.portlet.dynamicdatalists.util.DDLUtil;
038    import com.liferay.portlet.dynamicdatamapping.StorageFieldRequiredException;
039    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
040    import com.liferay.portlet.dynamicdatamapping.storage.Field;
041    import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
042    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
043    
044    import java.io.Serializable;
045    
046    import javax.portlet.ActionRequest;
047    import javax.portlet.ActionResponse;
048    import javax.portlet.PortletConfig;
049    import javax.portlet.RenderRequest;
050    import javax.portlet.RenderResponse;
051    
052    import org.apache.struts.action.ActionForm;
053    import org.apache.struts.action.ActionForward;
054    import org.apache.struts.action.ActionMapping;
055    
056    /**
057     * @author Marcellus Tavares
058     * @author Eduardo Lundgren
059     */
060    public class EditRecordAction extends PortletAction {
061    
062            @Override
063            public void processAction(
064                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
065                            ActionRequest actionRequest, ActionResponse actionResponse)
066                    throws Exception {
067    
068                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
069    
070                    try {
071                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
072                                    updateRecord(actionRequest);
073                            }
074                            else if (cmd.equals(Constants.DELETE)) {
075                                    deleteRecord(actionRequest);
076                            }
077                            else if (cmd.equals(Constants.REVERT)) {
078                                    revertRecordVersion(actionRequest);
079                            }
080    
081                            if (Validator.isNotNull(cmd)) {
082                                    sendRedirect(actionRequest, actionResponse);
083                            }
084                    }
085                    catch (Exception e) {
086                            if (e instanceof NoSuchRecordException ||
087                                    e instanceof PrincipalException) {
088    
089                                    SessionErrors.add(actionRequest, e.getClass().getName());
090    
091                                    setForward(actionRequest, "portlet.dynamic_data_lists.error");
092                            }
093                            else if (e instanceof FileSizeException ||
094                                             e instanceof StorageFieldRequiredException) {
095    
096                                    SessionErrors.add(actionRequest, e.getClass().getName());
097                            }
098                            else {
099                                    throw e;
100                            }
101                    }
102            }
103    
104            @Override
105            public ActionForward render(
106                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
107                            RenderRequest renderRequest, RenderResponse renderResponse)
108                    throws Exception {
109    
110                    try {
111                            ActionUtil.getRecord(renderRequest);
112                    }
113                    catch (Exception e) {
114                            if (e instanceof NoSuchRecordException ||
115                                    e instanceof PrincipalException) {
116    
117                                    SessionErrors.add(renderRequest, e.getClass().getName());
118    
119                                    return mapping.findForward("portlet.dynamic_data_lists.error");
120                            }
121                            else {
122                                    throw e;
123                            }
124                    }
125    
126                    return mapping.findForward(
127                            getForward(
128                                    renderRequest, "portlet.dynamic_data_lists.edit_record"));
129            }
130    
131            protected void deleteRecord(ActionRequest actionRequest)
132                    throws Exception {
133    
134                    long recordId = ParamUtil.getLong(actionRequest, "recordId");
135    
136                    DDLRecordLocalServiceUtil.deleteRecord(recordId);
137            }
138    
139            protected void revertRecordVersion(ActionRequest actionRequest)
140                    throws Exception {
141    
142                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
143                            WebKeys.THEME_DISPLAY);
144    
145                    long recordId = ParamUtil.getLong(actionRequest, "recordId");
146    
147                    String version = ParamUtil.getString(actionRequest, "version");
148    
149                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
150                            DDLRecord.class.getName(), actionRequest);
151    
152                    DDLRecordLocalServiceUtil.revertRecordVersion(
153                            themeDisplay.getUserId(), recordId, version, serviceContext);
154            }
155    
156            protected DDLRecord updateRecord(ActionRequest actionRequest)
157                    throws Exception {
158    
159                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
160                            WebKeys.THEME_DISPLAY);
161    
162                    long recordId = ParamUtil.getLong(actionRequest, "recordId");
163    
164                    long recordSetId = ParamUtil.getLong(actionRequest, "recordSetId");
165                    boolean majorVersion = ParamUtil.getBoolean(
166                            actionRequest, "majorVersion");
167    
168                    DDLRecord record = DDLRecordLocalServiceUtil.fetchRecord(recordId);
169    
170                    DDLRecordSet recordSet = DDLRecordSetLocalServiceUtil.getRecordSet(
171                            recordSetId);
172    
173                    DDMStructure ddmStructure = recordSet.getDDMStructure();
174    
175                    Fields fields = new Fields();
176    
177                    for (String fieldName : ddmStructure.getFieldNames()) {
178                            String fieldDataType = ddmStructure.getFieldDataType(fieldName);
179                            String fieldValue = ParamUtil.getString(actionRequest, fieldName);
180    
181                            if (fieldDataType.equals(FieldConstants.FILE_UPLOAD)) {
182                                    continue;
183                            }
184    
185                            Serializable fieldValueSerializable =
186                                    FieldConstants.getSerializable(fieldDataType, fieldValue);
187    
188                            Field field = new Field(
189                                    ddmStructure.getStructureId(), fieldName,
190                                    fieldValueSerializable);
191    
192                            fields.put(field);
193                    }
194    
195                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
196                            DDLRecord.class.getName(), actionRequest);
197    
198                    if (record != null) {
199                            record = DDLRecordServiceUtil.updateRecord(
200                                    recordId, majorVersion,
201                                    DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields, false,
202                                    serviceContext);
203                    }
204                    else {
205                            record = DDLRecordServiceUtil.addRecord(
206                                    themeDisplay.getScopeGroupId(), recordSetId,
207                                    DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields,
208                                    serviceContext);
209                    }
210    
211                    UploadPortletRequest uploadPortletRequest =
212                            PortalUtil.getUploadPortletRequest(actionRequest);
213    
214                    DDLUtil.uploadRecordFiles(record, uploadPortletRequest, serviceContext);
215    
216                    return record;
217            }
218    
219    }