001
014
015 package com.liferay.portlet.layoutsadmin.action;
016
017 import com.liferay.portal.DuplicateLockException;
018 import com.liferay.portal.ImageTypeException;
019 import com.liferay.portal.LayoutFriendlyURLException;
020 import com.liferay.portal.LayoutHiddenException;
021 import com.liferay.portal.LayoutNameException;
022 import com.liferay.portal.LayoutParentLayoutIdException;
023 import com.liferay.portal.LayoutPrototypeException;
024 import com.liferay.portal.LayoutSetVirtualHostException;
025 import com.liferay.portal.LayoutTypeException;
026 import com.liferay.portal.NoSuchGroupException;
027 import com.liferay.portal.NoSuchLayoutException;
028 import com.liferay.portal.RemoteExportException;
029 import com.liferay.portal.RemoteOptionsException;
030 import com.liferay.portal.RequiredLayoutException;
031 import com.liferay.portal.events.EventsProcessorUtil;
032 import com.liferay.portal.kernel.exception.PortalException;
033 import com.liferay.portal.kernel.exception.SystemException;
034 import com.liferay.portal.kernel.log.Log;
035 import com.liferay.portal.kernel.log.LogFactoryUtil;
036 import com.liferay.portal.kernel.servlet.SessionErrors;
037 import com.liferay.portal.kernel.staging.StagingUtil;
038 import com.liferay.portal.kernel.upload.UploadException;
039 import com.liferay.portal.kernel.upload.UploadPortletRequest;
040 import com.liferay.portal.kernel.util.Constants;
041 import com.liferay.portal.kernel.util.FileUtil;
042 import com.liferay.portal.kernel.util.HttpUtil;
043 import com.liferay.portal.kernel.util.LocalizationUtil;
044 import com.liferay.portal.kernel.util.ParamUtil;
045 import com.liferay.portal.kernel.util.PropertiesParamUtil;
046 import com.liferay.portal.kernel.util.PropsKeys;
047 import com.liferay.portal.kernel.util.StringPool;
048 import com.liferay.portal.kernel.util.StringUtil;
049 import com.liferay.portal.kernel.util.UnicodeProperties;
050 import com.liferay.portal.kernel.util.Validator;
051 import com.liferay.portal.kernel.workflow.WorkflowConstants;
052 import com.liferay.portal.model.ColorScheme;
053 import com.liferay.portal.model.Group;
054 import com.liferay.portal.model.Layout;
055 import com.liferay.portal.model.LayoutConstants;
056 import com.liferay.portal.model.LayoutPrototype;
057 import com.liferay.portal.model.LayoutRevision;
058 import com.liferay.portal.model.LayoutSet;
059 import com.liferay.portal.model.LayoutSetBranch;
060 import com.liferay.portal.model.LayoutTypePortlet;
061 import com.liferay.portal.model.Theme;
062 import com.liferay.portal.model.ThemeSetting;
063 import com.liferay.portal.model.User;
064 import com.liferay.portal.model.impl.ThemeImpl;
065 import com.liferay.portal.model.impl.ThemeSettingImpl;
066 import com.liferay.portal.security.auth.PrincipalException;
067 import com.liferay.portal.security.permission.ActionKeys;
068 import com.liferay.portal.security.permission.PermissionChecker;
069 import com.liferay.portal.service.LayoutLocalServiceUtil;
070 import com.liferay.portal.service.LayoutPrototypeServiceUtil;
071 import com.liferay.portal.service.LayoutRevisionLocalServiceUtil;
072 import com.liferay.portal.service.LayoutServiceUtil;
073 import com.liferay.portal.service.LayoutSetBranchLocalServiceUtil;
074 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
075 import com.liferay.portal.service.PortletLocalServiceUtil;
076 import com.liferay.portal.service.ServiceContext;
077 import com.liferay.portal.service.ServiceContextFactory;
078 import com.liferay.portal.service.ThemeLocalServiceUtil;
079 import com.liferay.portal.service.UserLocalServiceUtil;
080 import com.liferay.portal.service.permission.GroupPermissionUtil;
081 import com.liferay.portal.service.permission.LayoutPermissionUtil;
082 import com.liferay.portal.service.permission.LayoutPrototypePermissionUtil;
083 import com.liferay.portal.service.permission.LayoutSetPrototypePermissionUtil;
084 import com.liferay.portal.service.permission.UserPermissionUtil;
085 import com.liferay.portal.struts.PortletAction;
086 import com.liferay.portal.theme.ThemeDisplay;
087 import com.liferay.portal.util.LayoutSettings;
088 import com.liferay.portal.util.PortalUtil;
089 import com.liferay.portal.util.PropsValues;
090 import com.liferay.portal.util.WebKeys;
091 import com.liferay.portlet.mobiledevicerules.model.MDRAction;
092 import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroupInstance;
093 import com.liferay.portlet.mobiledevicerules.service.MDRActionLocalServiceUtil;
094 import com.liferay.portlet.mobiledevicerules.service.MDRActionServiceUtil;
095 import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceLocalServiceUtil;
096 import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceServiceUtil;
097 import com.liferay.portlet.sites.action.ActionUtil;
098 import com.liferay.portlet.sites.util.SitesUtil;
099
100 import java.io.IOException;
101 import java.io.InputStream;
102
103 import java.util.Iterator;
104 import java.util.List;
105 import java.util.Locale;
106 import java.util.Map;
107 import java.util.Set;
108
109 import javax.portlet.ActionRequest;
110 import javax.portlet.ActionResponse;
111 import javax.portlet.PortletConfig;
112 import javax.portlet.PortletContext;
113 import javax.portlet.PortletRequest;
114 import javax.portlet.PortletRequestDispatcher;
115 import javax.portlet.RenderRequest;
116 import javax.portlet.RenderResponse;
117 import javax.portlet.ResourceRequest;
118 import javax.portlet.ResourceResponse;
119
120 import javax.servlet.http.HttpServletRequest;
121 import javax.servlet.http.HttpServletResponse;
122
123 import org.apache.struts.action.ActionForm;
124 import org.apache.struts.action.ActionForward;
125 import org.apache.struts.action.ActionMapping;
126
127
131 public class EditLayoutsAction extends PortletAction {
132
133 @Override
134 public void processAction(
135 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
136 ActionRequest actionRequest, ActionResponse actionResponse)
137 throws Exception {
138
139 try {
140 checkPermissions(actionRequest);
141 }
142 catch (PrincipalException pe) {
143 return;
144 }
145
146 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
147 WebKeys.THEME_DISPLAY);
148
149 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
150
151 String redirect = ParamUtil.getString(actionRequest, "redirect");
152 String closeRedirect = ParamUtil.getString(
153 actionRequest, "closeRedirect");
154
155 try {
156 Layout layout = null;
157 String oldFriendlyURL = StringPool.BLANK;
158
159 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
160 Object[] returnValue = updateLayout(
161 actionRequest, actionResponse);
162
163 layout = (Layout)returnValue[0];
164 oldFriendlyURL = (String)returnValue[1];
165
166 redirect = updateCloseRedirect(
167 redirect, null, layout, oldFriendlyURL);
168 closeRedirect = updateCloseRedirect(
169 closeRedirect, null, layout, oldFriendlyURL);
170 }
171 else if (cmd.equals(Constants.DELETE)) {
172 Object[] returnValue = SitesUtil.deleteLayout(
173 actionRequest, actionResponse);
174
175 Group group = (Group)returnValue[0];
176 oldFriendlyURL = (String)returnValue[1];
177 long newRefererPlid = (Long)returnValue[2];
178
179 redirect = updateCloseRedirect(
180 redirect, group, null, oldFriendlyURL);
181 redirect = HttpUtil.setParameter(
182 redirect, "refererPlid", newRefererPlid);
183
184 closeRedirect = updateCloseRedirect(
185 closeRedirect, group, null, oldFriendlyURL);
186 }
187 else if (cmd.equals("copy_from_live")) {
188 StagingUtil.copyFromLive(actionRequest);
189 }
190 else if (cmd.equals("display_order")) {
191 updateDisplayOrder(actionRequest);
192 }
193 else if (cmd.equals("delete_layout_revision")) {
194 deleteLayoutRevision(actionRequest);
195 }
196 else if (cmd.equals("enable")) {
197 enableLayout(actionRequest);
198 }
199 else if (cmd.equals("publish_to_live")) {
200 StagingUtil.publishToLive(actionRequest);
201 }
202 else if (cmd.equals("publish_to_remote")) {
203 StagingUtil.publishToRemote(actionRequest);
204 }
205 else if (cmd.equals("reset_customized_view")) {
206 LayoutTypePortlet layoutTypePortlet =
207 themeDisplay.getLayoutTypePortlet();
208
209 if ((layoutTypePortlet != null) &&
210 layoutTypePortlet.isCustomizable() &&
211 layoutTypePortlet.isCustomizedView()) {
212
213 layoutTypePortlet.resetUserPreferences();
214 }
215 }
216 else if (cmd.equals("reset_prototype")) {
217 SitesUtil.resetPrototype(themeDisplay.getLayout());
218 }
219 else if (cmd.equals("schedule_copy_from_live")) {
220 StagingUtil.scheduleCopyFromLive(actionRequest);
221 }
222 else if (cmd.equals("schedule_publish_to_live")) {
223 StagingUtil.schedulePublishToLive(actionRequest);
224 }
225 else if (cmd.equals("schedule_publish_to_remote")) {
226 StagingUtil.schedulePublishToRemote(actionRequest);
227 }
228 else if (cmd.equals("select_layout_set_branch")) {
229 selectLayoutSetBranch(actionRequest);
230 }
231 else if (cmd.equals("select_layout_branch")) {
232 selectLayoutBranch(actionRequest);
233 }
234 else if (cmd.equals("unschedule_copy_from_live")) {
235 StagingUtil.unscheduleCopyFromLive(actionRequest);
236 }
237 else if (cmd.equals("unschedule_publish_to_live")) {
238 StagingUtil.unschedulePublishToLive(actionRequest);
239 }
240 else if (cmd.equals("unschedule_publish_to_remote")) {
241 StagingUtil.unschedulePublishToRemote(actionRequest);
242 }
243 else if (cmd.equals("update_layout_revision")) {
244 updateLayoutRevision(actionRequest, themeDisplay);
245 }
246
247 sendRedirect(
248 portletConfig, actionRequest, actionResponse, redirect,
249 closeRedirect);
250 }
251 catch (Exception e) {
252 if (e instanceof NoSuchLayoutException ||
253 e instanceof PrincipalException) {
254
255 SessionErrors.add(actionRequest, e.getClass());
256
257 setForward(actionRequest, "portlet.layouts_admin.error");
258 }
259 else if (e instanceof ImageTypeException ||
260 e instanceof LayoutFriendlyURLException ||
261 e instanceof LayoutHiddenException ||
262 e instanceof LayoutNameException ||
263 e instanceof LayoutParentLayoutIdException ||
264 e instanceof LayoutSetVirtualHostException ||
265 e instanceof LayoutTypeException ||
266 e instanceof RequiredLayoutException ||
267 e instanceof UploadException) {
268
269 if (e instanceof LayoutFriendlyURLException) {
270 SessionErrors.add(
271 actionRequest,
272 LayoutFriendlyURLException.class.getName(), e);
273 }
274 else {
275 SessionErrors.add(actionRequest, e.getClass(), e);
276 }
277
278 sendRedirect(
279 portletConfig, actionRequest, actionResponse, redirect,
280 closeRedirect);
281 }
282 else if (e instanceof DuplicateLockException ||
283 e instanceof LayoutPrototypeException ||
284 e instanceof RemoteExportException ||
285 e instanceof RemoteOptionsException ||
286 e instanceof SystemException) {
287
288 SessionErrors.add(actionRequest, e.getClass(), e);
289
290 redirect = ParamUtil.getString(actionRequest, "pagesRedirect");
291
292 sendRedirect(
293 portletConfig, actionRequest, actionResponse, redirect,
294 closeRedirect);
295 }
296 else {
297 throw e;
298 }
299 }
300 }
301
302 @Override
303 public ActionForward render(
304 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
305 RenderRequest renderRequest, RenderResponse renderResponse)
306 throws Exception {
307
308 try {
309 checkPermissions(renderRequest);
310 }
311 catch (PrincipalException pe) {
312 SessionErrors.add(
313 renderRequest, PrincipalException.class.getName());
314
315 return mapping.findForward("portlet.layouts_admin.error");
316 }
317
318 try {
319 getGroup(renderRequest);
320 }
321 catch (Exception e) {
322 if (e instanceof NoSuchGroupException ||
323 e instanceof PrincipalException) {
324
325 SessionErrors.add(renderRequest, e.getClass());
326
327 return mapping.findForward("portlet.layouts_admin.error");
328 }
329 else {
330 throw e;
331 }
332 }
333
334 return mapping.findForward(
335 getForward(renderRequest, "portlet.layouts_admin.edit_layouts"));
336 }
337
338 @Override
339 public void serveResource(
340 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
341 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
342 throws Exception {
343
344 String cmd = ParamUtil.getString(resourceRequest, Constants.CMD);
345
346 PortletContext portletContext = portletConfig.getPortletContext();
347
348 PortletRequestDispatcher portletRequestDispatcher = null;
349
350 if (cmd.equals(ActionKeys.PUBLISH_STAGING)) {
351 portletRequestDispatcher = portletContext.getRequestDispatcher(
352 "/html/portlet/layouts_admin/scheduled_publishing_events.jsp");
353 }
354 else if (cmd.equals(ActionKeys.VIEW_TREE)) {
355 getGroup(resourceRequest);
356
357 portletRequestDispatcher = portletContext.getRequestDispatcher(
358 "/html/portlet/layouts_admin/tree_js.jsp");
359 }
360 else {
361 getGroup(resourceRequest);
362
363 portletRequestDispatcher = portletContext.getRequestDispatcher(
364 "/html/portlet/layouts_admin/view_resources.jsp");
365 }
366
367 portletRequestDispatcher.include(resourceRequest, resourceResponse);
368 }
369
370 protected void checkPermission(
371 PermissionChecker permissionChecker, Group group, Layout layout,
372 long selPlid)
373 throws PortalException, SystemException {
374
375 if (selPlid > 0) {
376 LayoutPermissionUtil.check(
377 permissionChecker, layout, ActionKeys.VIEW);
378 }
379 else {
380 GroupPermissionUtil.check(
381 permissionChecker, group, ActionKeys.VIEW);
382 }
383 }
384
385 protected void checkPermissions(PortletRequest portletRequest)
386 throws Exception {
387
388 Group group = getGroup(portletRequest);
389
390 if (group == null) {
391 throw new PrincipalException();
392 }
393
394 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
395 WebKeys.THEME_DISPLAY);
396
397 PermissionChecker permissionChecker =
398 themeDisplay.getPermissionChecker();
399
400 Layout layout = themeDisplay.getLayout();
401
402 String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
403
404 long selPlid = ParamUtil.getLong(portletRequest, "selPlid");
405
406 if (selPlid > 0) {
407 layout = LayoutLocalServiceUtil.getLayout(selPlid);
408 }
409
410 if (cmd.equals(Constants.ADD)) {
411 long parentPlid = ParamUtil.getLong(portletRequest, "parentPlid");
412
413 if (parentPlid == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
414 if (!GroupPermissionUtil.contains(
415 permissionChecker, group.getGroupId(),
416 ActionKeys.ADD_LAYOUT)) {
417
418 throw new PrincipalException();
419 }
420 }
421 else {
422 layout = LayoutLocalServiceUtil.getLayout(parentPlid);
423
424 if (!LayoutPermissionUtil.contains(
425 permissionChecker, layout, ActionKeys.ADD_LAYOUT)) {
426
427 throw new PrincipalException();
428 }
429 }
430 }
431 else if (cmd.equals(Constants.DELETE)) {
432 if (!LayoutPermissionUtil.contains(
433 permissionChecker, layout, ActionKeys.DELETE)) {
434
435 throw new PrincipalException();
436 }
437 }
438 else if (cmd.equals(Constants.UPDATE)) {
439 if (group.isCompany()) {
440 if (!permissionChecker.isCompanyAdmin()) {
441 throw new PrincipalException();
442 }
443 }
444 else if (group.isLayoutPrototype()) {
445 LayoutPrototypePermissionUtil.check(
446 permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
447 }
448 else if (group.isLayoutSetPrototype()) {
449 LayoutSetPrototypePermissionUtil.check(
450 permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
451 }
452 else if (group.isUser()) {
453 long groupUserId = group.getClassPK();
454
455 User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
456
457 long[] organizationIds = groupUser.getOrganizationIds();
458
459 UserPermissionUtil.check(
460 permissionChecker, groupUserId, organizationIds,
461 ActionKeys.UPDATE);
462 }
463 else {
464 checkPermission(permissionChecker, group, layout, selPlid);
465 }
466 }
467 else if (cmd.equals("publish_to_live")) {
468 boolean hasUpdateLayoutPermission = false;
469
470 if (layout != null) {
471 hasUpdateLayoutPermission = LayoutPermissionUtil.contains(
472 permissionChecker, layout, ActionKeys.UPDATE);
473 }
474
475 if (group.isCompany() || group.isSite()) {
476 boolean publishToLive = GroupPermissionUtil.contains(
477 permissionChecker, group.getGroupId(),
478 ActionKeys.PUBLISH_STAGING);
479
480 if (!hasUpdateLayoutPermission && !publishToLive) {
481 throw new PrincipalException();
482 }
483 }
484 else {
485 checkPermission(permissionChecker, group, layout, selPlid);
486 }
487 }
488 else if (cmd.equals("reset_customized_view")) {
489 if (!LayoutPermissionUtil.contains(
490 permissionChecker, layout, ActionKeys.CUSTOMIZE)) {
491
492 throw new PrincipalException();
493 }
494 }
495 else if (cmd.equals("reset_prototype")) {
496 if (!LayoutPermissionUtil.contains(
497 permissionChecker, layout, ActionKeys.UPDATE)) {
498
499 throw new PrincipalException();
500 }
501 else if (!group.isUser() &&
502 !GroupPermissionUtil.contains(
503 permissionChecker, layout.getGroupId(),
504 ActionKeys.UPDATE)) {
505
506 throw new PrincipalException();
507 }
508 else if (group.isUser() &&
509 (permissionChecker.getUserId() != group.getClassPK())) {
510
511 throw new PrincipalException();
512 }
513 }
514 else {
515 checkPermission(permissionChecker, group, layout, selPlid);
516 }
517 }
518
519 protected void deleteLayoutRevision(ActionRequest actionRequest)
520 throws Exception {
521
522 HttpServletRequest request = PortalUtil.getHttpServletRequest(
523 actionRequest);
524
525 long layoutRevisionId = ParamUtil.getLong(
526 actionRequest, "layoutRevisionId");
527
528 LayoutRevision layoutRevision =
529 LayoutRevisionLocalServiceUtil.getLayoutRevision(layoutRevisionId);
530
531 LayoutRevisionLocalServiceUtil.deleteLayoutRevision(layoutRevision);
532
533 boolean updateRecentLayoutRevisionId = ParamUtil.getBoolean(
534 actionRequest, "updateRecentLayoutRevisionId");
535
536 if (updateRecentLayoutRevisionId) {
537 StagingUtil.setRecentLayoutRevisionId(
538 request, layoutRevision.getLayoutSetBranchId(),
539 layoutRevision.getPlid(),
540 layoutRevision.getParentLayoutRevisionId());
541 }
542 }
543
544 protected void deleteThemeSettingsProperties(
545 UnicodeProperties typeSettingsProperties, String device) {
546
547 String keyPrefix = ThemeSettingImpl.namespaceProperty(device);
548
549 Set<String> keys = typeSettingsProperties.keySet();
550
551 Iterator<String> itr = keys.iterator();
552
553 while (itr.hasNext()) {
554 String key = itr.next();
555
556 if (key.startsWith(keyPrefix)) {
557 itr.remove();
558 }
559 }
560 }
561
562 protected void enableLayout(ActionRequest actionRequest) throws Exception {
563 long incompleteLayoutRevisionId = ParamUtil.getLong(
564 actionRequest, "incompleteLayoutRevisionId");
565
566 LayoutRevision incompleteLayoutRevision =
567 LayoutRevisionLocalServiceUtil.getLayoutRevision(
568 incompleteLayoutRevisionId);
569
570 long layoutBranchId = ParamUtil.getLong(
571 actionRequest, "layoutBranchId",
572 incompleteLayoutRevision.getLayoutBranchId());
573
574 ServiceContext serviceContext = ServiceContextFactory.getInstance(
575 actionRequest);
576
577 serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT);
578
579 LayoutRevisionLocalServiceUtil.updateLayoutRevision(
580 serviceContext.getUserId(),
581 incompleteLayoutRevision.getLayoutRevisionId(), layoutBranchId,
582 incompleteLayoutRevision.getName(),
583 incompleteLayoutRevision.getTitle(),
584 incompleteLayoutRevision.getDescription(),
585 incompleteLayoutRevision.getKeywords(),
586 incompleteLayoutRevision.getRobots(),
587 incompleteLayoutRevision.getTypeSettings(),
588 incompleteLayoutRevision.getIconImage(),
589 incompleteLayoutRevision.getIconImageId(),
590 incompleteLayoutRevision.getThemeId(),
591 incompleteLayoutRevision.getColorSchemeId(),
592 incompleteLayoutRevision.getWapThemeId(),
593 incompleteLayoutRevision.getWapColorSchemeId(),
594 incompleteLayoutRevision.getCss(), serviceContext);
595 }
596
597 protected String getColorSchemeId(
598 long companyId, String themeId, String colorSchemeId,
599 boolean wapTheme)
600 throws Exception {
601
602 Theme theme = ThemeLocalServiceUtil.getTheme(
603 companyId, themeId, wapTheme);
604
605 if (!theme.hasColorSchemes()) {
606 colorSchemeId = StringPool.BLANK;
607 }
608
609 if (Validator.isNull(colorSchemeId)) {
610 ColorScheme colorScheme = ThemeLocalServiceUtil.getColorScheme(
611 companyId, themeId, colorSchemeId, wapTheme);
612
613 colorSchemeId = colorScheme.getColorSchemeId();
614 }
615
616 return colorSchemeId;
617 }
618
619 protected Group getGroup(PortletRequest portletRequest) throws Exception {
620 return ActionUtil.getGroup(portletRequest);
621 }
622
623 protected byte[] getIconBytes(
624 UploadPortletRequest uploadPortletRequest, String iconFileName) {
625
626 InputStream inputStream = null;
627
628 try {
629 inputStream = uploadPortletRequest.getFileAsStream(iconFileName);
630
631 if (inputStream != null) {
632 return FileUtil.getBytes(inputStream);
633 }
634 }
635 catch (IOException ioe) {
636 if (_log.isWarnEnabled()) {
637 _log.warn("Unable to retrieve icon", ioe);
638 }
639 }
640
641 return new byte[0];
642 }
643
644 protected void inheritMobileRuleGroups(
645 Layout layout, ServiceContext serviceContext)
646 throws PortalException, SystemException {
647
648 List<MDRRuleGroupInstance> parentMDRRuleGroupInstances =
649 MDRRuleGroupInstanceLocalServiceUtil.getRuleGroupInstances(
650 Layout.class.getName(), layout.getParentPlid());
651
652 for (MDRRuleGroupInstance parentMDRRuleGroupInstance :
653 parentMDRRuleGroupInstances) {
654
655 MDRRuleGroupInstance mdrRuleGroupInstance =
656 MDRRuleGroupInstanceServiceUtil.addRuleGroupInstance(
657 layout.getGroupId(), Layout.class.getName(),
658 layout.getPlid(),
659 parentMDRRuleGroupInstance.getRuleGroupId(),
660 parentMDRRuleGroupInstance.getPriority(), serviceContext);
661
662 List<MDRAction> parentMDRActions =
663 MDRActionLocalServiceUtil.getActions(
664 parentMDRRuleGroupInstance.getRuleGroupInstanceId());
665
666 for (MDRAction mdrAction : parentMDRActions) {
667 MDRActionServiceUtil.addAction(
668 mdrRuleGroupInstance.getRuleGroupInstanceId(),
669 mdrAction.getNameMap(), mdrAction.getDescriptionMap(),
670 mdrAction.getType(), mdrAction.getTypeSettings(),
671 serviceContext);
672 }
673 }
674 }
675
676 @Override
677 protected boolean isCheckMethodOnProcessAction() {
678 return _CHECK_METHOD_ON_PROCESS_ACTION;
679 }
680
681 protected void selectLayoutBranch(ActionRequest actionRequest)
682 throws Exception {
683
684 HttpServletRequest request = PortalUtil.getHttpServletRequest(
685 actionRequest);
686
687 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
688 WebKeys.THEME_DISPLAY);
689
690 long layoutSetBranchId = ParamUtil.getLong(
691 actionRequest, "layoutSetBranchId");
692
693 long layoutBranchId = ParamUtil.getLong(
694 actionRequest, "layoutBranchId");
695
696 StagingUtil.setRecentLayoutBranchId(
697 request, layoutSetBranchId, themeDisplay.getPlid(), layoutBranchId);
698 }
699
700 protected void selectLayoutSetBranch(ActionRequest actionRequest)
701 throws Exception {
702
703 HttpServletRequest request = PortalUtil.getHttpServletRequest(
704 actionRequest);
705
706 long groupId = ParamUtil.getLong(actionRequest, "groupId");
707 boolean privateLayout = ParamUtil.getBoolean(
708 actionRequest, "privateLayout");
709
710 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
711 groupId, privateLayout);
712
713 long layoutSetBranchId = ParamUtil.getLong(
714 actionRequest, "layoutSetBranchId");
715
716
717
718 LayoutSetBranch layoutSetBranch =
719 LayoutSetBranchLocalServiceUtil.getLayoutSetBranch(
720 layoutSetBranchId);
721
722 StagingUtil.setRecentLayoutSetBranchId(
723 request, layoutSet.getLayoutSetId(),
724 layoutSetBranch.getLayoutSetBranchId());
725 }
726
727 protected void setThemeSettingProperties(
728 ActionRequest actionRequest,
729 UnicodeProperties typeSettingsProperties, String themeId,
730 Map<String, ThemeSetting> themeSettings, String device,
731 String deviceThemeId)
732 throws PortalException, SystemException {
733
734 long groupId = ParamUtil.getLong(actionRequest, "groupId");
735 boolean privateLayout = ParamUtil.getBoolean(
736 actionRequest, "privateLayout");
737 long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
738
739 Layout layout = LayoutLocalServiceUtil.getLayout(
740 groupId, privateLayout, layoutId);
741
742 LayoutSet layoutSet = layout.getLayoutSet();
743
744 for (String key : themeSettings.keySet()) {
745 ThemeSetting themeSetting = themeSettings.get(key);
746
747 String value = null;
748
749 if (!themeId.equals(deviceThemeId)) {
750 value = themeSetting.getValue();
751 }
752 else {
753 String property =
754 device + "ThemeSettingsProperties--" + key +
755 StringPool.DOUBLE_DASH;
756
757 value = ParamUtil.getString(actionRequest, property);
758 }
759
760 if (!Validator.equals(
761 value, layoutSet.getThemeSetting(key, device))) {
762
763 typeSettingsProperties.setProperty(
764 ThemeSettingImpl.namespaceProperty(device, key), value);
765 }
766 }
767 }
768
769 protected String updateCloseRedirect(
770 String closeRedirect, Group group, Layout layout,
771 String oldLayoutFriendlyURL) {
772
773 if (Validator.isNull(closeRedirect) ||
774 Validator.isNull(oldLayoutFriendlyURL)) {
775
776 return closeRedirect;
777 }
778
779 if (layout != null) {
780 String oldPath = oldLayoutFriendlyURL;
781 String newPath = layout.getFriendlyURL();
782
783 return PortalUtil.updateRedirect(closeRedirect, oldPath, newPath);
784 }
785 else if (group != null) {
786 String oldPath = group.getFriendlyURL() + oldLayoutFriendlyURL;
787 String newPath = group.getFriendlyURL();
788
789 return PortalUtil.updateRedirect(closeRedirect, oldPath, newPath);
790 }
791
792 return closeRedirect;
793 }
794
795 protected void updateDisplayOrder(ActionRequest actionRequest)
796 throws Exception {
797
798 long groupId = ParamUtil.getLong(actionRequest, "groupId");
799 boolean privateLayout = ParamUtil.getBoolean(
800 actionRequest, "privateLayout");
801 long parentLayoutId = ParamUtil.getLong(
802 actionRequest, "parentLayoutId");
803 long[] layoutIds = StringUtil.split(
804 ParamUtil.getString(actionRequest, "layoutIds"), 0L);
805
806 ServiceContext serviceContext = ServiceContextFactory.getInstance(
807 actionRequest);
808
809 LayoutServiceUtil.setLayouts(
810 groupId, privateLayout, parentLayoutId, layoutIds, serviceContext);
811 }
812
813 protected Object[] updateLayout(
814 ActionRequest actionRequest, ActionResponse actionResponse)
815 throws Exception {
816
817 UploadPortletRequest uploadPortletRequest =
818 PortalUtil.getUploadPortletRequest(actionRequest);
819
820 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
821 WebKeys.THEME_DISPLAY);
822
823 String cmd = ParamUtil.getString(uploadPortletRequest, Constants.CMD);
824
825 long groupId = ParamUtil.getLong(actionRequest, "groupId");
826 long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
827 long stagingGroupId = ParamUtil.getLong(
828 actionRequest, "stagingGroupId");
829 boolean privateLayout = ParamUtil.getBoolean(
830 actionRequest, "privateLayout");
831 long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
832 long parentLayoutId = ParamUtil.getLong(
833 uploadPortletRequest, "parentLayoutId");
834 Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
835 actionRequest, "name");
836 Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
837 actionRequest, "title");
838 Map<Locale, String> descriptionMap =
839 LocalizationUtil.getLocalizationMap(actionRequest, "description");
840 Map<Locale, String> keywordsMap = LocalizationUtil.getLocalizationMap(
841 actionRequest, "keywords");
842 Map<Locale, String> robotsMap = LocalizationUtil.getLocalizationMap(
843 actionRequest, "robots");
844 String type = ParamUtil.getString(uploadPortletRequest, "type");
845 boolean hidden = ParamUtil.getBoolean(uploadPortletRequest, "hidden");
846 String friendlyURL = ParamUtil.getString(
847 uploadPortletRequest, "friendlyURL");
848 boolean iconImage = ParamUtil.getBoolean(
849 uploadPortletRequest, "iconImage");
850 byte[] iconBytes = getIconBytes(uploadPortletRequest, "iconFileName");
851 long layoutPrototypeId = ParamUtil.getLong(
852 uploadPortletRequest, "layoutPrototypeId");
853
854 ServiceContext serviceContext = ServiceContextFactory.getInstance(
855 Layout.class.getName(), actionRequest);
856
857 Layout layout = null;
858 UnicodeProperties layoutTypeSettingsProperties = null;
859 String oldFriendlyURL = StringPool.BLANK;
860
861 if (cmd.equals(Constants.ADD)) {
862
863
864
865 boolean inheritFromParentLayoutId = ParamUtil.getBoolean(
866 uploadPortletRequest, "inheritFromParentLayoutId");
867
868 if (inheritFromParentLayoutId && (parentLayoutId > 0)) {
869 Layout parentLayout = LayoutLocalServiceUtil.getLayout(
870 groupId, privateLayout, parentLayoutId);
871
872 layout = LayoutServiceUtil.addLayout(
873 groupId, privateLayout, parentLayoutId, nameMap, titleMap,
874 parentLayout.getDescriptionMap(),
875 parentLayout.getKeywordsMap(), parentLayout.getRobotsMap(),
876 parentLayout.getType(), hidden, friendlyURL,
877 serviceContext);
878
879 LayoutServiceUtil.updateLayout(
880 layout.getGroupId(), layout.isPrivateLayout(),
881 layout.getLayoutId(), parentLayout.getTypeSettings());
882
883 inheritMobileRuleGroups(layout, serviceContext);
884
885 if (parentLayout.isTypePortlet()) {
886 ActionUtil.copyPreferences(
887 actionRequest, layout, parentLayout);
888
889 SitesUtil.copyLookAndFeel(layout, parentLayout);
890 }
891 }
892 else if (layoutPrototypeId > 0) {
893 LayoutPrototype layoutPrototype =
894 LayoutPrototypeServiceUtil.getLayoutPrototype(
895 layoutPrototypeId);
896
897 String layoutPrototypeLinkEnabled= ParamUtil.getString(
898 uploadPortletRequest, "layoutPrototypeLinkEnabled");
899
900 if (Validator.isNotNull(layoutPrototypeLinkEnabled)) {
901 serviceContext.setAttribute(
902 "layoutPrototypeLinkEnabled",
903 layoutPrototypeLinkEnabled);
904 }
905
906 serviceContext.setAttribute(
907 "layoutPrototypeUuid", layoutPrototype.getUuid());
908
909 layout = LayoutServiceUtil.addLayout(
910 groupId, privateLayout, parentLayoutId, nameMap, titleMap,
911 descriptionMap, keywordsMap, robotsMap,
912 LayoutConstants.TYPE_PORTLET, hidden, friendlyURL,
913 serviceContext);
914 }
915 else {
916 layout = LayoutServiceUtil.addLayout(
917 groupId, privateLayout, parentLayoutId, nameMap, titleMap,
918 descriptionMap, keywordsMap, robotsMap, type, hidden,
919 friendlyURL, serviceContext);
920 }
921
922 layoutTypeSettingsProperties = layout.getTypeSettingsProperties();
923 }
924 else {
925
926
927
928 layout = LayoutLocalServiceUtil.getLayout(
929 groupId, privateLayout, layoutId);
930
931 oldFriendlyURL = layout.getFriendlyURL();
932
933 layout = LayoutServiceUtil.updateLayout(
934 groupId, privateLayout, layoutId, layout.getParentLayoutId(),
935 nameMap, titleMap, descriptionMap, keywordsMap, robotsMap, type,
936 hidden, friendlyURL, Boolean.valueOf(iconImage), iconBytes,
937 serviceContext);
938
939 layoutTypeSettingsProperties = layout.getTypeSettingsProperties();
940
941 if (oldFriendlyURL.equals(layout.getFriendlyURL())) {
942 oldFriendlyURL = StringPool.BLANK;
943 }
944
945 UnicodeProperties formTypeSettingsProperties =
946 PropertiesParamUtil.getProperties(
947 actionRequest, "TypeSettingsProperties--");
948
949 if (type.equals(LayoutConstants.TYPE_PORTLET)) {
950 LayoutTypePortlet layoutTypePortlet =
951 (LayoutTypePortlet)layout.getLayoutType();
952
953 String layoutTemplateId = ParamUtil.getString(
954 uploadPortletRequest, "layoutTemplateId",
955 PropsValues.DEFAULT_LAYOUT_TEMPLATE_ID);
956
957 layoutTypePortlet.setLayoutTemplateId(
958 themeDisplay.getUserId(), layoutTemplateId);
959
960 long copyLayoutId = ParamUtil.getLong(
961 uploadPortletRequest, "copyLayoutId");
962
963 if ((copyLayoutId > 0) &&
964 (copyLayoutId != layout.getLayoutId())) {
965
966 try {
967 Layout copyLayout = LayoutLocalServiceUtil.getLayout(
968 groupId, privateLayout, copyLayoutId);
969
970 if (copyLayout.isTypePortlet()) {
971 layoutTypeSettingsProperties =
972 copyLayout.getTypeSettingsProperties();
973
974 ActionUtil.copyPreferences(
975 actionRequest, layout, copyLayout);
976
977 SitesUtil.copyLookAndFeel(layout, copyLayout);
978 }
979 }
980 catch (NoSuchLayoutException nsle) {
981 }
982 }
983 else {
984 layoutTypeSettingsProperties.putAll(
985 formTypeSettingsProperties);
986
987 LayoutServiceUtil.updateLayout(
988 groupId, privateLayout, layoutId,
989 layout.getTypeSettings());
990 }
991 }
992 else {
993 layout.setTypeSettingsProperties(formTypeSettingsProperties);
994
995 layoutTypeSettingsProperties.putAll(
996 layout.getTypeSettingsProperties());
997
998 LayoutServiceUtil.updateLayout(
999 groupId, privateLayout, layoutId, layout.getTypeSettings());
1000 }
1001
1002 String[] removeEmbeddedPortletIds = ParamUtil.getParameterValues(
1003 actionRequest, "removeEmbeddedPortletIds");
1004
1005 if (removeEmbeddedPortletIds.length > 0) {
1006 PortletLocalServiceUtil.deletePortlets(
1007 themeDisplay.getCompanyId(), removeEmbeddedPortletIds,
1008 layout.getPlid());
1009 }
1010
1011 LayoutSettings layoutSettings = LayoutSettings.getInstance(layout);
1012
1013 HttpServletResponse response = PortalUtil.getHttpServletResponse(
1014 actionResponse);
1015
1016 EventsProcessorUtil.process(
1017 PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE,
1018 layoutSettings.getConfigurationActionUpdate(),
1019 uploadPortletRequest, response);
1020 }
1021
1022 updateLookAndFeel(
1023 actionRequest, themeDisplay.getCompanyId(), liveGroupId,
1024 stagingGroupId, privateLayout, layout.getLayoutId(),
1025 layoutTypeSettingsProperties, layout.getThemeId());
1026
1027 return new Object[] {layout, oldFriendlyURL};
1028 }
1029
1030 protected void updateLayoutRevision(
1031 ActionRequest actionRequest, ThemeDisplay themeDisplay)
1032 throws Exception {
1033
1034 long layoutRevisionId = ParamUtil.getLong(
1035 actionRequest, "layoutRevisionId");
1036
1037 LayoutRevision layoutRevision =
1038 LayoutRevisionLocalServiceUtil.getLayoutRevision(layoutRevisionId);
1039
1040 ServiceContext serviceContext = ServiceContextFactory.getInstance(
1041 actionRequest);
1042
1043 LayoutRevision enableLayoutRevision =
1044 LayoutRevisionLocalServiceUtil.updateLayoutRevision(
1045 serviceContext.getUserId(), layoutRevisionId,
1046 layoutRevision.getLayoutBranchId(), layoutRevision.getName(),
1047 layoutRevision.getTitle(), layoutRevision.getDescription(),
1048 layoutRevision.getKeywords(), layoutRevision.getRobots(),
1049 layoutRevision.getTypeSettings(), layoutRevision.getIconImage(),
1050 layoutRevision.getIconImageId(), layoutRevision.getThemeId(),
1051 layoutRevision.getColorSchemeId(),
1052 layoutRevision.getWapThemeId(),
1053 layoutRevision.getWapColorSchemeId(), layoutRevision.getCss(),
1054 serviceContext);
1055
1056 if (layoutRevision.getStatus() == WorkflowConstants.STATUS_INCOMPLETE) {
1057 LayoutRevision lastLayoutRevision =
1058 LayoutRevisionLocalServiceUtil.fetchLastLayoutRevision(
1059 enableLayoutRevision.getPlid(), true);
1060
1061 if (lastLayoutRevision != null) {
1062 LayoutRevision newLayoutRevision =
1063 LayoutRevisionLocalServiceUtil.addLayoutRevision(
1064 serviceContext.getUserId(),
1065 layoutRevision.getLayoutSetBranchId(),
1066 layoutRevision.getLayoutBranchId(),
1067 enableLayoutRevision.getLayoutRevisionId(), false,
1068 layoutRevision.getPlid(),
1069 lastLayoutRevision.getLayoutRevisionId(),
1070 lastLayoutRevision.isPrivateLayout(),
1071 lastLayoutRevision.getName(),
1072 lastLayoutRevision.getTitle(),
1073 lastLayoutRevision.getDescription(),
1074 lastLayoutRevision.getKeywords(),
1075 lastLayoutRevision.getRobots(),
1076 lastLayoutRevision.getTypeSettings(),
1077 lastLayoutRevision.isIconImage(),
1078 lastLayoutRevision.getIconImageId(),
1079 lastLayoutRevision.getThemeId(),
1080 lastLayoutRevision.getColorSchemeId(),
1081 lastLayoutRevision.getWapThemeId(),
1082 lastLayoutRevision.getWapColorSchemeId(),
1083 lastLayoutRevision.getCss(), serviceContext);
1084
1085 StagingUtil.setRecentLayoutRevisionId(
1086 themeDisplay.getUser(),
1087 newLayoutRevision.getLayoutSetBranchId(),
1088 newLayoutRevision.getPlid(),
1089 newLayoutRevision.getLayoutRevisionId());
1090 }
1091 }
1092 }
1093
1094 protected void updateLookAndFeel(
1095 ActionRequest actionRequest, long companyId, long liveGroupId,
1096 long stagingGroupId, boolean privateLayout, long layoutId,
1097 UnicodeProperties typeSettingsProperties, String themeId)
1098 throws Exception {
1099
1100 String[] devices = StringUtil.split(
1101 ParamUtil.getString(actionRequest, "devices"));
1102
1103 for (String device : devices) {
1104 String deviceThemeId = ParamUtil.getString(
1105 actionRequest, device + "ThemeId");
1106 String deviceColorSchemeId = ParamUtil.getString(
1107 actionRequest, device + "ColorSchemeId");
1108 String deviceCss = ParamUtil.getString(
1109 actionRequest, device + "Css");
1110 boolean deviceWapTheme = device.equals("wap");
1111
1112 boolean deviceInheritLookAndFeel = ParamUtil.getBoolean(
1113 actionRequest, device + "InheritLookAndFeel");
1114
1115 if (deviceInheritLookAndFeel) {
1116 deviceThemeId = ThemeImpl.getDefaultRegularThemeId(companyId);
1117 deviceColorSchemeId = StringPool.BLANK;
1118
1119 deleteThemeSettingsProperties(typeSettingsProperties, device);
1120 }
1121 else if (Validator.isNotNull(deviceThemeId)) {
1122 deviceColorSchemeId = getColorSchemeId(
1123 companyId, deviceThemeId, deviceColorSchemeId,
1124 deviceWapTheme);
1125
1126 updateThemeSettingsProperties(
1127 actionRequest, companyId, typeSettingsProperties, themeId,
1128 device, deviceThemeId, deviceWapTheme);
1129 }
1130
1131 long groupId = liveGroupId;
1132
1133 if (stagingGroupId > 0) {
1134 groupId = stagingGroupId;
1135 }
1136
1137 LayoutServiceUtil.updateLayout(
1138 groupId, privateLayout, layoutId,
1139 typeSettingsProperties.toString());
1140
1141 LayoutServiceUtil.updateLookAndFeel(
1142 groupId, privateLayout, layoutId, deviceThemeId,
1143 deviceColorSchemeId, deviceCss, deviceWapTheme);
1144 }
1145 }
1146
1147 protected UnicodeProperties updateThemeSettingsProperties(
1148 ActionRequest actionRequest, long companyId,
1149 UnicodeProperties typeSettingsProperties, String themeId,
1150 String device, String deviceThemeId, boolean wapTheme)
1151 throws Exception {
1152
1153 Theme theme = ThemeLocalServiceUtil.getTheme(
1154 companyId, deviceThemeId, wapTheme);
1155
1156 deleteThemeSettingsProperties(typeSettingsProperties, device);
1157
1158 Map<String, ThemeSetting> themeSettings =
1159 theme.getConfigurableSettings();
1160
1161 if (themeSettings.isEmpty()) {
1162 return typeSettingsProperties;
1163 }
1164
1165 setThemeSettingProperties(
1166 actionRequest, typeSettingsProperties, themeId, themeSettings,
1167 device, deviceThemeId);
1168
1169 return typeSettingsProperties;
1170 }
1171
1172 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
1173
1174 private static Log _log = LogFactoryUtil.getLog(EditLayoutsAction.class);
1175
1176 }