001/*
002 *  Copyright 2024 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.extraction.rights;
017
018import java.util.Map;
019
020import org.apache.commons.lang3.StringUtils;
021import org.apache.commons.lang3.Strings;
022
023import org.ametys.core.right.RightsException;
024import org.ametys.plugins.core.impl.right.StringHierarchicalAccessController;
025import org.ametys.runtime.i18n.I18nizableText;
026import org.ametys.runtime.i18n.I18nizableTextParameter;
027
028/**
029 * AccessController handling access to extraction
030 */
031public class ExtractionAccessController extends StringHierarchicalAccessController
032{
033    /** the extraction context category */
034    public static final I18nizableText EXTRACTION_CONTEXT_CATEGORY = new I18nizableText("plugin.extraction", "RIBBON_TABS_TAB_EXTRACTION_LABEL");
035    /** The prefix for rights on the root of a collection */
036    public static final String ROOT_CONTEXT = "/extraction-dir";
037    /** The prefix for rights on the root of extractions results */
038    public static final String ROOT_RESULTS_CONTEXT = "/extraction-results-dir";
039
040    @Override
041    protected I18nizableText getObjectLabelForExplanation(Object object)
042    {
043        if (object instanceof String str && Strings.CS.startsWith(str, ExtractionAccessController.ROOT_CONTEXT))
044        {
045            if (Strings.CS.equals(str, ExtractionAccessController.ROOT_CONTEXT))
046            {
047                return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_ROOT_EXPLANATION_LABEL");
048            }
049            else
050            {
051                Map<String, I18nizableTextParameter> params = Map.of("contextLabel", getObjectLabel(object));
052                String target = StringUtils.substringAfterLast(str, SEPARATOR);
053                if (Strings.CS.endsWith(target, ".xml"))
054                {
055                    return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_FILE_EXPLANATION_LABEL", params);
056                }
057                else
058                {
059                    return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_FOLDER_EXPLANATION_LABEL", params);
060                }
061            }
062        }
063        else if (object instanceof String str && Strings.CS.startsWith(str, ExtractionAccessController.ROOT_RESULTS_CONTEXT))
064        {
065            if (Strings.CS.equals(str, ExtractionAccessController.ROOT_RESULTS_CONTEXT))
066            {
067                return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_RESULT_ROOT_EXPLANATION_LABEL");
068            }
069            else
070            {
071                Map<String, I18nizableTextParameter> params = Map.of("contextLabel", getObjectLabel(object));
072                String target = StringUtils.substringAfterLast(str, SEPARATOR);
073                if (Strings.CS.endsWith(target, ".xml") || Strings.CS.endsWith(target, ".pdf"))
074                {
075                    return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_RESULT_FILE_EXPLANATION_LABEL", params);
076                }
077                else
078                {
079                    return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_RESULT_FOLDER_EXPLANATION_LABEL", params);
080                }
081            }
082        }
083        return super.getObjectLabel(object);
084    }
085    
086    @Override
087    public I18nizableText getObjectLabel(Object object)
088    {
089        if (object instanceof String str && Strings.CS.startsWith(str, ExtractionAccessController.ROOT_CONTEXT))
090        {
091            if (Strings.CS.equals(str, ExtractionAccessController.ROOT_CONTEXT))
092            {
093                return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_ROOT_LABEL");
094            }
095            else
096            {
097                String target = StringUtils.substringAfter(str, ROOT_CONTEXT);
098                target = Strings.CS.replace(target.substring(1), "/", " > ");
099                return new I18nizableText(target);
100            }
101        }
102        else if (object instanceof String str && Strings.CS.startsWith(str, ExtractionAccessController.ROOT_RESULTS_CONTEXT))
103        {
104            if (Strings.CS.equals(str, ExtractionAccessController.ROOT_RESULTS_CONTEXT))
105            {                                                    
106                return new I18nizableText("plugin.extraction", "PLUGINS_EXTRACTION_ACCESS_CONTROLLER_RESULT_ROOT_LABEL");
107            }
108            else
109            {
110                String target = StringUtils.substringAfter(str, ROOT_CONTEXT);
111                target = Strings.CS.replace(target.substring(1), "/", " > ");
112                return new I18nizableText(target);
113            }
114        }
115            
116        throw new RightsException("Unsupported object " + object.toString());
117    }
118    
119    @Override
120    public I18nizableText getObjectCategory(Object object)
121    {
122        return EXTRACTION_CONTEXT_CATEGORY;
123    }
124    
125    public int getObjectPriority(Object object)
126    {
127        if (object instanceof String str && Strings.CS.equals(str, ExtractionAccessController.ROOT_CONTEXT))
128        {
129            return 10;
130        }
131        return super.getObjectPriority(object);
132    }
133}