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