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.categories;
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;
037
038/**
039 * Component for operations on JCR categories
040 */
041public class CategoryJCRDAO extends AbstractJCRTagsDAO
042{
043    /** The Avalon role */
044    public static final String ROLE = CategoryJCRDAO.class.getName();
045    
046    /** The attribute name for the color */
047    public static final String COLOR_ATTRIBUTE_NAME = "color";
048    
049    /** The tag provider extension point */
050    protected CategoryProviderExtensionPoint _tagProviderExtPt;
051    
052    /** The rights manager */
053    protected RightManager _rightManager;
054    
055    @Override
056    public void service(ServiceManager serviceManager) throws ServiceException
057    {
058        super.service(serviceManager);
059        _tagProviderExtPt = (CategoryProviderExtensionPoint) serviceManager.lookup(CategoryProviderExtensionPoint.ROLE);
060        _rightManager = (RightManager) serviceManager.lookup(RightManager.ROLE);
061    }
062    
063    @Override
064    public ModifiableTraversableAmetysObject _getTagRootObject (String tagProviderId, Map<String, Object> contextualParameters) throws RepositoryException
065    {
066        CategoryJCRProvider provider = (CategoryJCRProvider) _tagProviderExtPt.getExtension(tagProviderId);
067        return provider.getRootNode(contextualParameters);
068    }
069    
070    @Override
071    protected void _checkUserRight() throws IllegalStateException
072    {
073        String rightId = "Workspace_Rights_Categories_HandleCategory";
074        String context = "/admin";
075        
076        UserIdentity user = _currentUserProvider.getUser();
077        if (_rightManager.hasRight(user, rightId, context) != RightResult.RIGHT_ALLOW)
078        {
079            getLogger().error("User '" + user + "' tried to access a privileged feature without convenient right. Should have right '" + rightId + "' on context '" + context + "'");
080            throw new IllegalStateException("You have no right to access this feature.");
081        }
082    }
083
084    @Override
085    protected Tag _getTagFromName(String name, Map<String, Object> contextualParameters)
086    {
087        return _tagProviderExtPt.getTag(name, contextualParameters);
088    }
089    
090    @Override
091    protected JCRTag _createJCRTag(String parentId, String name, String title, String description, Map<String, Object> otherParameters, Map<String, Object> contextualParameters) throws RepositoryException
092    {
093        ModifiableTraversableAmetysObject parent = null;
094        if (StringUtils.isEmpty(parentId))
095        {
096            parent = _getTagRootObject(CategoryJCRProvider.class.getName(), contextualParameters);
097        }
098        else
099        {
100            parent = _resolver.resolveById(parentId);
101        }
102        
103        
104        CategoryJCR jcrCategory = parent.createChild(name, CategoryFactory.TAG_NODETYPE);
105        jcrCategory.setTitle(title);
106        jcrCategory.setDescription(description);
107
108        String color = (String) otherParameters.get(COLOR_ATTRIBUTE_NAME);
109        if (StringUtils.isNotBlank(color))
110        {
111            jcrCategory.setColor(color);
112        }
113        
114        parent.saveChanges();
115        
116        return jcrCategory;
117    }
118    
119    @Override
120    protected JCRTag _updateJCRTag(String tagId, String title, String description, Map<String, Object> otherParameters) throws UnknownAmetysObjectException
121    {
122        String color = (String) otherParameters.get(COLOR_ATTRIBUTE_NAME);
123        
124        CategoryJCR jcrCategory = _resolver.resolveById(tagId);
125        jcrCategory.setTitle(title);
126        jcrCategory.setDescription(description);
127        
128        if (StringUtils.isNotBlank(color))
129        {
130            jcrCategory.setColor(color);
131        }
132        else
133        {
134            jcrCategory.setColor(StringUtils.EMPTY);
135        }
136        
137        jcrCategory.saveChanges();
138        
139        return jcrCategory;
140    }
141
142    @Override
143    protected Set<TagProvider< ? extends Tag>> _getTagProviders()
144    {
145        Set<TagProvider<? extends Tag>> providers = new HashSet<>();
146        
147        Set<String> ids = _tagProviderExtPt.getExtensionsIds();
148        for (String id : ids)
149        {
150            TagProvider<? extends Tag> provider = _tagProviderExtPt.getExtension(id);
151            providers.add(provider);
152        }
153        
154        return providers;
155    }
156}