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.PortletDataContext;
018    import com.liferay.portal.kernel.lar.PortletDataContextFactory;
019    import com.liferay.portal.kernel.lar.PortletDataException;
020    import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
021    import com.liferay.portal.kernel.lar.UserIdStrategy;
022    import com.liferay.portal.kernel.util.MapUtil;
023    import com.liferay.portal.kernel.zip.ZipReader;
024    import com.liferay.portal.kernel.zip.ZipWriter;
025    import com.liferay.portal.model.Group;
026    import com.liferay.portal.model.Layout;
027    import com.liferay.portal.service.GroupLocalServiceUtil;
028    import com.liferay.portal.theme.ThemeDisplay;
029    
030    import java.util.ArrayList;
031    import java.util.Date;
032    import java.util.Map;
033    
034    /**
035     * @author Mate Thurzo
036     */
037    public class PortletDataContextFactoryImpl
038            implements PortletDataContextFactory {
039    
040            @Override
041            public PortletDataContext clonePortletDataContext(
042                    PortletDataContext portletDataContext) {
043    
044                    PortletDataContext clonePortletDataContext =
045                            new PortletDataContextImpl();
046    
047                    clonePortletDataContext.setCompanyId(portletDataContext.getCompanyId());
048                    clonePortletDataContext.setCompanyGroupId(
049                            portletDataContext.getCompanyGroupId());
050                    clonePortletDataContext.setDataStrategy(
051                            portletDataContext.getDataStrategy());
052                    clonePortletDataContext.setEndDate(portletDataContext.getEndDate());
053                    clonePortletDataContext.setGroupId(portletDataContext.getGroupId());
054                    clonePortletDataContext.setNewLayouts(
055                            portletDataContext.getNewLayouts());
056                    clonePortletDataContext.setParameterMap(
057                            portletDataContext.getParameterMap());
058                    clonePortletDataContext.setScopeGroupId(
059                            portletDataContext.getScopeGroupId());
060                    clonePortletDataContext.setStartDate(portletDataContext.getStartDate());
061                    clonePortletDataContext.setUserIdStrategy(
062                            portletDataContext.getUserIdStrategy());
063                    clonePortletDataContext.setUserPersonalSiteGroupId(
064                            portletDataContext.getUserPersonalSiteGroupId());
065    
066                    return clonePortletDataContext;
067            }
068    
069            @Override
070            public PortletDataContext createExportPortletDataContext(
071                            long companyId, long groupId, Map<String, String[]> parameterMap,
072                            Date startDate, Date endDate, ZipWriter zipWriter)
073                    throws PortletDataException {
074    
075                    validateDateRange(startDate, endDate);
076    
077                    PortletDataContext portletDataContext = createPortletDataContext(
078                            companyId, groupId);
079    
080                    portletDataContext.setEndDate(endDate);
081                    portletDataContext.setParameterMap(parameterMap);
082                    portletDataContext.setStartDate(startDate);
083                    portletDataContext.setZipWriter(zipWriter);
084    
085                    return portletDataContext;
086            }
087    
088            @Override
089            public PortletDataContext createImportPortletDataContext(
090                    long companyId, long groupId, Map<String, String[]> parameterMap,
091                    UserIdStrategy userIdStrategy, ZipReader zipReader) {
092    
093                    PortletDataContext portletDataContext = createPortletDataContext(
094                            companyId, groupId);
095    
096                    String dataStrategy = MapUtil.getString(
097                            parameterMap, PortletDataHandlerKeys.DATA_STRATEGY,
098                            PortletDataHandlerKeys.DATA_STRATEGY_MIRROR);
099    
100                    portletDataContext.setDataStrategy(dataStrategy);
101    
102                    portletDataContext.setNewLayouts(new ArrayList<Layout>());
103                    portletDataContext.setParameterMap(parameterMap);
104                    portletDataContext.setUserIdStrategy(userIdStrategy);
105                    portletDataContext.setZipReader(zipReader);
106    
107                    return portletDataContext;
108            }
109    
110            @Override
111            public PortletDataContext createPreparePortletDataContext(
112                            ThemeDisplay themeDisplay, Date startDate, Date endDate)
113                    throws PortletDataException {
114    
115                    validateDateRange(startDate, endDate);
116    
117                    PortletDataContext portletDataContext = createPortletDataContext(
118                            themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId());
119    
120                    portletDataContext.setEndDate(endDate);
121                    portletDataContext.setStartDate(startDate);
122    
123                    return portletDataContext;
124            }
125    
126            protected PortletDataContext createPortletDataContext(
127                    long companyId, long groupId) {
128    
129                    PortletDataContext portletDataContext = new PortletDataContextImpl();
130    
131                    try {
132                            Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
133                                    companyId);
134    
135                            portletDataContext.setCompanyGroupId(companyGroup.getGroupId());
136                    }
137                    catch (Exception e) {
138                            throw new IllegalStateException(e);
139                    }
140    
141                    portletDataContext.setCompanyId(companyId);
142                    portletDataContext.setGroupId(groupId);
143                    portletDataContext.setScopeGroupId(groupId);
144    
145                    try {
146                            Group userPersonalSiteGroup =
147                                    GroupLocalServiceUtil.getUserPersonalSiteGroup(companyId);
148    
149                            portletDataContext.setUserPersonalSiteGroupId(
150                                    userPersonalSiteGroup.getGroupId());
151                    }
152                    catch (Exception e) {
153                            throw new IllegalStateException(e);
154                    }
155    
156                    return portletDataContext;
157            }
158    
159            protected void validateDateRange(Date startDate, Date endDate)
160                    throws PortletDataException {
161    
162                    if ((startDate == null) && (endDate != null)) {
163                            throw new PortletDataException(
164                                    PortletDataException.END_DATE_IS_MISSING_START_DATE);
165                    }
166                    else if ((startDate != null) && (endDate == null)) {
167                            throw new PortletDataException(
168                                    PortletDataException.START_DATE_IS_MISSING_END_DATE);
169                    }
170    
171                    if (startDate != null) {
172                            if (startDate.after(endDate) || startDate.equals(endDate)) {
173                                    throw new PortletDataException(
174                                            PortletDataException.START_DATE_AFTER_END_DATE);
175                            }
176    
177                            Date now = new Date();
178    
179                            if (startDate.after(now)) {
180                                    throw new PortletDataException(
181                                            PortletDataException.FUTURE_START_DATE);
182                            }
183    
184                            if (endDate.after(now)) {
185                                    throw new PortletDataException(
186                                            PortletDataException.FUTURE_END_DATE);
187                            }
188                    }
189            }
190    
191    }