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