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}