001    /**
002     * Copyright (c) 2000-2013 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.MapUtil;
024    import com.liferay.portal.kernel.zip.ZipReader;
025    import com.liferay.portal.kernel.zip.ZipWriter;
026    import com.liferay.portal.model.Group;
027    import com.liferay.portal.model.Layout;
028    import com.liferay.portal.security.auth.CompanyThreadLocal;
029    import com.liferay.portal.service.GroupLocalServiceUtil;
030    import com.liferay.portal.theme.ThemeDisplay;
031    
032    import java.util.ArrayList;
033    import java.util.Collections;
034    import java.util.Date;
035    import java.util.HashMap;
036    import java.util.Map;
037    
038    /**
039     * @author Mate Thurzo
040     */
041    public class PortletDataContextFactoryImpl
042            implements PortletDataContextFactory {
043    
044            @Override
045            public PortletDataContext clonePortletDataContext(
046                    PortletDataContext portletDataContext) {
047    
048                    PortletDataContext clonePortletDataContext =
049                            new PortletDataContextImpl();
050    
051                    clonePortletDataContext.setCompanyId(portletDataContext.getCompanyId());
052                    clonePortletDataContext.setCompanyGroupId(
053                            portletDataContext.getCompanyGroupId());
054                    clonePortletDataContext.setDataStrategy(
055                            portletDataContext.getDataStrategy());
056                    clonePortletDataContext.setEndDate(portletDataContext.getEndDate());
057                    clonePortletDataContext.setGroupId(portletDataContext.getGroupId());
058    
059                    ManifestSummary manifestSummary =
060                            portletDataContext.getManifestSummary();
061    
062                    clonePortletDataContext.setManifestSummary(
063                            (ManifestSummary)manifestSummary.clone());
064    
065                    clonePortletDataContext.setNewLayouts(
066                            portletDataContext.getNewLayouts());
067    
068                    Map<String, Map<?, ?>> newPrimaryKeysMaps =
069                            portletDataContext.getNewPrimaryKeysMaps();
070    
071                    if ((newPrimaryKeysMaps != null) && !newPrimaryKeysMaps.isEmpty()) {
072                            clonePortletDataContext.setNewPrimaryKeysMaps(
073                                    new HashMap<String, Map<?, ?>>(newPrimaryKeysMaps));
074                    }
075    
076                    clonePortletDataContext.setParameterMap(
077                            portletDataContext.getParameterMap());
078                    clonePortletDataContext.setScopeGroupId(
079                            portletDataContext.getScopeGroupId());
080                    clonePortletDataContext.setStartDate(portletDataContext.getStartDate());
081                    clonePortletDataContext.setUserIdStrategy(
082                            portletDataContext.getUserIdStrategy());
083                    clonePortletDataContext.setUserPersonalSiteGroupId(
084                            portletDataContext.getUserPersonalSiteGroupId());
085    
086                    return clonePortletDataContext;
087            }
088    
089            @Override
090            public PortletDataContext createExportPortletDataContext(
091                            long companyId, long groupId, Map<String, String[]> parameterMap,
092                            Date startDate, Date endDate, ZipWriter zipWriter)
093                    throws PortletDataException {
094    
095                    validateDateRange(startDate, endDate);
096    
097                    PortletDataContext portletDataContext = createPortletDataContext(
098                            companyId, groupId);
099    
100                    portletDataContext.setEndDate(endDate);
101                    portletDataContext.setParameterMap(parameterMap);
102                    portletDataContext.setStartDate(startDate);
103                    portletDataContext.setZipWriter(zipWriter);
104    
105                    return portletDataContext;
106            }
107    
108            @Override
109            public PortletDataContext createImportPortletDataContext(
110                    long companyId, long groupId, Map<String, String[]> parameterMap,
111                    UserIdStrategy userIdStrategy, ZipReader zipReader) {
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.setUserIdStrategy(userIdStrategy);
125                    portletDataContext.setZipReader(zipReader);
126    
127                    return portletDataContext;
128            }
129    
130            @Override
131            public PortletDataContext createPreparePortletDataContext(
132                            long companyId, long groupId, Date startDate, Date endDate)
133                    throws PortletDataException {
134    
135                    validateDateRange(startDate, endDate);
136    
137                    PortletDataContext portletDataContext = createPortletDataContext(
138                            companyId, groupId);
139    
140                    portletDataContext.setEndDate(endDate);
141                    portletDataContext.setParameterMap(
142                            Collections.<String, String[]>emptyMap());
143                    portletDataContext.setStartDate(startDate);
144    
145                    return portletDataContext;
146            }
147    
148            @Override
149            public PortletDataContext createPreparePortletDataContext(
150                            ThemeDisplay themeDisplay, Date startDate, Date endDate)
151                    throws PortletDataException {
152    
153                    return createPreparePortletDataContext(
154                            themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(),
155                            startDate, endDate);
156            }
157    
158            protected PortletDataContext createPortletDataContext(
159                    long companyId, long groupId) {
160    
161                    PortletDataContext portletDataContext = new PortletDataContextImpl();
162    
163                    try {
164                            Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
165                                    companyId);
166    
167                            portletDataContext.setCompanyGroupId(companyGroup.getGroupId());
168                    }
169                    catch (Exception e) {
170                            if (!CompanyThreadLocal.isDeleteInProcess()) {
171                                    throw new IllegalStateException(e);
172                            }
173                    }
174    
175                    portletDataContext.setCompanyId(companyId);
176                    portletDataContext.setGroupId(groupId);
177                    portletDataContext.setScopeGroupId(groupId);
178    
179                    try {
180                            Group userPersonalSiteGroup =
181                                    GroupLocalServiceUtil.getUserPersonalSiteGroup(companyId);
182    
183                            portletDataContext.setUserPersonalSiteGroupId(
184                                    userPersonalSiteGroup.getGroupId());
185                    }
186                    catch (Exception e) {
187                            if (!CompanyThreadLocal.isDeleteInProcess()) {
188                                    throw new IllegalStateException(e);
189                            }
190                    }
191    
192                    return portletDataContext;
193            }
194    
195            protected void validateDateRange(Date startDate, Date endDate)
196                    throws PortletDataException {
197    
198                    if ((startDate == null) && (endDate != null)) {
199                            throw new PortletDataException(
200                                    PortletDataException.END_DATE_IS_MISSING_START_DATE);
201                    }
202                    else if ((startDate != null) && (endDate == null)) {
203                            throw new PortletDataException(
204                                    PortletDataException.START_DATE_IS_MISSING_END_DATE);
205                    }
206    
207                    if (startDate != null) {
208                            if (startDate.after(endDate) || startDate.equals(endDate)) {
209                                    throw new PortletDataException(
210                                            PortletDataException.START_DATE_AFTER_END_DATE);
211                            }
212    
213                            Date now = new Date();
214    
215                            if (startDate.after(now)) {
216                                    throw new PortletDataException(
217                                            PortletDataException.FUTURE_START_DATE);
218                            }
219    
220                            if (endDate.after(now)) {
221                                    throw new PortletDataException(
222                                            PortletDataException.FUTURE_END_DATE);
223                            }
224                    }
225            }
226    
227    }