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.workspaces.keywords;
017
018import java.util.HashSet;
019import java.util.Map;
020import java.util.Set;
021
022import javax.jcr.RepositoryException;
023
024import org.apache.avalon.framework.service.ServiceException;
025import org.apache.avalon.framework.service.ServiceManager;
026import org.apache.commons.lang.StringUtils;
027
028import org.ametys.cms.tag.Tag;
029import org.ametys.cms.tag.TagProvider;
030import org.ametys.cms.tag.jcr.AbstractJCRTagsDAO;
031import org.ametys.cms.tag.jcr.JCRTag;
032import org.ametys.core.right.RightManager;
033import org.ametys.core.right.RightManager.RightResult;
034import org.ametys.core.user.UserIdentity;
035import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
036import org.ametys.plugins.repository.UnknownAmetysObjectException;
037import org.ametys.plugins.workspaces.project.ProjectConstants;
038
039/**
040 * Component for operations on JCR categories
041 */
042public class KeywordJCRDAO extends AbstractJCRTagsDAO
043{
044    /** The Avalon role */
045    public static final String ROLE = KeywordJCRDAO.class.getName();
046    
047    /** The tag provider extension point */
048    protected KeywordProviderExtensionPoint _tagProviderExtPt;
049    
050    /** The rights manager */
051    protected RightManager _rightManager;
052    
053    @Override
054    public void service(ServiceManager serviceManager) throws ServiceException
055    {
056        super.service(serviceManager);
057        _tagProviderExtPt = (KeywordProviderExtensionPoint) serviceManager.lookup(KeywordProviderExtensionPoint.ROLE);
058        _rightManager = (RightManager) serviceManager.lookup(RightManager.ROLE);
059    }
060    
061    @Override
062    public ModifiableTraversableAmetysObject _getTagRootObject (String tagProviderId, Map<String, Object> contextualParameters) throws RepositoryException
063    {
064        KeywordJCRProvider provider = (KeywordJCRProvider) _tagProviderExtPt.getExtension(tagProviderId);
065        return provider.getRootNode(contextualParameters);
066    }
067    
068    @Override
069    protected void _checkUserRight() throws IllegalStateException
070    {
071        if (_rightManager.currentUserHasRight(ProjectConstants.RIGHT_PROJECT_HANDLE_PROJECTKEYWORDS, "/admin") != RightResult.RIGHT_ALLOW)
072        {
073            UserIdentity user = _currentUserProvider.getUser();
074            getLogger().error("User '" + user + "' tried to access a privileged feature without convenient right. Should have right '" + ProjectConstants.RIGHT_PROJECT_HANDLE_PROJECTKEYWORDS + "' on context '/admin'");
075            throw new IllegalStateException("You have no right to access this feature.");
076        }
077    }
078
079    @Override
080    protected Tag _getTagFromName(String name, Map<String, Object> contextualParameters)
081    {
082        return _tagProviderExtPt.getTag(name, contextualParameters);
083    }
084    
085    @Override
086    protected JCRTag _createJCRTag(String parentId, String name, String title, String description, Map<String, Object> otherParameters, Map<String, Object> contextualParameters) throws RepositoryException
087    {
088        ModifiableTraversableAmetysObject parent = null;
089        if (StringUtils.isEmpty(parentId))
090        {
091            parent = _getTagRootObject(KeywordJCRProvider.class.getName(), contextualParameters);
092        }
093        else
094        {
095            parent = _resolver.resolveById(parentId);
096        }
097        
098        
099        KeywordJCR jcrCategory = parent.createChild(name, KeywordFactory.TAG_NODETYPE);
100        jcrCategory.setTitle(title);
101        jcrCategory.setDescription(description);
102        
103        parent.saveChanges();
104        
105        return jcrCategory;
106    }
107    
108    @Override
109    protected JCRTag _updateJCRTag(String tagId, String title, String description, Map<String, Object> otherParameters) throws UnknownAmetysObjectException
110    {
111        KeywordJCR jcrCategory = _resolver.resolveById(tagId);
112        jcrCategory.setTitle(title);
113        jcrCategory.setDescription(description);
114        
115        jcrCategory.saveChanges();
116        
117        return jcrCategory;
118    }
119
120    @Override
121    protected Set<TagProvider< ? extends Tag>> _getTagProviders()
122    {
123        Set<TagProvider<? extends Tag>> providers = new HashSet<>();
124        
125        Set<String> ids = _tagProviderExtPt.getExtensionsIds();
126        for (String id : ids)
127        {
128            TagProvider<? extends Tag> provider = _tagProviderExtPt.getExtension(id);
129            providers.add(provider);
130        }
131        
132        return providers;
133    }
134}