001/*
002 *  Copyright 2019 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.core.model;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.component.Component;
024import org.apache.avalon.framework.context.Context;
025import org.apache.avalon.framework.context.ContextException;
026import org.apache.avalon.framework.context.Contextualizable;
027import org.apache.avalon.framework.service.ServiceException;
028import org.apache.avalon.framework.service.ServiceManager;
029import org.apache.avalon.framework.service.Serviceable;
030
031import org.ametys.runtime.model.AbstractModelItem;
032import org.ametys.runtime.model.DefinitionContext;
033import org.ametys.runtime.model.ModelItem;
034import org.ametys.runtime.model.disableconditions.DisableCondition;
035import org.ametys.runtime.model.disableconditions.DisableCondition.OPERATOR;
036import org.ametys.runtime.model.disableconditions.DisableConditions;
037
038/**
039 * Helper for model items
040 */
041public class ModelItemHelper implements Component, Serviceable, Contextualizable
042{
043    /** Avalon ROLE. */
044    public static final String ROLE = ModelItemHelper.class.getName();
045    
046    public void contextualize(Context context) throws ContextException
047    {
048        AbstractModelItem.setContext(context);
049    }
050
051    public void service(ServiceManager manager) throws ServiceException
052    {
053        AbstractModelItem.setServiceManager(manager);
054    }
055    
056    /**
057     * Converts the model item's disable conditions in a JSON map
058     * @param modelItem The model item containing the disable conditions
059     * @param context the definition context
060     * @return The model item's disable conditions as a JSON map
061     */
062    public Map<String, Object> disableConditionsToJSON(ModelItem modelItem, DefinitionContext context)
063    {
064        DisableConditions disableConditions = modelItem.getDisableConditions();
065        return _disableConditionsToJSON(modelItem, disableConditions, context);
066    }
067    
068    /**
069     * Converts the given disable conditions in a JSON map
070     * @param modelItem The model item containing the disable conditions
071     * @param disableConditions the disable conditions to convert
072     * @param context the definition context
073     * @return The disable conditions as a JSON map
074     */
075    private Map<String, Object> _disableConditionsToJSON(ModelItem modelItem, DisableConditions disableConditions, DefinitionContext context)
076    {
077        Map<String, Object> map = new HashMap<>();
078        
079        // Handle simple conditions
080        List<Map<String, String>> disableConditionList = new ArrayList<>();
081        map.put("condition", disableConditionList);
082        for (DisableCondition disableCondition : disableConditions.getConditions())
083        {
084            Map<String, String> disableConditionAsMap = disableCondition.isExternal(context)
085                    ? externalDisableConditionToJSON(modelItem, disableCondition)
086                    : disableConditionToJSON(disableCondition);
087            disableConditionList.add(disableConditionAsMap);
088        }
089
090        // Handle nested conditions
091        List<Map<String, Object>> disableConditionsList = new ArrayList<>();
092        map.put("conditions", disableConditionsList);
093        for (DisableConditions subDisableConditions : disableConditions.getSubConditions())
094        {
095            Map<String, Object> disableConditionsAsMap = _disableConditionsToJSON(modelItem, subDisableConditions, context);
096            disableConditionsList.add(disableConditionsAsMap);
097        }
098        
099        // Handle type
100        map.put("type", disableConditions.getAssociationType().toString().toLowerCase());
101        
102        return map;
103    }
104
105    /**
106     * Converts the given disable condition in a JSON map
107     * @param modelItem The model item containing the disable conditions
108     * @param disableCondition the disable condition to convert
109     * @return The disable condition as a JSON map
110     */
111    public Map<String, String> externalDisableConditionToJSON(ModelItem modelItem, DisableCondition disableCondition)
112    {
113        Map<String, String> map = new HashMap<>();
114        
115        String id = DisableCondition.EXTERNAL_CONDITION_ID_PREFIX + modelItem.getPath() + "_" + disableCondition.getName() + "_" + disableCondition.getId();
116        map.put("id", id);
117        
118        map.put("operator", OPERATOR.EQ.toString().toLowerCase());
119        map.put("value", String.valueOf(Boolean.TRUE));
120        return map;
121    }
122
123    /**
124     * Converts the given disable condition in a JSON map
125     * @param disableCondition the disable condition to convert
126     * @return The disable condition as a JSON map
127     */
128    public Map<String, String> disableConditionToJSON(DisableCondition disableCondition)
129    {
130        Map<String, String> map = new HashMap<>();
131        map.put("id", disableCondition.getName());
132        map.put("operator", disableCondition.getOperator().toString().toLowerCase());
133        map.put("value", disableCondition.getValue());
134        return map;
135    }
136}