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.contentio.synchronize.clientsideelement;
017
018import java.util.ArrayList;
019import java.util.List;
020import java.util.Map;
021
022import org.apache.avalon.framework.service.ServiceException;
023import org.apache.avalon.framework.service.ServiceManager;
024
025import org.ametys.cms.clientsideelement.SmartContentClientSideElement;
026import org.ametys.cms.repository.ModifiableDefaultContent;
027import org.ametys.core.ui.Callable;
028import org.ametys.plugins.contentio.synchronize.SynchronizableContentsCollection;
029import org.ametys.plugins.contentio.synchronize.SynchronizableContentsCollectionHelper;
030import org.ametys.runtime.authentication.AccessDeniedException;
031
032/**
033 * Smart content client side element for SCC, the SCC model ID configured in plugin.xml is used.
034 */
035public class SCCSmartContentClientSideElement extends SmartContentClientSideElement
036{
037    /** SCC helper */
038    protected SynchronizableContentsCollectionHelper _sccHelper;
039    
040    @Override
041    public void service(ServiceManager smanager) throws ServiceException
042    {
043        super.service(smanager);
044        _sccHelper = (SynchronizableContentsCollectionHelper) smanager.lookup(SynchronizableContentsCollectionHelper.ROLE);
045    }
046    
047    @Override
048    public List<Script> getScripts(boolean ignoreRights, Map<String, Object> contextParameters)
049    {
050        List<Script> clonedScripts = new ArrayList<>();
051        
052        List<Script> scripts = super.getScripts(ignoreRights, contextParameters);
053        
054        for (Script script : scripts)
055        {
056            if (script.getParameters().containsKey("sccModelId"))
057            {
058                String sccModelId = (String) script.getParameters().get("sccModelId");
059                SynchronizableContentsCollection collection = _sccHelper.getSCCFromModelId(sccModelId);
060                if (collection != null)
061                {
062                    clonedScripts.add(_getScriptFromCollection(script, collection));
063                }
064            }
065        }
066        
067        return clonedScripts;
068    }
069
070    /**
071     * Get a cloned script by updating configuration with collection values.
072     * @param script The script to clone
073     * @param collection The collection
074     * @return A cloned script
075     */
076    protected Script _getScriptFromCollection(Script script, SynchronizableContentsCollection collection)
077    {
078        Script clonedScript = new Script(script);
079        clonedScript.getParameters().put("collectionId", collection.getId());
080        return clonedScript;
081    }
082    
083    /**
084     * Synchronize the content on the given collection with the given synchronization code.
085     * @param collectionId Collection ID
086     * @param contentId Content ID
087     * @param syncCode Synchronization code
088     * @return true if an error occurred
089     */
090    @Callable(rights = Callable.CHECKED_BY_IMPLEMENTATION)
091    public boolean synchronizeContent(String collectionId, String contentId, String syncCode)
092    {
093        ModifiableDefaultContent content = _resolver.resolveById(contentId);
094        if (!_hasRight(content))
095        {
096            throw new AccessDeniedException("User '" + _currentUserProvider.getUser() + "' tried to synchronize content '" + contentId + "' without sufficient right");
097        }
098        
099        return _sccHelper.synchronizeContent(collectionId, contentId, syncCode);
100    }
101    
102    /**
103     * Get the value of the synchronization field.
104     * @param collectionId Collection ID
105     * @param contentId Content ID
106     * @return The value of the synchronization field
107     */
108    @Callable(rights = Callable.CHECKED_BY_IMPLEMENTATION)
109    public String getSyncCode(String contentId, String collectionId)
110    {
111        ModifiableDefaultContent content = _resolver.resolveById(contentId);
112        if (!_hasRight(content))
113        {
114            throw new AccessDeniedException("User '" + _currentUserProvider.getUser() + "' tried to get synchronization code of content '" + contentId + "' without sufficient right");
115        }
116        
117        return _sccHelper.getSyncCode(contentId, collectionId);
118    }
119}