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