001
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
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 }