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