001
014
015 package com.liferay.portlet.dynamicdatamapping.action;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.servlet.SessionErrors;
020 import com.liferay.portal.kernel.servlet.SessionMessages;
021 import com.liferay.portal.kernel.template.TemplateConstants;
022 import com.liferay.portal.kernel.upload.UploadPortletRequest;
023 import com.liferay.portal.kernel.util.Constants;
024 import com.liferay.portal.kernel.util.FileUtil;
025 import com.liferay.portal.kernel.util.HttpUtil;
026 import com.liferay.portal.kernel.util.LocalizationUtil;
027 import com.liferay.portal.kernel.util.ParamUtil;
028 import com.liferay.portal.kernel.util.StreamUtil;
029 import com.liferay.portal.kernel.util.StringUtil;
030 import com.liferay.portal.kernel.util.Validator;
031 import com.liferay.portal.security.auth.PrincipalException;
032 import com.liferay.portal.service.ServiceContext;
033 import com.liferay.portal.service.ServiceContextFactory;
034 import com.liferay.portal.struts.PortletAction;
035 import com.liferay.portal.theme.ThemeDisplay;
036 import com.liferay.portal.util.PortalUtil;
037 import com.liferay.portal.util.WebKeys;
038 import com.liferay.portlet.PortletURLImpl;
039 import com.liferay.portlet.dynamicdatamapping.NoSuchTemplateException;
040 import com.liferay.portlet.dynamicdatamapping.RequiredTemplateException;
041 import com.liferay.portlet.dynamicdatamapping.TemplateNameException;
042 import com.liferay.portlet.dynamicdatamapping.TemplateScriptException;
043 import com.liferay.portlet.dynamicdatamapping.TemplateSmallImageNameException;
044 import com.liferay.portlet.dynamicdatamapping.TemplateSmallImageSizeException;
045 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
046 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
047 import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateServiceUtil;
048
049 import java.io.File;
050 import java.io.IOException;
051 import java.io.InputStream;
052
053 import java.util.Locale;
054 import java.util.Map;
055
056 import javax.portlet.ActionRequest;
057 import javax.portlet.ActionResponse;
058 import javax.portlet.PortletConfig;
059 import javax.portlet.PortletPreferences;
060 import javax.portlet.PortletRequest;
061 import javax.portlet.RenderRequest;
062 import javax.portlet.RenderResponse;
063
064 import org.apache.struts.action.ActionForm;
065 import org.apache.struts.action.ActionForward;
066 import org.apache.struts.action.ActionMapping;
067
068
071 public class EditTemplateAction extends PortletAction {
072
073 @Override
074 public void processAction(
075 ActionMapping actionMapping, ActionForm actionForm,
076 PortletConfig portletConfig, ActionRequest actionRequest,
077 ActionResponse actionResponse)
078 throws Exception {
079
080 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
081
082 DDMTemplate template = null;
083
084 try {
085 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
086 template = updateTemplate(actionRequest);
087 }
088 else if (cmd.equals(Constants.DELETE)) {
089 deleteTemplates(actionRequest);
090 }
091
092 if (Validator.isNotNull(cmd)) {
093 String redirect = ParamUtil.getString(
094 actionRequest, "redirect");
095 String closeRedirect = ParamUtil.getString(
096 actionRequest, "closeRedirect");
097
098 if (Validator.isNotNull(closeRedirect)) {
099 redirect = HttpUtil.setParameter(
100 redirect, "closeRedirect", closeRedirect);
101
102 SessionMessages.add(
103 actionRequest,
104 PortalUtil.getPortletId(actionRequest) +
105 SessionMessages.KEY_SUFFIX_CLOSE_REDIRECT,
106 closeRedirect);
107 }
108
109 if (template != null) {
110 boolean saveAndContinue = ParamUtil.getBoolean(
111 actionRequest, "saveAndContinue");
112
113 if (saveAndContinue) {
114 redirect = getSaveAndContinueRedirect(
115 portletConfig, actionRequest, template, redirect);
116 }
117 }
118
119 sendRedirect(actionRequest, actionResponse, redirect);
120 }
121 }
122 catch (Exception e) {
123 if (e instanceof NoSuchTemplateException ||
124 e instanceof PrincipalException) {
125
126 SessionErrors.add(actionRequest, e.getClass());
127
128 setForward(actionRequest, "portlet.dynamic_data_mapping.error");
129 }
130 else if (e instanceof RequiredTemplateException ||
131 e instanceof TemplateNameException ||
132 e instanceof TemplateScriptException ||
133 e instanceof TemplateSmallImageNameException ||
134 e instanceof TemplateSmallImageSizeException) {
135
136 SessionErrors.add(actionRequest, e.getClass(), e);
137
138 if (e instanceof RequiredTemplateException) {
139 String redirect = PortalUtil.escapeRedirect(
140 ParamUtil.getString(actionRequest, "redirect"));
141
142 if (Validator.isNotNull(redirect)) {
143 actionResponse.sendRedirect(redirect);
144 }
145 }
146 }
147 else {
148 throw e;
149 }
150 }
151 }
152
153 @Override
154 public ActionForward render(
155 ActionMapping actionMapping, ActionForm actionForm,
156 PortletConfig portletConfig, RenderRequest renderRequest,
157 RenderResponse renderResponse)
158 throws Exception {
159
160 try {
161 ActionUtil.getStructure(renderRequest);
162 ActionUtil.getTemplate(renderRequest);
163 }
164 catch (Exception e) {
165 if (e instanceof NoSuchTemplateException ||
166 e instanceof PrincipalException) {
167
168 SessionErrors.add(renderRequest, e.getClass());
169
170 return actionMapping.findForward(
171 "portlet.dynamic_data_mapping.error");
172 }
173 else {
174 throw e;
175 }
176 }
177
178 return actionMapping.findForward(
179 getForward(
180 renderRequest, "portlet.dynamic_data_mapping.edit_template"));
181 }
182
183 protected void deleteTemplates(ActionRequest actionRequest)
184 throws Exception {
185
186 long[] deleteTemplateIds = null;
187
188 long templateId = ParamUtil.getLong(actionRequest, "templateId");
189
190 if (templateId > 0) {
191 deleteTemplateIds = new long[] {templateId};
192 }
193 else {
194 deleteTemplateIds = StringUtil.split(
195 ParamUtil.getString(actionRequest, "deleteTemplateIds"), 0L);
196 }
197
198 for (long deleteTemplateId : deleteTemplateIds) {
199 DDMTemplateServiceUtil.deleteTemplate(deleteTemplateId);
200 }
201 }
202
203 protected String getSaveAndContinueRedirect(
204 PortletConfig portletConfig, ActionRequest actionRequest,
205 DDMTemplate template, String redirect)
206 throws Exception {
207
208 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
209 WebKeys.THEME_DISPLAY);
210
211 long classNameId = ParamUtil.getLong(actionRequest, "classNameId");
212 long classPK = ParamUtil.getLong(actionRequest, "classPK");
213 String structureAvailableFields = ParamUtil.getString(
214 actionRequest, "structureAvailableFields");
215
216 PortletURLImpl portletURL = new PortletURLImpl(
217 actionRequest, portletConfig.getPortletName(),
218 themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
219
220 portletURL.setParameter(Constants.CMD, Constants.UPDATE, false);
221 portletURL.setParameter(
222 "struts_action", "/dynamic_data_mapping/edit_template");
223 portletURL.setParameter("redirect", redirect, false);
224 portletURL.setParameter(
225 "templateId", String.valueOf(template.getTemplateId()), false);
226 portletURL.setParameter(
227 "groupId", String.valueOf(template.getGroupId()), false);
228 portletURL.setParameter(
229 "classNameId", String.valueOf(classNameId), false);
230 portletURL.setParameter("classPK", String.valueOf(classPK), false);
231 portletURL.setParameter("type", template.getType(), false);
232 portletURL.setParameter(
233 "structureAvailableFields", structureAvailableFields, false);
234 portletURL.setWindowState(actionRequest.getWindowState());
235
236 return portletURL.toString();
237 }
238
239 protected String getScript(UploadPortletRequest uploadPortletRequest) {
240 InputStream inputStream = null;
241
242 try {
243 inputStream = uploadPortletRequest.getFileAsStream("script");
244
245 if (inputStream != null) {
246 return new String(FileUtil.getBytes(inputStream));
247 }
248 }
249 catch (IOException ioe) {
250 if (_log.isWarnEnabled()) {
251 _log.warn(ioe, ioe);
252 }
253 }
254 finally {
255 StreamUtil.cleanUp(inputStream);
256 }
257
258 return null;
259 }
260
261 protected DDMTemplate updateTemplate(ActionRequest actionRequest)
262 throws Exception {
263
264 UploadPortletRequest uploadPortletRequest =
265 PortalUtil.getUploadPortletRequest(actionRequest);
266
267 long templateId = ParamUtil.getLong(uploadPortletRequest, "templateId");
268
269 long groupId = ParamUtil.getLong(uploadPortletRequest, "groupId");
270 long classNameId = ParamUtil.getLong(
271 uploadPortletRequest, "classNameId");
272 long classPK = ParamUtil.getLong(uploadPortletRequest, "classPK");
273 Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
274 uploadPortletRequest, "name");
275 Map<Locale, String> descriptionMap =
276 LocalizationUtil.getLocalizationMap(
277 uploadPortletRequest, "description");
278 String type = ParamUtil.getString(uploadPortletRequest, "type");
279 String mode = ParamUtil.getString(uploadPortletRequest, "mode");
280 String language = ParamUtil.getString(
281 uploadPortletRequest, "language", TemplateConstants.LANG_TYPE_VM);
282
283 String script = getScript(uploadPortletRequest);
284 String scriptContent = ParamUtil.getString(
285 uploadPortletRequest, "scriptContent");
286
287 if (Validator.isNull(script)) {
288 script = scriptContent;
289 }
290
291 boolean cacheable = ParamUtil.getBoolean(
292 uploadPortletRequest, "cacheable");
293 boolean smallImage = ParamUtil.getBoolean(
294 uploadPortletRequest, "smallImage");
295 String smallImageURL = ParamUtil.getString(
296 uploadPortletRequest, "smallImageURL");
297 File smallImageFile = uploadPortletRequest.getFile("smallImageFile");
298
299 ServiceContext serviceContext = ServiceContextFactory.getInstance(
300 DDMTemplate.class.getName(), uploadPortletRequest);
301
302 DDMTemplate template = null;
303
304 if (templateId <= 0) {
305 template = DDMTemplateServiceUtil.addTemplate(
306 groupId, classNameId, classPK, null, nameMap, descriptionMap,
307 type, mode, language, script, cacheable, smallImage,
308 smallImageURL, smallImageFile, serviceContext);
309 }
310 else {
311 template = DDMTemplateServiceUtil.updateTemplate(
312 templateId, classPK, nameMap, descriptionMap, type, mode,
313 language, script, cacheable, smallImage, smallImageURL,
314 smallImageFile, serviceContext);
315 }
316
317 PortletPreferences portletPreferences = getStrictPortletSetup(
318 actionRequest);
319
320 if (portletPreferences != null) {
321 if (type.equals(DDMTemplateConstants.TEMPLATE_TYPE_DISPLAY)) {
322 portletPreferences.setValue(
323 "displayDDMTemplateId",
324 String.valueOf(template.getTemplateId()));
325 }
326 else {
327 portletPreferences.setValue(
328 "formDDMTemplateId",
329 String.valueOf(template.getTemplateId()));
330 }
331
332 portletPreferences.store();
333 }
334
335 return template;
336 }
337
338 private static Log _log = LogFactoryUtil.getLog(EditTemplateAction.class);
339
340 }