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}