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.keywords;
017
018import java.util.Collection;
019import java.util.Map;
020
021import javax.jcr.RepositoryException;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025import org.apache.avalon.framework.service.Serviceable;
026
027import org.ametys.cms.tag.DefaultTag;
028import org.ametys.cms.tag.jcr.AbstractJCRTagProvider;
029import org.ametys.plugins.repository.AmetysObject;
030import org.ametys.plugins.repository.AmetysObjectResolver;
031import org.ametys.plugins.repository.AmetysRepositoryException;
032import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
033import org.ametys.plugins.repository.TraversableAmetysObject;
034import org.ametys.runtime.i18n.I18nizableText;
035
036/**
037 * Class representing a project jcr keyword provider. <br>
038 */
039public class KeywordJCRProvider extends AbstractJCRTagProvider<DefaultTag> implements Serviceable
040{
041    /** Constant for plugin node name */ 
042    public static final String PROJECT_PLUGIN_NODE_NAME = "workspaces";
043    
044    /** The ametys object resolver */
045    protected AmetysObjectResolver _resolver;
046    
047    /** The projet tag provider extension point */
048    protected KeywordProviderExtensionPoint _projectTagProviderEP;
049    
050    @Override
051    public void service(ServiceManager smanager) throws ServiceException
052    {
053        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
054        _projectTagProviderEP = (KeywordProviderExtensionPoint) smanager.lookup(KeywordProviderExtensionPoint.ROLE);
055    }
056    
057    @Override
058    protected void _fillCache(TraversableAmetysObject parentTagNode, DefaultTag parentTag, Map<String, DefaultTag> cache) throws RepositoryException
059    {
060        for (AmetysObject child : parentTagNode.getChildren())
061        {
062            if (child instanceof KeywordJCR)
063            {
064                KeywordJCR jcrTag = (KeywordJCR) child;
065                DefaultTag tag = new DefaultTag(jcrTag.getId(), jcrTag.getName(), parentTag, new I18nizableText(jcrTag.getTitle()), new I18nizableText(jcrTag.getDescription()));
066                cache.put(child.getName(), tag);
067                
068                if (parentTag != null)
069                {
070                    parentTag.addTag(tag);
071                }
072                
073                _fillCache(jcrTag, tag, cache);
074            }
075        }
076    }
077    
078    @Override
079    public ModifiableTraversableAmetysObject getRootNode(Map<String, Object> contextualParameters) throws RepositoryException
080    {
081        try
082        {
083            ModifiableTraversableAmetysObject pluginsNode = _resolver.resolveByPath("/ametys:plugins");
084            
085            ModifiableTraversableAmetysObject pluginNode = _getOrCreateNode(pluginsNode, PROJECT_PLUGIN_NODE_NAME, "ametys:unstructured");
086            
087            return _getOrCreateNode(pluginNode, _projectTagProviderEP.getTagsNodeName(), _projectTagProviderEP.getTagsNodeType());
088        }
089        catch (AmetysRepositoryException e)
090        {
091            throw new AmetysRepositoryException("Unable to get the JCR tags root node", e);
092        }
093    }
094    
095    @Override
096    public Collection<DefaultTag> getTags(String tagID, Map<String, Object> contextualParameters)
097    {
098        DefaultTag tag = getTag(tagID, contextualParameters);
099        return tag != null ? tag.getTags().values() : null;
100    }
101}