001/*
002 *  Copyright 2013 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.cms.tag.jcr;
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.CMSTag.TagVisibility;
029import org.ametys.cms.tag.Tag;
030import org.ametys.cms.tag.TagProvider;
031import org.ametys.cms.tag.TagProviderExtensionPoint;
032import org.ametys.cms.tag.TagTargetTypeExtensionPoint;
033import org.ametys.cms.tag.TagsDAO;
034import org.ametys.core.right.RightManager;
035import org.ametys.core.right.RightManager.RightResult;
036import org.ametys.core.user.UserIdentity;
037import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
038import org.ametys.plugins.repository.UnknownAmetysObjectException;
039
040/**
041 * Component for operations on JCR tags
042 */
043public class JCRTagsDAO extends AbstractJCRTagsDAO
044{
045    /** The Avalon role */
046    public static final String ROLE = JCRTagsDAO.class.getName();
047    
048    /** The attribute name for the visibility */
049    public static final String VISIBILITY_ATTRIBUTE_NAME = "visibility";
050    
051    /** The attribute name for the target type */
052    public static final String TARGET_TYPE_ATTRIBUTE_NAME = "target";
053    
054    /** The tag provider extension point */
055    protected TagProviderExtensionPoint _tagProviderExtPt;
056    /** The rights manager */
057    protected RightManager _rightManager;
058    /** Target types */
059    protected TagTargetTypeExtensionPoint _targetTypeEP;
060    /** Tags DAO */
061    protected TagsDAO _tagsDAO;
062    
063    @Override
064    public void service(ServiceManager serviceManager) throws ServiceException
065    {
066        super.service(serviceManager);
067        _tagProviderExtPt = (TagProviderExtensionPoint) serviceManager.lookup(TagProviderExtensionPoint.ROLE);
068        _rightManager = (RightManager) serviceManager.lookup(RightManager.ROLE);
069        _targetTypeEP = (TagTargetTypeExtensionPoint) serviceManager.lookup(TagTargetTypeExtensionPoint.ROLE);
070        _tagsDAO = (TagsDAO) serviceManager.lookup(TagsDAO.ROLE);
071    }
072    
073    @Override
074    public ModifiableTraversableAmetysObject _getTagRootObject (String tagProviderId, Map<String, Object> contextualParameters) throws RepositoryException
075    {
076        CMSJCRTagProvider provider = (CMSJCRTagProvider) _tagProviderExtPt.getExtension(tagProviderId);
077        return provider.getRootNode(contextualParameters);
078    }
079    
080    @Override
081    protected Tag _getTagFromName(String name, Map<String, Object> contextualParameters)
082    {
083        return _tagProviderExtPt.getTag(name, contextualParameters);
084    }
085    
086    @Override
087    protected void _checkUserRight () throws IllegalStateException
088    {
089        String rightId = "CMS_Rights_Tags_HandleTag";
090        String context = "/cms";
091        
092        UserIdentity user = _currentUserProvider.getUser();
093        if (_rightManager.hasRight(user, rightId, context) != RightResult.RIGHT_ALLOW)
094        {
095            getLogger().error("User '" + user + "' tried to access a privileged feature without convenient right. Should have right '" + rightId + "' on context '" + context + "'");
096            throw new IllegalStateException("You have no right to access this feature.");
097        }
098    }
099    
100    @Override
101    protected JCRTag _createJCRTag(String parentId, String name, String title, String description, Map<String, Object> otherParameters, Map<String, Object> contextualParameters) throws RepositoryException
102    {
103        ModifiableTraversableAmetysObject parent = null;
104        if (StringUtils.isEmpty(parentId))
105        {
106            parent = _getTagRootObject(CMSJCRTagProvider.class.toString(), contextualParameters);
107        }
108        else
109        {
110            parent = _resolver.resolveById(parentId);
111        }
112        
113        String visibility = (String) otherParameters.get(VISIBILITY_ATTRIBUTE_NAME);
114        String targetType = (String) otherParameters.get(TARGET_TYPE_ATTRIBUTE_NAME);
115        
116        CMSJCRTag jcrTag = parent.createChild(name, CMSTagFactory.TAG_NODETYPE);
117        jcrTag.setTitle(title);
118        jcrTag.setDescription(description);
119        jcrTag.setVisibility(TagVisibility.valueOf(visibility));
120        jcrTag.setTargetType(_targetTypeEP.getTagTargetType(targetType));
121        
122        parent.saveChanges();
123        
124        return jcrTag;
125    }
126    
127    @Override
128    protected JCRTag _updateJCRTag(String tagId, String title, String description, Map<String, Object> otherParameters) throws UnknownAmetysObjectException
129    {
130        String visibility = (String) otherParameters.get(VISIBILITY_ATTRIBUTE_NAME);
131        String targetType = (String) otherParameters.get(TARGET_TYPE_ATTRIBUTE_NAME);
132        
133        CMSJCRTag jcrTag = _resolver.resolveById(tagId);
134        jcrTag.setTitle(title);
135        jcrTag.setDescription(description);
136        jcrTag.setVisibility(TagVisibility.valueOf(visibility));
137        jcrTag.setTargetType(_targetTypeEP.getTagTargetType(targetType));
138        
139        jcrTag.saveChanges();
140        
141        return jcrTag;
142    }
143    
144    @Override
145    protected Set<TagProvider<? extends Tag>> _getTagProviders ()
146    {
147        Set<TagProvider<? extends Tag>> providers = new HashSet<>();
148        
149        Set<String> ids = _tagProviderExtPt.getExtensionsIds();
150        for (String id : ids)
151        {
152            TagProvider<? extends Tag> provider = _tagProviderExtPt.getExtension(id);
153            providers.add(provider);
154        }
155        
156        return providers;
157    }
158}