001
014
015 package com.liferay.portal.messaging;
016
017 import com.liferay.portal.kernel.messaging.BaseMessageStatusMessageListener;
018 import com.liferay.portal.kernel.messaging.Message;
019 import com.liferay.portal.kernel.messaging.MessageStatus;
020 import com.liferay.portal.kernel.messaging.sender.MessageSender;
021 import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
022 import com.liferay.portal.kernel.staging.StagingUtil;
023 import com.liferay.portal.kernel.util.ArrayUtil;
024 import com.liferay.portal.kernel.util.MapUtil;
025 import com.liferay.portal.kernel.util.Time;
026 import com.liferay.portal.model.CompanyConstants;
027 import com.liferay.portal.model.LayoutSet;
028 import com.liferay.portal.model.User;
029 import com.liferay.portal.security.auth.CompanyThreadLocal;
030 import com.liferay.portal.security.auth.PrincipalThreadLocal;
031 import com.liferay.portal.security.permission.PermissionChecker;
032 import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
033 import com.liferay.portal.security.permission.PermissionThreadLocal;
034 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
035 import com.liferay.portal.service.ServiceContext;
036 import com.liferay.portal.service.ServiceContextThreadLocal;
037 import com.liferay.portal.service.UserLocalServiceUtil;
038 import com.liferay.portal.util.PortalUtil;
039
040 import java.io.Serializable;
041
042 import java.util.Date;
043 import java.util.HashMap;
044 import java.util.Map;
045
046
049 public class LayoutsRemotePublisherMessageListener
050 extends BaseMessageStatusMessageListener {
051
052 public LayoutsRemotePublisherMessageListener() {
053 }
054
055
058 public LayoutsRemotePublisherMessageListener(
059 SingleDestinationMessageSender statusSender,
060 MessageSender responseSender) {
061
062 super(statusSender, responseSender);
063 }
064
065 @Override
066 protected void doReceive(Message message, MessageStatus messageStatus)
067 throws Exception {
068
069 LayoutsRemotePublisherRequest publisherRequest =
070 (LayoutsRemotePublisherRequest)message.getPayload();
071
072 messageStatus.setPayload(publisherRequest);
073
074 long userId = publisherRequest.getUserId();
075 long sourceGroupId = publisherRequest.getSourceGroupId();
076 boolean privateLayout = publisherRequest.isPrivateLayout();
077 Map<Long, Boolean> layoutIdMap = publisherRequest.getLayoutIdMap();
078 Map<String, String[]> parameterMap = publisherRequest.getParameterMap();
079 String remoteAddress = publisherRequest.getRemoteAddress();
080 int remotePort = publisherRequest.getRemotePort();
081 String remotePathContext = publisherRequest.getRemotePathContext();
082 boolean secureConnection = publisherRequest.isSecureConnection();
083 long remoteGroupId = publisherRequest.getRemoteGroupId();
084 boolean remotePrivateLayout = publisherRequest.isRemotePrivateLayout();
085 Date startDate = publisherRequest.getStartDate();
086 Date endDate = publisherRequest.getEndDate();
087
088 String range = MapUtil.getString(parameterMap, "range");
089
090 initThreadLocals(userId, parameterMap);
091
092 if (range.equals("fromLastPublishDate")) {
093 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
094 sourceGroupId, privateLayout);
095
096 Date lastPublishDate = StagingUtil.getLastPublishDate(layoutSet);
097
098 if (lastPublishDate != null) {
099 endDate = new Date();
100
101 startDate = lastPublishDate;
102 }
103 }
104 else if (range.equals("last")) {
105 int last = MapUtil.getInteger(parameterMap, "last");
106
107 if (last > 0) {
108 Date scheduledFireTime =
109 publisherRequest.getScheduledFireTime();
110
111 if (scheduledFireTime == null) {
112 scheduledFireTime = new Date();
113 }
114
115 startDate = new Date(
116 scheduledFireTime.getTime() - (last * Time.HOUR));
117
118 endDate = scheduledFireTime;
119 }
120 }
121
122 try {
123 StagingUtil.copyRemoteLayouts(
124 sourceGroupId, privateLayout, layoutIdMap, parameterMap,
125 remoteAddress, remotePort, remotePathContext, secureConnection,
126 remoteGroupId, remotePrivateLayout, startDate, endDate);
127 }
128 finally {
129 resetThreadLocals();
130 }
131 }
132
133 protected void initThreadLocals(
134 long userId, Map<String, String[]> parameterMap)
135 throws Exception {
136
137 User user = UserLocalServiceUtil.getUserById(userId);
138
139 CompanyThreadLocal.setCompanyId(user.getCompanyId());
140
141 PermissionChecker permissionChecker =
142 PermissionCheckerFactoryUtil.create(user);
143
144 PermissionThreadLocal.setPermissionChecker(permissionChecker);
145
146 PrincipalThreadLocal.setName(user.getUserId());
147
148 ServiceContext serviceContext = new ServiceContext();
149
150 serviceContext.setCompanyId(user.getCompanyId());
151 serviceContext.setPathMain(PortalUtil.getPathMain());
152 serviceContext.setSignedIn(!user.isDefaultUser());
153 serviceContext.setUserId(user.getUserId());
154
155 Map<String, Serializable> attributes =
156 new HashMap<String, Serializable>();
157
158 for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
159 String param = entry.getKey();
160 String[] values = entry.getValue();
161
162 if (ArrayUtil.isNotEmpty(values)) {
163 if (values.length == 1) {
164 attributes.put(param, values[0]);
165 }
166 else {
167 attributes.put(param, values);
168 }
169 }
170 }
171
172 serviceContext.setAttributes(attributes);
173
174 ServiceContextThreadLocal.pushServiceContext(serviceContext);
175 }
176
177 protected void resetThreadLocals() {
178 CompanyThreadLocal.setCompanyId(CompanyConstants.SYSTEM);
179 PermissionThreadLocal.setPermissionChecker(null);
180 PrincipalThreadLocal.setName(null);
181 ServiceContextThreadLocal.popServiceContext();
182 }
183
184 }