001
014
015 package com.liferay.portal.lar;
016
017 import com.liferay.portal.kernel.lar.ManifestSummary;
018 import com.liferay.portal.kernel.lar.PortletDataContext;
019 import com.liferay.portal.kernel.lar.PortletDataContextFactory;
020 import com.liferay.portal.kernel.lar.PortletDataException;
021 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
022 import com.liferay.portal.kernel.lar.UserIdStrategy;
023 import com.liferay.portal.kernel.util.GetterUtil;
024 import com.liferay.portal.kernel.util.MapUtil;
025 import com.liferay.portal.kernel.xml.Document;
026 import com.liferay.portal.kernel.xml.Element;
027 import com.liferay.portal.kernel.xml.SAXReaderUtil;
028 import com.liferay.portal.kernel.zip.ZipReader;
029 import com.liferay.portal.kernel.zip.ZipWriter;
030 import com.liferay.portal.model.Group;
031 import com.liferay.portal.model.Layout;
032 import com.liferay.portal.security.auth.CompanyThreadLocal;
033 import com.liferay.portal.service.GroupLocalServiceUtil;
034 import com.liferay.portal.theme.ThemeDisplay;
035
036 import java.util.ArrayList;
037 import java.util.Collections;
038 import java.util.Date;
039 import java.util.Map;
040
041
044 public class PortletDataContextFactoryImpl
045 implements PortletDataContextFactory {
046
047 @Override
048 public PortletDataContext clonePortletDataContext(
049 PortletDataContext portletDataContext) {
050
051 PortletDataContext clonePortletDataContext =
052 new PortletDataContextImpl();
053
054 clonePortletDataContext.setCompanyId(portletDataContext.getCompanyId());
055 clonePortletDataContext.setCompanyGroupId(
056 portletDataContext.getCompanyGroupId());
057 clonePortletDataContext.setDataStrategy(
058 portletDataContext.getDataStrategy());
059 clonePortletDataContext.setEndDate(portletDataContext.getEndDate());
060 clonePortletDataContext.setGroupId(portletDataContext.getGroupId());
061
062 ManifestSummary manifestSummary =
063 portletDataContext.getManifestSummary();
064
065 clonePortletDataContext.setManifestSummary(
066 (ManifestSummary)manifestSummary.clone());
067
068 clonePortletDataContext.setParameterMap(
069 portletDataContext.getParameterMap());
070 clonePortletDataContext.setPortletId(portletDataContext.getPortletId());
071 clonePortletDataContext.setScopeGroupId(
072 portletDataContext.getScopeGroupId());
073 clonePortletDataContext.setSourceCompanyId(
074 portletDataContext.getSourceCompanyId());
075 clonePortletDataContext.setSourceCompanyGroupId(
076 portletDataContext.getSourceCompanyGroupId());
077 clonePortletDataContext.setSourceGroupId(
078 portletDataContext.getSourceGroupId());
079 clonePortletDataContext.setSourceUserPersonalSiteGroupId(
080 portletDataContext.getSourceUserPersonalSiteGroupId());
081 clonePortletDataContext.setStartDate(portletDataContext.getStartDate());
082 clonePortletDataContext.setUserIdStrategy(
083 portletDataContext.getUserIdStrategy());
084 clonePortletDataContext.setUserPersonalSiteGroupId(
085 portletDataContext.getUserPersonalSiteGroupId());
086
087 return clonePortletDataContext;
088 }
089
090 @Override
091 public PortletDataContext createExportPortletDataContext(
092 long companyId, long groupId, Map<String, String[]> parameterMap,
093 Date startDate, Date endDate, ZipWriter zipWriter)
094 throws PortletDataException {
095
096 validateDateRange(startDate, endDate);
097
098 PortletDataContext portletDataContext = createPortletDataContext(
099 companyId, groupId);
100
101 portletDataContext.setEndDate(endDate);
102 portletDataContext.setParameterMap(parameterMap);
103 portletDataContext.setStartDate(startDate);
104 portletDataContext.setZipWriter(zipWriter);
105
106 return portletDataContext;
107 }
108
109 @Override
110 public PortletDataContext createImportPortletDataContext(
111 long companyId, long groupId, Map<String, String[]> parameterMap,
112 UserIdStrategy userIdStrategy, ZipReader zipReader)
113 throws PortletDataException {
114
115 PortletDataContext portletDataContext = createPortletDataContext(
116 companyId, groupId);
117
118 String dataStrategy = MapUtil.getString(
119 parameterMap, PortletDataHandlerKeys.DATA_STRATEGY,
120 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR);
121
122 portletDataContext.setDataStrategy(dataStrategy);
123
124 portletDataContext.setNewLayouts(new ArrayList<Layout>());
125 portletDataContext.setParameterMap(parameterMap);
126 portletDataContext.setPortetDataContextListener(
127 new PortletDataContextListenerImpl(portletDataContext));
128 portletDataContext.setUserIdStrategy(userIdStrategy);
129 portletDataContext.setZipReader(zipReader);
130
131 readXML(portletDataContext);
132
133 return portletDataContext;
134 }
135
136 @Override
137 public PortletDataContext createPreparePortletDataContext(
138 long companyId, long groupId, Date startDate, Date endDate)
139 throws PortletDataException {
140
141 validateDateRange(startDate, endDate);
142
143 PortletDataContext portletDataContext = createPortletDataContext(
144 companyId, groupId);
145
146 portletDataContext.setEndDate(endDate);
147 portletDataContext.setParameterMap(
148 Collections.<String, String[]>emptyMap());
149 portletDataContext.setStartDate(startDate);
150
151 return portletDataContext;
152 }
153
154 @Override
155 public PortletDataContext createPreparePortletDataContext(
156 ThemeDisplay themeDisplay, Date startDate, Date endDate)
157 throws PortletDataException {
158
159 return createPreparePortletDataContext(
160 themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(),
161 startDate, endDate);
162 }
163
164 protected PortletDataContext createPortletDataContext(
165 long companyId, long groupId) {
166
167 PortletDataContext portletDataContext = new PortletDataContextImpl();
168
169 try {
170 Group companyGroup = GroupLocalServiceUtil.fetchCompanyGroup(
171 companyId);
172
173 if (companyGroup != null) {
174 portletDataContext.setCompanyGroupId(companyGroup.getGroupId());
175 }
176 }
177 catch (Exception e) {
178 if (!CompanyThreadLocal.isDeleteInProcess()) {
179 throw new IllegalStateException(e);
180 }
181 }
182
183 portletDataContext.setCompanyId(companyId);
184 portletDataContext.setGroupId(groupId);
185 portletDataContext.setScopeGroupId(groupId);
186
187 try {
188 Group userPersonalSiteGroup =
189 GroupLocalServiceUtil.fetchUserPersonalSiteGroup(companyId);
190
191 if (userPersonalSiteGroup != null) {
192 portletDataContext.setUserPersonalSiteGroupId(
193 userPersonalSiteGroup.getGroupId());
194 }
195 }
196 catch (Exception e) {
197 if (!CompanyThreadLocal.isDeleteInProcess()) {
198 throw new IllegalStateException(e);
199 }
200 }
201
202 return portletDataContext;
203 }
204
205 protected void readXML(PortletDataContext portletDataContext)
206 throws PortletDataException {
207
208 String xml = portletDataContext.getZipEntryAsString("/manifest.xml");
209
210 Element rootElement = null;
211
212 try {
213 Document document = SAXReaderUtil.read(xml);
214
215 rootElement = document.getRootElement();
216 }
217 catch (Exception e) {
218 throw new PortletDataException(e);
219 }
220
221 portletDataContext.setImportDataRootElement(rootElement);
222
223 Element headerElement = rootElement.element("header");
224
225 long sourceCompanyId = GetterUtil.getLong(
226 headerElement.attributeValue("company-id"));
227
228 portletDataContext.setSourceCompanyId(sourceCompanyId);
229
230 long sourceCompanyGroupId = GetterUtil.getLong(
231 headerElement.attributeValue("company-group-id"));
232
233 portletDataContext.setSourceCompanyGroupId(sourceCompanyGroupId);
234
235 long sourceGroupId = GetterUtil.getLong(
236 headerElement.attributeValue("group-id"));
237
238 portletDataContext.setSourceGroupId(sourceGroupId);
239
240 long sourceUserPersonalSiteGroupId = GetterUtil.getLong(
241 headerElement.attributeValue("user-personal-site-group-id"));
242
243 portletDataContext.setSourceUserPersonalSiteGroupId(
244 sourceUserPersonalSiteGroupId);
245 }
246
247 protected void validateDateRange(Date startDate, Date endDate)
248 throws PortletDataException {
249
250 if ((startDate == null) && (endDate != null)) {
251 throw new PortletDataException(
252 PortletDataException.END_DATE_IS_MISSING_START_DATE);
253 }
254 else if ((startDate != null) && (endDate == null)) {
255 throw new PortletDataException(
256 PortletDataException.START_DATE_IS_MISSING_END_DATE);
257 }
258
259 if (startDate != null) {
260 if (startDate.after(endDate) || startDate.equals(endDate)) {
261 throw new PortletDataException(
262 PortletDataException.START_DATE_AFTER_END_DATE);
263 }
264
265 Date now = new Date();
266
267 if (startDate.after(now)) {
268 throw new PortletDataException(
269 PortletDataException.FUTURE_START_DATE);
270 }
271
272 if (endDate.after(now)) {
273 throw new PortletDataException(
274 PortletDataException.FUTURE_END_DATE);
275 }
276 }
277 }
278
279 }