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; 030import org.apache.commons.lang3.StringUtils; 031 032import org.ametys.runtime.model.AbstractModelItem; 033import org.ametys.runtime.model.DefinitionContext; 034import org.ametys.runtime.model.ModelItem; 035import org.ametys.runtime.model.disableconditions.DisableCondition; 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<? extends DisableCondition> 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<? extends DisableCondition> 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, context) 086 : disableConditionToJSON(disableCondition, context); 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<? extends DisableCondition> 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 * @param context the definition context 110 * @return The disable condition as a JSON map 111 */ 112 public Map<String, String> externalDisableConditionToJSON(ModelItem modelItem, DisableCondition disableCondition, DefinitionContext context) 113 { 114 Map<String, String> map = disableConditionToJSON(disableCondition, context); 115 116 String id = StringUtils.join(new String[] {DisableCondition.EXTERNAL_CONDITION_ID_PREFIX, disableCondition.getId(), map.get("id")}, "_"); 117 map.put("id", id); 118 119 return map; 120 } 121 122 /** 123 * Converts the given disable condition in a JSON map 124 * @param disableCondition the disable condition to convert 125 * @param context the definition context 126 * @return The disable condition as a JSON map 127 */ 128 public Map<String, String> disableConditionToJSON(DisableCondition disableCondition, DefinitionContext context) 129 { 130 Map<String, String> map = new HashMap<>(); 131 map.put("id", StringUtils.join(context.getConditionPrefix().orElse(null), disableCondition.getName())); 132 map.put("operator", disableCondition.getOperator().toString().toLowerCase()); 133 map.put("value", disableCondition.getValue()); 134 map.put("hideIfDisabled", String.valueOf(disableCondition.hideIfDisabled())); 135 return map; 136 } 137}