001/*
002 *  Copyright 2018 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.odfsync.cdmfr.actions;
017
018import java.util.Collections;
019import java.util.HashMap;
020import java.util.HashSet;
021import java.util.Map;
022import java.util.Set;
023
024import org.apache.avalon.framework.parameters.Parameters;
025import org.apache.avalon.framework.service.ServiceException;
026import org.apache.avalon.framework.service.ServiceManager;
027import org.apache.cocoon.acting.ServiceableAction;
028import org.apache.cocoon.environment.ObjectModelHelper;
029import org.apache.cocoon.environment.Redirector;
030import org.apache.cocoon.environment.Request;
031import org.apache.cocoon.environment.SourceResolver;
032import org.apache.commons.lang3.StringUtils;
033
034import org.ametys.cms.repository.Content;
035import org.ametys.cms.repository.DefaultContent;
036import org.ametys.odf.ODFHelper;
037import org.ametys.odf.ProgramItem;
038import org.ametys.odf.catalog.CatalogsManager;
039import org.ametys.odf.helper.DeleteODFContentHelper;
040import org.ametys.odf.helper.DeleteODFContentHelper.DeleteMode;
041import org.ametys.odf.program.ProgramFactory;
042import org.ametys.plugins.contentio.synchronize.SynchronizableContentsCollection;
043import org.ametys.plugins.contentio.synchronize.SynchronizableContentsCollectionHelper;
044import org.ametys.plugins.odfsync.cdmfr.RemoteCDMFrSynchronizableContentsCollection;
045import org.ametys.plugins.repository.AmetysObjectResolver;
046
047/**
048 * Delete a program when program was removed on remote server
049 */
050public class DeleteRemoteProgramAction extends ServiceableAction
051{
052    /** The Ametys Object resolver */
053    protected AmetysObjectResolver _resolver;
054    
055    /** The delete ODF content helper */
056    protected DeleteODFContentHelper _deleteODFContentHelper;
057    
058    /** The odf helper */
059    protected ODFHelper _odfHelper;
060
061    /** The SCC helper */
062    protected SynchronizableContentsCollectionHelper _sccHelper;
063    
064    /** The catalogs manager */
065    protected CatalogsManager _catalogsManager;
066    
067    @Override
068    public void service(ServiceManager sManager) throws ServiceException
069    {
070        super.service(sManager);
071        _sccHelper = (SynchronizableContentsCollectionHelper) sManager.lookup(SynchronizableContentsCollectionHelper.ROLE);
072        _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE);
073        _deleteODFContentHelper = (DeleteODFContentHelper) manager.lookup(DeleteODFContentHelper.ROLE);
074        _odfHelper = (ODFHelper) manager.lookup(ODFHelper.ROLE);
075        _catalogsManager = (CatalogsManager) manager.lookup(CatalogsManager.ROLE);
076    }
077    
078    @Override
079    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
080    {
081        Map<String, Object> results = new HashMap<>();
082        
083        Request request = ObjectModelHelper.getRequest(objectModel);
084
085        Set<String> errors = new HashSet<>();
086        
087        SynchronizableContentsCollection scc = _sccHelper.getSCCFromModelId(UploadCDMFrAction.REMOTE_CDMFR_SCC_MODEL_ID);
088        if (scc == null)
089        {
090            errors.add("Can't find synchronizable contents collections for the remote CDMFr import with model id " + UploadCDMFrAction.REMOTE_CDMFR_SCC_MODEL_ID);
091        }
092        else
093        {
094            String code = _getParameterValue(request, ProgramItem.CODE, errors);
095            String lang = _getParameterValue(request, DefaultContent.METADATA_LANGUAGE, errors);
096            
097            if (errors.isEmpty())
098            {
099                // Get the catalog from the SCC if is forced, from the remote content and test it, or use default catalog
100                String catalog = _getCatalog(scc, request);
101                Content content = _odfHelper.getODFContent(ProgramFactory.PROGRAM_CONTENT_TYPE, code, catalog, lang);
102                
103                // Delete contents bypassing the rights check
104                _deleteODFContentHelper.deleteContents(Collections.singletonList(content.getId()), DeleteMode.FULL.name(), true);
105            }
106        }
107
108        if (!errors.isEmpty())
109        {
110            results.put("errors", errors);
111        }
112        
113        return results;
114    }
115    
116    private String _getParameterValue(Request request, String parameterName, Set<String> errors)
117    {
118        String result = request.getParameter(parameterName);
119        if (StringUtils.isEmpty(result))
120        {
121            errors.add("Metadata '" + parameterName + "' is mandatory.");
122        }
123        
124        return result;
125    }
126    
127    private String _getCatalog(SynchronizableContentsCollection scc, Request request)
128    {
129        String forcedCatalog = (String) scc.getParameterValues().get(RemoteCDMFrSynchronizableContentsCollection.PARAM_CDMFR_CATALOG);
130        if (StringUtils.isNotEmpty(forcedCatalog))
131        {
132            return forcedCatalog;
133        }
134
135        String remoteCatalog = request.getParameter(ProgramItem.CATALOG);
136        if (_catalogsManager.getCatalog(remoteCatalog) == null)
137        {
138            // Catalog is empty or do not exist, use the default catalog
139            return _catalogsManager.getDefaultCatalogName();
140        }
141        
142        return remoteCatalog;
143    }
144}