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.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025import org.apache.commons.lang.BooleanUtils;
026
027import org.ametys.cms.contenttype.ContentTypeExtensionPoint;
028import org.ametys.cms.filter.ContentFilter;
029import org.ametys.cms.tag.TagProviderExtensionPoint;
030import org.ametys.plugins.repository.AmetysObjectResolver;
031import org.ametys.plugins.repository.metadata.CompositeMetadata;
032import org.ametys.plugins.repository.query.expression.DateExpression;
033import org.ametys.plugins.repository.query.expression.Expression;
034import org.ametys.plugins.repository.query.expression.Expression.Operator;
035import org.ametys.web.filter.WebContentFilter;
036import org.ametys.web.repository.page.ZoneItem;
037import org.ametys.web.repository.page.actions.SetFilterInRequestAttributesAction;
038import org.ametys.web.repository.site.SiteManager;
039import org.ametys.web.site.SiteConfigurationExtensionPoint;
040
041/**
042 * Set a PostFilter in request attributes.
043 */
044public class SetPostFilterInRequestAttributesAction extends SetFilterInRequestAttributesAction
045{
046    private static final String __POST_METADATA_DATE = "date";
047    
048    /** The site configuration extension point */
049    private SiteConfigurationExtensionPoint _siteConf;
050    
051    @Override
052    public void service(ServiceManager smanager) throws ServiceException
053    {
054        super.service(smanager);
055        _siteConf = (SiteConfigurationExtensionPoint) smanager.lookup(SiteConfigurationExtensionPoint.ROLE);
056    }
057    
058    @Override
059    protected WebContentFilter _getFilterFromParams(Parameters parameters, ZoneItem zoneItem, Map<String, Object> parentContextAttributes)
060    {
061        WebContentFilter filter = super._getFilterFromParams(parameters, zoneItem, parentContextAttributes);
062        
063        if (filter instanceof PostFilter)
064        {
065            PostFilter postFilter = (PostFilter) filter;
066            
067            String siteName = parameters.getParameter("site", "");
068            postFilter.setSite(siteName);
069            
070            boolean displayFuturePosts = !siteName.equals("") ? BooleanUtils.isTrue(_siteConf.getValueAsBoolean(siteName, "display-future-posts")) : true;
071            if (!displayFuturePosts)
072            {
073                postFilter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
074            }
075        }
076        
077        return filter;
078    }
079    
080    @Override
081    protected WebContentFilter _getFilterFromZoneItem(ZoneItem zoneItem) throws ParameterException
082    {
083        WebContentFilter filter = super._getFilterFromZoneItem(zoneItem);
084        
085        if (filter instanceof PostFilter)
086        {
087            PostFilter postFilter = (PostFilter) filter;
088            
089            CompositeMetadata metadata = zoneItem.getServiceParameters();
090            
091            String siteName = metadata.getString("site", "");
092            postFilter.setSite(siteName);
093            
094            boolean displayFuturePosts = siteName != null ? BooleanUtils.isTrue(_siteConf.getValueAsBoolean(siteName, "display-future-posts")) : true;
095            if (!displayFuturePosts)
096            {
097                postFilter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
098            }
099        }
100        
101        return filter;
102    }
103    
104    @Override
105    protected boolean _isValid(ZoneItem zoneItem)
106    {
107        boolean valid = false;
108        
109        if (zoneItem.getType().equals(ZoneItem.ZoneType.SERVICE))
110        {
111            String serviceId = zoneItem.getServiceId();
112            
113            valid = "org.ametys.web.service.FilteredContentsService".equals(serviceId)
114                 || "org.ametys.plugins.blog.service.FilteredPostsService".equals(serviceId);
115        }
116        
117        return valid;
118    }
119    
120    @Override
121    protected WebContentFilter _createFilter(String id, AmetysObjectResolver resolver, ContentTypeExtensionPoint contentTypeExtensionPoint, SiteManager siteManager, TagProviderExtensionPoint tagProviderEP)
122    {
123        return new PostFilter(id, resolver, contentTypeExtensionPoint, siteManager, tagProviderEP);
124    }
125    
126    @Override
127    protected ContentFilter _getStaticFilterById(String filterId, String siteName)
128    {
129        ContentFilter filter = super._getStaticFilterById(filterId, siteName);
130        
131        boolean displayFuturePosts = siteName != null ? BooleanUtils.isTrue(_siteConf.getValueAsBoolean(siteName, "display-future-posts")) : true;
132        if (displayFuturePosts)
133        {
134            filter.setAdditionalFilterExpression(null);
135        }
136        else
137        {
138            filter.setAdditionalFilterExpression(_getNoFuturePostsExpression());
139        }
140        
141        return filter;
142    }
143    
144    /**
145     * Get the expression to exclude future posts
146     * @return the expression to exclude future posts
147     */
148    protected Expression _getNoFuturePostsExpression()
149    {
150        return new DateExpression(__POST_METADATA_DATE, Operator.LE, new Date());
151    }
152}