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