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.ArrayList;
019import java.util.List;
020
021import org.apache.commons.lang.StringUtils;
022
023import org.ametys.cms.contenttype.ContentTypeExtensionPoint;
024import org.ametys.cms.tag.TagProviderExtensionPoint;
025import org.ametys.plugins.repository.AmetysObjectResolver;
026import org.ametys.plugins.repository.query.expression.Expression;
027import org.ametys.plugins.repository.query.expression.Expression.Operator;
028import org.ametys.plugins.repository.query.expression.OrExpression;
029import org.ametys.plugins.repository.query.expression.StringExpression;
030import org.ametys.web.filter.DefaultWebContentFilter;
031import org.ametys.web.repository.content.jcr.DefaultWebContent;
032import org.ametys.web.repository.site.Site;
033import org.ametys.web.repository.site.SiteManager;
034
035/**
036 * Post filter: able to search posts in blog sites.
037 */
038public class PostFilter extends DefaultWebContentFilter
039{
040    
041    /** The blog site type. */
042    public static final String BLOG_SITE_TYPE = "org.ametys.plugins.blog.sitetype.Blog";
043    
044    /** The site name or blank to search in all sites. */
045    protected String _site;
046    
047    /**
048     * Create a new filter.
049     */
050    public PostFilter()
051    {
052        super();
053    }
054    
055    /**
056     * Create a new filter.
057     * @param id The filter unique identifier
058     * @param resolver The ametys object resolver
059     * @param contentTypeExtensionPoint The extension point for content types
060     * @param siteManager the site manager.
061     * @param tagProviderEP The tag provider extension point
062     */
063    public PostFilter(String id, AmetysObjectResolver resolver, ContentTypeExtensionPoint contentTypeExtensionPoint, SiteManager siteManager, TagProviderExtensionPoint tagProviderEP)
064    {
065        super(id, resolver, contentTypeExtensionPoint, siteManager, tagProviderEP);
066    }
067    
068    /**
069     * Get the site name.
070     * @return the site name or blank to search in all sites.
071     */
072    public String getSite()
073    {
074        return this._site;
075    }
076    
077    /**
078     * Set the site name.
079     * @param site the site name or blank to search in all sites.
080     */
081    public void setSite(String site)
082    {
083        this._site = site;
084    }
085    
086    @Override
087    public FilterSearchContext createSeachContext()
088    {
089        return new PostFilterSearchContext(_siteManager);
090    }
091    
092    /**
093     * FilterSearchContext specific to the post filter.
094     */
095    public class PostFilterSearchContext extends DefaultFilterSearchContext
096    {
097        
098        /**
099         * Build a PostFilterSearchContext.
100         * @param siteManager the site manager.
101         */
102        public PostFilterSearchContext(SiteManager siteManager)
103        {
104            super(siteManager);
105        }
106        
107        @Override
108        protected Expression getContextExpression(String siteName)
109        {
110            Expression expr = null;
111            
112            if (StringUtils.isBlank(_site))
113            {
114                // Get one expression for all the blog sites.
115                List<Expression> siteExpressions = new ArrayList<>();
116                
117                for (Site site : _siteManager.getSites())
118                {
119                    if (site.getType().equals(BLOG_SITE_TYPE))
120                    {
121                        siteExpressions.add(new StringExpression(DefaultWebContent.METADATA_SITE, Operator.EQ, site.getName()));
122                    }
123                }
124                
125                expr = new OrExpression(siteExpressions.toArray(new Expression[siteExpressions.size()]));
126            }
127            else
128            {
129                expr = new StringExpression(DefaultWebContent.METADATA_SITE, Operator.EQ, _site);
130            }
131            
132            return expr;
133        }
134    }
135    
136}