001
014
015 package com.liferay.portal.lar.backgroundtask;
016
017 import com.liferay.portal.kernel.backgroundtask.BackgroundTaskResult;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.lar.ExportImportDateUtil;
021 import com.liferay.portal.kernel.lar.ExportImportThreadLocal;
022 import com.liferay.portal.kernel.lar.MissingReferences;
023 import com.liferay.portal.kernel.lar.lifecycle.ExportImportLifecycleConstants;
024 import com.liferay.portal.kernel.lar.lifecycle.ExportImportLifecycleManager;
025 import com.liferay.portal.kernel.log.Log;
026 import com.liferay.portal.kernel.log.LogFactoryUtil;
027 import com.liferay.portal.kernel.staging.StagingUtil;
028 import com.liferay.portal.kernel.util.DateRange;
029 import com.liferay.portal.kernel.util.FileUtil;
030 import com.liferay.portal.kernel.util.GetterUtil;
031 import com.liferay.portal.kernel.util.MapUtil;
032 import com.liferay.portal.kernel.util.UnicodeProperties;
033 import com.liferay.portal.model.BackgroundTask;
034 import com.liferay.portal.model.ExportImportConfiguration;
035 import com.liferay.portal.model.Group;
036 import com.liferay.portal.service.ExportImportConfigurationLocalServiceUtil;
037 import com.liferay.portal.service.GroupLocalServiceUtil;
038 import com.liferay.portal.service.LayoutLocalServiceUtil;
039 import com.liferay.portal.service.LayoutSetBranchLocalServiceUtil;
040 import com.liferay.portal.service.ServiceContext;
041 import com.liferay.portal.service.StagingLocalServiceUtil;
042 import com.liferay.portal.spring.transaction.TransactionalCallableUtil;
043
044 import java.io.File;
045 import java.io.Serializable;
046
047 import java.util.Map;
048 import java.util.concurrent.Callable;
049
050
053 public class LayoutStagingBackgroundTaskExecutor
054 extends BaseStagingBackgroundTaskExecutor {
055
056 public LayoutStagingBackgroundTaskExecutor() {
057 setBackgroundTaskStatusMessageTranslator(
058 new LayoutStagingBackgroundTaskStatusMessageTranslator());
059 }
060
061 @Override
062 public BackgroundTaskResult execute(BackgroundTask backgroundTask)
063 throws PortalException {
064
065 Map<String, Serializable> taskContextMap =
066 backgroundTask.getTaskContextMap();
067
068 long exportImportConfigurationId = MapUtil.getLong(
069 taskContextMap, "exportImportConfigurationId");
070
071 ExportImportConfiguration exportImportConfiguration =
072 ExportImportConfigurationLocalServiceUtil.
073 getExportImportConfiguration(exportImportConfigurationId);
074
075 Map<String, Serializable> settingsMap =
076 exportImportConfiguration.getSettingsMap();
077
078 long userId = MapUtil.getLong(settingsMap, "userId");
079 long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId");
080
081 StagingUtil.lockGroup(userId, targetGroupId);
082
083 long sourceGroupId = MapUtil.getLong(settingsMap, "sourceGroupId");
084
085 clearBackgroundTaskStatus(backgroundTask);
086
087 MissingReferences missingReferences = null;
088
089 try {
090 ExportImportThreadLocal.setLayoutStagingInProcess(true);
091
092 ExportImportLifecycleManager.fireExportImportLifecycleEvent(
093 ExportImportLifecycleConstants.
094 EVENT_PUBLICATION_LAYOUT_LOCAL_STARTED,
095 exportImportConfiguration);
096
097 missingReferences = TransactionalCallableUtil.call(
098 transactionAttribute,
099 new LayoutStagingCallable(
100 backgroundTask.getBackgroundTaskId(),
101 exportImportConfiguration, sourceGroupId, targetGroupId,
102 userId));
103
104 ExportImportLifecycleManager.fireExportImportLifecycleEvent(
105 ExportImportLifecycleConstants.
106 EVENT_PUBLICATION_LAYOUT_LOCAL_SUCCEEDED,
107 exportImportConfiguration);
108 }
109 catch (Throwable t) {
110 ExportImportLifecycleManager.fireExportImportLifecycleEvent(
111 ExportImportLifecycleConstants.
112 EVENT_PUBLICATION_LAYOUT_LOCAL_FAILED,
113 exportImportConfiguration, t);
114
115 if (_log.isDebugEnabled()) {
116 _log.debug(t, t);
117 }
118 else if (_log.isWarnEnabled()) {
119 _log.warn("Unable to publish layout: " + t.getMessage());
120 }
121
122 Group sourceGroup = GroupLocalServiceUtil.getGroup(sourceGroupId);
123
124 if (sourceGroup.hasStagingGroup()) {
125 ServiceContext serviceContext = new ServiceContext();
126
127 serviceContext.setUserId(userId);
128
129 StagingLocalServiceUtil.disableStaging(
130 sourceGroup, serviceContext);
131 }
132
133 throw new SystemException(t);
134 }
135 finally {
136 ExportImportThreadLocal.setLayoutStagingInProcess(false);
137
138 StagingUtil.unlockGroup(targetGroupId);
139 }
140
141 return processMissingReferences(
142 backgroundTask.getBackgroundTaskId(), missingReferences);
143 }
144
145 protected void initLayoutSetBranches(
146 long userId, long sourceGroupId, long targetGroupId)
147 throws PortalException {
148
149 Group sourceGroup = GroupLocalServiceUtil.getGroup(sourceGroupId);
150
151 if (!sourceGroup.hasStagingGroup()) {
152 return;
153 }
154
155 LayoutSetBranchLocalServiceUtil.deleteLayoutSetBranches(
156 targetGroupId, false, true);
157 LayoutSetBranchLocalServiceUtil.deleteLayoutSetBranches(
158 targetGroupId, true, true);
159
160 UnicodeProperties typeSettingsProperties =
161 sourceGroup.getTypeSettingsProperties();
162
163 boolean branchingPrivate = GetterUtil.getBoolean(
164 typeSettingsProperties.getProperty("branchingPrivate"));
165 boolean branchingPublic = GetterUtil.getBoolean(
166 typeSettingsProperties.getProperty("branchingPublic"));
167
168 ServiceContext serviceContext = new ServiceContext();
169
170 serviceContext.setUserId(userId);
171
172 StagingLocalServiceUtil.checkDefaultLayoutSetBranches(
173 userId, sourceGroup, branchingPublic, branchingPrivate, false,
174 serviceContext);
175 }
176
177 private static final Log _log = LogFactoryUtil.getLog(
178 LayoutStagingBackgroundTaskExecutor.class);
179
180 private class LayoutStagingCallable implements Callable<MissingReferences> {
181
182 public LayoutStagingCallable(
183 long backgroundTaskId,
184 ExportImportConfiguration exportImportConfiguration,
185 long sourceGroupId, long targetGroupId, long userId) {
186
187 _backgroundTaskId = backgroundTaskId;
188 _exportImportConfiguration = exportImportConfiguration;
189 _sourceGroupId = sourceGroupId;
190 _targetGroupId = targetGroupId;
191 _userId = userId;
192 }
193
194 @Override
195 public MissingReferences call() throws PortalException {
196 File file = null;
197 MissingReferences missingReferences = null;
198
199 try {
200 Map<String, Serializable> settingsMap =
201 _exportImportConfiguration.getSettingsMap();
202
203 boolean privateLayout = MapUtil.getBoolean(
204 settingsMap, "privateLayout");
205
206 initThreadLocals(_sourceGroupId, privateLayout);
207
208 long[] layoutIds = GetterUtil.getLongValues(
209 settingsMap.get("layoutIds"));
210 Map<String, String[]> parameterMap =
211 (Map<String, String[]>)settingsMap.get("parameterMap");
212 DateRange dateRange = ExportImportDateUtil.getDateRange(
213 _exportImportConfiguration,
214 ExportImportDateUtil.RANGE_FROM_LAST_PUBLISH_DATE);
215
216 file = LayoutLocalServiceUtil.exportLayoutsAsFile(
217 _sourceGroupId, privateLayout, layoutIds, parameterMap,
218 dateRange.getStartDate(), dateRange.getEndDate());
219
220 markBackgroundTask(_backgroundTaskId, "exported");
221
222 missingReferences =
223 LayoutLocalServiceUtil.validateImportLayoutsFile(
224 _userId, _targetGroupId, privateLayout, parameterMap,
225 file);
226
227 markBackgroundTask(_backgroundTaskId, "validated");
228
229 LayoutLocalServiceUtil.importLayouts(
230 _userId, _targetGroupId, privateLayout, parameterMap, file);
231
232 initLayoutSetBranches(_userId, _sourceGroupId, _targetGroupId);
233 }
234 finally {
235 FileUtil.delete(file);
236 }
237
238 return missingReferences;
239 }
240
241 private final long _backgroundTaskId;
242 private final ExportImportConfiguration _exportImportConfiguration;
243 private final long _sourceGroupId;
244 private final long _targetGroupId;
245 private final long _userId;
246
247 }
248
249 }