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.Collections;
038    import java.util.Date;
039    import java.util.Map;
040    
041    /**
042     * @author Mate Thurzo
043     */
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    }