001
014
015 package com.liferay.portlet.dynamicdatamapping.action;
016
017 import com.liferay.portal.LocaleException;
018 import com.liferay.portal.kernel.servlet.SessionErrors;
019 import com.liferay.portal.kernel.util.Constants;
020 import com.liferay.portal.kernel.util.LocalizationUtil;
021 import com.liferay.portal.kernel.util.ParamUtil;
022 import com.liferay.portal.kernel.util.StringUtil;
023 import com.liferay.portal.kernel.util.Validator;
024 import com.liferay.portal.security.auth.PrincipalException;
025 import com.liferay.portal.service.ServiceContext;
026 import com.liferay.portal.service.ServiceContextFactory;
027 import com.liferay.portal.struts.PortletAction;
028 import com.liferay.portal.theme.ThemeDisplay;
029 import com.liferay.portal.util.PortalUtil;
030 import com.liferay.portal.util.WebKeys;
031 import com.liferay.portlet.PortletURLImpl;
032 import com.liferay.portlet.dynamicdatamapping.NoSuchStructureException;
033 import com.liferay.portlet.dynamicdatamapping.RequiredStructureException;
034 import com.liferay.portlet.dynamicdatamapping.StructureDuplicateElementException;
035 import com.liferay.portlet.dynamicdatamapping.StructureNameException;
036 import com.liferay.portlet.dynamicdatamapping.StructureXsdException;
037 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
038 import com.liferay.portlet.dynamicdatamapping.model.DDMStructureConstants;
039 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureServiceUtil;
040
041 import java.util.Locale;
042 import java.util.Map;
043
044 import javax.portlet.ActionRequest;
045 import javax.portlet.ActionResponse;
046 import javax.portlet.PortletConfig;
047 import javax.portlet.PortletRequest;
048 import javax.portlet.RenderRequest;
049 import javax.portlet.RenderResponse;
050
051 import org.apache.struts.action.ActionForm;
052 import org.apache.struts.action.ActionForward;
053 import org.apache.struts.action.ActionMapping;
054
055
060 public class EditStructureAction 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 DDMStructure structure = null;
071
072 try {
073 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
074 structure = updateStructure(actionRequest);
075 }
076 else if (cmd.equals(Constants.DELETE)) {
077 deleteStructures(actionRequest);
078 }
079
080 if (Validator.isNotNull(cmd)) {
081 String redirect = ParamUtil.getString(
082 actionRequest, "redirect");
083
084 if (structure != null) {
085 boolean saveAndContinue = ParamUtil.getBoolean(
086 actionRequest, "saveAndContinue");
087
088 if (saveAndContinue) {
089 redirect = getSaveAndContinueRedirect(
090 portletConfig, actionRequest, structure, redirect);
091 }
092 }
093
094 sendRedirect(actionRequest, actionResponse, redirect);
095 }
096 }
097 catch (Exception e) {
098 if (e instanceof NoSuchStructureException ||
099 e instanceof PrincipalException) {
100
101 SessionErrors.add(actionRequest, e.getClass());
102
103 setForward(actionRequest, "portlet.dynamic_data_mapping.error");
104 }
105 else if (e instanceof LocaleException ||
106 e instanceof RequiredStructureException ||
107 e instanceof StructureDuplicateElementException ||
108 e instanceof StructureNameException ||
109 e instanceof StructureXsdException) {
110
111 SessionErrors.add(actionRequest, e.getClass(), e);
112
113 if (e instanceof RequiredStructureException) {
114 String redirect = PortalUtil.escapeRedirect(
115 ParamUtil.getString(actionRequest, "redirect"));
116
117 if (Validator.isNotNull(redirect)) {
118 actionResponse.sendRedirect(redirect);
119 }
120 }
121 }
122 else {
123 throw e;
124 }
125 }
126 }
127
128 @Override
129 public ActionForward render(
130 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
131 RenderRequest renderRequest, RenderResponse renderResponse)
132 throws Exception {
133
134 try {
135 String cmd = ParamUtil.getString(renderRequest, Constants.CMD);
136
137 if (!cmd.equals(Constants.ADD)) {
138 ActionUtil.getStructure(renderRequest);
139 }
140 }
141 catch (NoSuchStructureException nsse) {
142
143
144
145
146 }
147 catch (Exception e) {
148 if (
149 e instanceof PrincipalException) {
150
151 SessionErrors.add(renderRequest, e.getClass());
152
153 return mapping.findForward(
154 "portlet.dynamic_data_mapping.error");
155 }
156 else {
157 throw e;
158 }
159 }
160
161 return mapping.findForward(
162 getForward(
163 renderRequest, "portlet.dynamic_data_mapping.edit_structure"));
164 }
165
166 protected void deleteStructures(ActionRequest actionRequest)
167 throws Exception {
168
169 long[] deleteStructureIds = null;
170
171 long structureId = ParamUtil.getLong(actionRequest, "classPK");
172
173 if (structureId > 0) {
174 deleteStructureIds = new long[] {structureId};
175 }
176 else {
177 deleteStructureIds = StringUtil.split(
178 ParamUtil.getString(actionRequest, "deleteStructureIds"), 0L);
179 }
180
181 for (long deleteStructureId : deleteStructureIds) {
182 DDMStructureServiceUtil.deleteStructure(deleteStructureId);
183 }
184 }
185
186 protected String getSaveAndContinueRedirect(
187 PortletConfig portletConfig, ActionRequest actionRequest,
188 DDMStructure structure, String redirect)
189 throws Exception {
190
191 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
192 WebKeys.THEME_DISPLAY);
193
194 String availableFields = ParamUtil.getString(
195 actionRequest, "availableFields");
196 String saveCallback = ParamUtil.getString(
197 actionRequest, "saveCallback");
198
199 PortletURLImpl portletURL = new PortletURLImpl(
200 actionRequest, portletConfig.getPortletName(),
201 themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
202
203 portletURL.setWindowState(actionRequest.getWindowState());
204
205 portletURL.setParameter(Constants.CMD, Constants.UPDATE, false);
206 portletURL.setParameter(
207 "struts_action", "/dynamic_data_mapping/edit_structure");
208 portletURL.setParameter("redirect", redirect, false);
209 portletURL.setParameter(
210 "groupId", String.valueOf(structure.getGroupId()), false);
211
212 long classNameId = PortalUtil.getClassNameId(DDMStructure.class);
213
214 portletURL.setParameter(
215 "classNameId", String.valueOf(classNameId), false);
216
217 portletURL.setParameter(
218 "classPK", String.valueOf(structure.getStructureId()), false);
219 portletURL.setParameter("availableFields", availableFields, false);
220 portletURL.setParameter("saveCallback", saveCallback, false);
221
222 return portletURL.toString();
223 }
224
225 protected DDMStructure updateStructure(ActionRequest actionRequest)
226 throws Exception {
227
228 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
229
230 long classPK = ParamUtil.getLong(actionRequest, "classPK");
231
232 long groupId = ParamUtil.getLong(actionRequest, "groupId");
233 long scopeClassNameId = ParamUtil.getLong(
234 actionRequest, "scopeClassNameId");
235 long parentStructureId = ParamUtil.getLong(
236 actionRequest, "parentStructureId",
237 DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID);
238 Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
239 actionRequest, "name");
240 Map<Locale, String> descriptionMap =
241 LocalizationUtil.getLocalizationMap(actionRequest, "description");
242 String xsd = ParamUtil.getString(actionRequest, "xsd");
243 String storageType = ParamUtil.getString(actionRequest, "storageType");
244
245 ServiceContext serviceContext = ServiceContextFactory.getInstance(
246 DDMStructure.class.getName(), actionRequest);
247
248 DDMStructure structure = null;
249
250 if (cmd.equals(Constants.ADD)) {
251 structure = DDMStructureServiceUtil.addStructure(
252 groupId, parentStructureId, scopeClassNameId, null, nameMap,
253 descriptionMap, xsd, storageType,
254 DDMStructureConstants.TYPE_DEFAULT, serviceContext);
255 }
256 else if (cmd.equals(Constants.UPDATE)) {
257 structure = DDMStructureServiceUtil.updateStructure(
258 classPK, parentStructureId, nameMap, descriptionMap, xsd,
259 serviceContext);
260 }
261
262 return structure;
263 }
264
265 }