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}