001/*
002 *  Copyright 2016 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.web.cache.pageelement;
017
018import java.util.Collection;
019import java.util.Map;
020
021import org.ametys.core.observation.Event;
022import org.ametys.core.right.RightManager;
023import org.ametys.web.repository.content.WebContent;
024import org.ametys.web.repository.page.SitemapElement;
025
026/**
027 * Base class for {@link PageElementCachePolicy} based on event ids and site aware ACL context.<br>
028 * When ACL is updated, the returned value will be REMOVE only if reading access has updated.
029 * Implementations should provide a list of event ids for which the cache should be removed.
030 * Be aware that for all other events, the returned value will be KEEP. 
031 */
032public abstract class AbstractACLPageElementCachePolicy extends AbstractSimplePageElementCachePolicy
033{
034    @Override
035    protected boolean _supports(Event event, String workspace)
036    {
037        boolean supports = super._supports(event, workspace);
038        
039        if (supports && event.getId().equals(org.ametys.core.ObservationConstants.EVENT_ACL_UPDATED))
040        {
041            // When ACL was updated, returns true only if the ACL context is site aware and the reading access has been updated
042            Map<String, Object> args = event.getArguments();
043            Object object = args.get(org.ametys.core.ObservationConstants.ARGS_ACL_CONTEXT);
044            @SuppressWarnings("unchecked")
045            Collection<String> profileIds = (Collection<String>) args.get(org.ametys.core.ObservationConstants.ARGS_ACL_PROFILES);
046            
047            supports = object != null && (object instanceof SitemapElement || object instanceof WebContent) && profileIds.contains(RightManager.READER_PROFILE_ID);
048        }
049        
050        return supports;
051    }
052
053}