001/* 002 * Copyright 2020 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.Collection; 019import java.util.HashMap; 020import java.util.Map; 021import java.util.Map.Entry; 022import java.util.stream.Collectors; 023 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.avalon.framework.service.Serviceable; 027import org.apache.commons.lang3.StringUtils; 028 029import org.ametys.cms.tag.AbstractTagProvider; 030import org.ametys.cms.tag.CMSTag; 031import org.ametys.cms.tag.DefaultTag; 032import org.ametys.cms.tag.TagTargetType; 033import org.ametys.cms.tag.TagTargetTypeExtensionPoint; 034 035/** 036 * Class representing categories as CMS tag provider. 037 * This directly use {@link KeywordJCRProvider} and transform the categories in {@link CMSTag} 038 */ 039public class KeywordTagProvider extends AbstractTagProvider<CMSTag> implements Serviceable 040{ 041 /** Target types */ 042 protected TagTargetTypeExtensionPoint _targetTypeEP; 043 044 /** Category tag provider */ 045 protected KeywordProviderExtensionPoint _keywordProviderEP; 046 047 /** The JCR category provider */ 048 protected KeywordJCRProvider _jcrKeywordProvider; 049 050 @Override 051 public void service(ServiceManager smanager) throws ServiceException 052 { 053 _targetTypeEP = (TagTargetTypeExtensionPoint) smanager.lookup(TagTargetTypeExtensionPoint.ROLE); 054 _keywordProviderEP = (KeywordProviderExtensionPoint) smanager.lookup(KeywordProviderExtensionPoint.ROLE); 055 _jcrKeywordProvider = (KeywordJCRProvider) _keywordProviderEP.getExtension(KeywordJCRProvider.class.getName()); 056 } 057 058 public Map<String, CMSTag> getTags(Map<String, Object> contextualParameters) 059 { 060 Map<String, CMSTag> cmsTags = new HashMap<>(); 061 062 Map<String, DefaultTag> keywords = _jcrKeywordProvider.getTags(contextualParameters); 063 064 for (Entry<String, DefaultTag> category : keywords.entrySet()) 065 { 066 KeywordCMSTag keywordTag = _transformToCMSTag(category.getValue(), contextualParameters); 067 cmsTags.put(keywordTag.getId(), _transformToCMSTag(category.getValue(), contextualParameters)); 068 } 069 070 return cmsTags; 071 } 072 073 public CMSTag getTag(String tagName, Map<String, Object> contextualParameters) 074 { 075 String keywordName = tagName; 076 if (keywordName.startsWith(KeywordCMSTag.TAG_PREFIX)) 077 { 078 keywordName = StringUtils.substringAfter(tagName, KeywordCMSTag.TAG_PREFIX); 079 } 080 return _transformToCMSTag(_jcrKeywordProvider.getTag(keywordName, contextualParameters), contextualParameters); 081 } 082 083 public Collection<CMSTag> getTags(String tagName, Map<String, Object> contextualParameters) 084 { 085 String keywordName = tagName; 086 if (keywordName.startsWith(KeywordCMSTag.TAG_PREFIX)) 087 { 088 keywordName = StringUtils.substringAfter(tagName, KeywordCMSTag.TAG_PREFIX); 089 } 090 Collection<DefaultTag> keywords = _jcrKeywordProvider.getTags(keywordName, contextualParameters); 091 092 return keywords.stream() 093 .map(tag -> _transformToCMSTag(tag, contextualParameters)) 094 .collect(Collectors.toList()); 095 } 096 097 public boolean hasTag(String tagName, Map<String, Object> contextualParameters) 098 { 099 String keywordName = tagName; 100 if (keywordName.startsWith(KeywordCMSTag.TAG_PREFIX)) 101 { 102 keywordName = StringUtils.substringAfter(tagName, KeywordCMSTag.TAG_PREFIX); 103 } 104 return _jcrKeywordProvider.hasTag(keywordName, contextualParameters); 105 } 106 107 /** 108 * Transform a keyword in a {@link KeywordCMSTag}, forcing visibility to public and target to CONTENT 109 * @param keyword the keyword to transform 110 * @param contextualParameters the contextual parameters 111 * @return a {@link KeywordCMSTag} with the same values 112 */ 113 protected KeywordCMSTag _transformToCMSTag(DefaultTag keyword, Map<String, Object> contextualParameters) 114 { 115 if (keyword != null) 116 { 117 CMSTag parentTag = null; 118 DefaultTag parentKeyword = keyword.getParent(); 119 if (parentKeyword != null) 120 { 121 parentTag = this.getTag(parentKeyword.getName(), contextualParameters); 122 } 123 124 TagTargetType targetType = _targetTypeEP.getTagTargetType("CONTENT"); 125 126 return new KeywordCMSTag(keyword, parentTag, targetType); 127 } 128 else 129 { 130 return null; 131 } 132 } 133}