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.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    /**
041     * @author Mate Thurzo
042     */
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    }