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}