001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
036     * @author Mate Thurzo
037     */
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    }