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