001/*
002 *  Copyright 2017 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.odfweb.observation.solr;
017
018import java.util.Map;
019
020import javax.jcr.Repository;
021
022import org.apache.avalon.framework.service.ServiceException;
023import org.apache.avalon.framework.service.ServiceManager;
024import org.apache.cocoon.components.ContextHelper;
025import org.apache.cocoon.environment.Request;
026
027import org.ametys.cms.ObservationConstants;
028import org.ametys.core.observation.Event;
029import org.ametys.core.observation.Observer;
030import org.ametys.odf.course.Course;
031import org.ametys.odf.program.Program;
032import org.ametys.odf.program.SubProgram;
033import org.ametys.plugins.odfweb.repository.OdfPageHandler;
034import org.ametys.plugins.repository.RepositoryConstants;
035import org.ametys.plugins.repository.provider.AbstractRepository;
036import org.ametys.plugins.repository.provider.RequestAttributeWorkspaceSelector;
037import org.ametys.web.WebConstants;
038import org.ametys.web.repository.page.Page;
039import org.ametys.web.site.SiteConfigurationExtensionPoint;
040
041/**
042 * {@link Observer} unindexing pages corresponding to {@link Program}s that are not displayed by the site anymore
043 * given current ODF restrictions.
044 */
045public class SolrContentValidatedPart1Observer extends AbstractSolrODFObserver
046{
047    /** The site configuration extension point. */
048    protected SiteConfigurationExtensionPoint _siteConf;
049    /** The JCR repository */
050    protected Repository _repository;
051    /** The ODF page handler */
052    protected OdfPageHandler _odfPageHandler;
053    
054    @Override
055    public void service(ServiceManager manager) throws ServiceException
056    {
057        super.service(manager);
058        _siteConf = (SiteConfigurationExtensionPoint) manager.lookup(SiteConfigurationExtensionPoint.ROLE);
059        _repository = (Repository) manager.lookup(AbstractRepository.ROLE);
060        _odfPageHandler = (OdfPageHandler) manager.lookup(OdfPageHandler.ROLE);
061    }
062    
063    @Override
064    public boolean supports(Event event)
065    {
066        return event.getId().equals(ObservationConstants.EVENT_CONTENT_VALIDATED);
067    }
068    
069    @Override
070    public int getPriority(Event event)
071    {
072        // Before live synchronization.
073        return MAX_PRIORITY + 500;
074    }
075    
076    @Override
077    protected String _workspaceToUse()
078    {
079        return WebConstants.LIVE_WORKSPACE;
080    }
081    
082    @Override
083    protected void _updateIndex(Event event, Map<String, Object> transientVars, Page odfRootPage, Program program, SubProgram subProgram, Course course) throws Exception
084    {
085        Page liveOdfRootPage = _resolver.resolveById(odfRootPage.getId());
086        
087        // Test the program in its default version (with the new orgunit reference,
088        // as we are before live synchronization) but use the OrgUnit structure
089        // from the live workspace (forced above), as we want the structure
090        // which is present in Solr indexes.
091        
092        Request request = ContextHelper.getRequest(_context);
093        
094        // Retrieve current workspace
095        String currentWsp = RequestAttributeWorkspaceSelector.getForcedWorkspace(request);
096        
097        boolean isValid;
098        try
099        {
100            // is part of restrictions in default workspace ?
101            RequestAttributeWorkspaceSelector.setForcedWorkspace(request, RepositoryConstants.DEFAULT_WORKSPACE);
102            isValid = _odfPageHandler.isValidRestriction(liveOdfRootPage, program);
103        }
104        finally
105        {
106            // Restore context
107            RequestAttributeWorkspaceSelector.setForcedWorkspace(request, currentWsp);
108        }
109        
110        String programId = program.getId();
111        if (isValid || !_resolver.hasAmetysObjectForId(programId))
112        {
113            return;
114        }
115        
116        // Retrieve program in the live workspace
117        Program liveProgram = _resolver.resolveById(programId);
118        
119        Page liveAbstractProgramPage = null;
120        if (subProgram != null)
121        {
122            // Retrieve subprogram in the live workspace
123            SubProgram liveSubProgram = _resolver.resolveById(subProgram.getId());
124            // Pages of subprogram
125            liveAbstractProgramPage = _odfPageResolver.getSubProgramPage(liveOdfRootPage, liveSubProgram, liveProgram);
126        }
127        else // program is the concerned content by the event
128        {
129            liveAbstractProgramPage = _odfPageResolver.getProgramPage(liveOdfRootPage, liveProgram);
130        }
131        
132        // If the page exists in the live whereas the program is outside the restrictions, unindex it.
133        // (the program won't be displayed in this site anymore after live synchronization).
134        if (liveAbstractProgramPage != null)
135        {
136            String abstractProgramPageId = liveAbstractProgramPage.getId();
137            getLogger().info("Removing Solr page document with id: {}", abstractProgramPageId);
138            
139            // Unindex recursively
140            _solrPageIndexer.unindexPage(abstractProgramPageId, WebConstants.LIVE_WORKSPACE, true, true, false);
141        }
142    }
143}