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}