001/*
002 *  Copyright 2011 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.blog.posts;
017
018import java.util.Date;
019import java.util.Map;
020
021import org.apache.avalon.framework.parameters.ParameterException;
022import org.apache.avalon.framework.parameters.Parameters;
023import org.apache.commons.lang.BooleanUtils;
024import org.apache.commons.lang3.StringUtils;
025
026import org.ametys.cms.contenttype.ContentTypeExtensionPoint;
027import org.ametys.cms.filter.ContentFilter;
028import org.ametys.cms.tag.TagProviderExtensionPoint;
029import org.ametys.plugins.repository.AmetysObjectResolver;
030import org.ametys.plugins.repository.data.holder.ModelAwareDataHolder;
031import org.ametys.plugins.repository.query.expression.DateExpression;
032import org.ametys.plugins.repository.query.expression.Expression;
033import org.ametys.plugins.repository.query.expression.Expression.Operator;
034import org.ametys.web.filter.WebContentFilter;
035import org.ametys.web.repository.page.ZoneItem;
036import org.ametys.web.repository.page.actions.SetFilterInRequestAttributesAction;
037import org.ametys.web.repository.site.Site;
038import org.ametys.web.repository.site.SiteManager;
039
040/**
041 * Set a PostFilter in request attributes.
042 */
043public class SetPostFilterInRequestAttributesAction extends SetFilterInRequestAttributesAction
044{
045    private static final String __POST_METADATA_DATE = "date";
046    
047    @Override
048    protected WebContentFilter _getFilterFromParams(Parameters parameters, ZoneItem zoneItem, Map<String, Object> parentContextAttributes)
049    {
050        WebContentFilter filter = super._getFilterFromParams(parameters, zoneItem, parentContextAttributes);
051        
052        if (filter instanceof PostFilter)
053        {
054            PostFilter postFilter = (PostFilter) filter;
055            
056            String siteName = parameters.getParameter("site", "");
057            postFilter.setSite(siteName);
058            
059            boolean displayFuturePosts = _getDisplayFuturePosts(siteName);
060            if (!displayFuturePosts)
061            {
062                postFilter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
063            }
064        }
065        
066        return filter;
067    }
068    
069    @Override
070    protected WebContentFilter _getFilterFromZoneItem(ZoneItem zoneItem) throws ParameterException
071    {
072        WebContentFilter filter = super._getFilterFromZoneItem(zoneItem);
073        
074        if (filter instanceof PostFilter)
075        {
076            PostFilter postFilter = (PostFilter) filter;
077            
078            ModelAwareDataHolder metadata = zoneItem.getServiceParameters();
079            
080            String siteName = metadata.getValue("site", false, "");
081            postFilter.setSite(siteName);
082            
083            boolean displayFuturePosts = _getDisplayFuturePosts(siteName);
084            if (!displayFuturePosts)
085            {
086                postFilter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
087            }
088        }
089        
090        return filter;
091    }
092    
093    @Override
094    protected boolean _isValid(ZoneItem zoneItem)
095    {
096        boolean valid = false;
097        
098        if (zoneItem.getType().equals(ZoneItem.ZoneType.SERVICE))
099        {
100            String serviceId = zoneItem.getServiceId();
101            
102            valid = "org.ametys.web.service.FilteredContentsService".equals(serviceId)
103                 || "org.ametys.plugins.blog.service.FilteredPostsService".equals(serviceId);
104        }
105        
106        return valid;
107    }
108    
109    @Override
110    protected WebContentFilter _createFilter(String id, AmetysObjectResolver resolver, ContentTypeExtensionPoint contentTypeExtensionPoint, SiteManager siteManager, TagProviderExtensionPoint tagProviderEP)
111    {
112        return new PostFilter(id, resolver, contentTypeExtensionPoint, siteManager, tagProviderEP);
113    }
114    
115    @Override
116    protected ContentFilter _getStaticFilterById(String filterId, String siteName)
117    {
118        ContentFilter filter = super._getStaticFilterById(filterId, siteName);
119        
120        boolean displayFuturePosts = _getDisplayFuturePosts(siteName);
121        if (displayFuturePosts)
122        {
123            filter.setAdditionalFilterExpression(null);
124        }
125        else
126        {
127            filter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
128        }
129        
130        return filter;
131    }
132    
133    /**
134     * Get the expression to exclude future posts
135     * @return the expression to exclude future posts
136     */
137    protected Expression _getNoFuturePostsExpression()
138    {
139        return new DateExpression(__POST_METADATA_DATE, Operator.LE, new Date());
140    }
141    
142    private boolean _getDisplayFuturePosts(String siteName)
143    {
144        boolean displayFuturePosts = true;
145        if (StringUtils.isNotBlank(siteName))
146        {
147            Site site = _siteManager.getSite(siteName);
148            displayFuturePosts = BooleanUtils.isTrue(site.getValue("display-future-posts"));
149        }
150        
151        return displayFuturePosts;
152    }
153}