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.runtime.model;
017
018import org.apache.avalon.framework.configuration.Configuration;
019import org.apache.avalon.framework.configuration.ConfigurationException;
020import org.apache.avalon.framework.service.ServiceManager;
021
022import org.ametys.runtime.model.type.ModelItemType;
023import org.ametys.runtime.parameter.Validator;
024import org.ametys.runtime.plugin.component.AbstractThreadSafeComponentExtensionPoint;
025import org.ametys.runtime.plugin.component.ThreadSafeComponentManager;
026
027/**
028 * Parser for categorized {@link ElementDefinition}
029 */
030public class CategorizedElementDefinitionParser extends ElementDefinitionParser
031{
032    /**
033     * Creates a categorized element definition parser.
034     * @param modelItemTypeExtensionPoint the extension point to use to get available element types
035     * @param enumeratorManager the enumerator component manager.
036     * @param validatorManager the validator component manager.
037     */
038    public CategorizedElementDefinitionParser(AbstractThreadSafeComponentExtensionPoint<? extends ModelItemType> modelItemTypeExtensionPoint, ThreadSafeComponentManager<Enumerator> enumeratorManager, ThreadSafeComponentManager<Validator> validatorManager)
039    {
040        super(modelItemTypeExtensionPoint, enumeratorManager, validatorManager);
041    }
042
043    @Override
044    public CategorizedElementDefinitionProxy parse(ServiceManager serviceManager, String pluginName, Configuration definitionConfig, Model model, ModelItemGroup parent) throws ConfigurationException
045    {
046        CategorizedElementDefinitionProxy elementDefinitionProxy = (CategorizedElementDefinitionProxy) super.parse(serviceManager, pluginName, definitionConfig, model, parent);
047        
048        elementDefinitionProxy.setDisplayCategory(_parseI18nizableText(definitionConfig, pluginName, "category"));
049        elementDefinitionProxy.setDisplayGroup(_parseI18nizableText(definitionConfig, pluginName, "group"));
050        elementDefinitionProxy.setPosition(definitionConfig.getChild("order").getValueAsLong(-1));
051        elementDefinitionProxy.setGroupSwitch(_isGroupSwitch(definitionConfig));
052        
053        return elementDefinitionProxy;
054    }
055    
056    @Override
057    protected CategorizedElementDefinitionProxy _createModelItem(Configuration definitionConfig) throws ConfigurationException
058    {
059        return new CategorizedElementDefinitionProxy<>();
060    }
061    
062    @Override
063    protected Object _parseDefaultValue(Configuration definitionConfig, ElementDefinition definition) throws ConfigurationException
064    {
065        Object defaultValue = super._parseDefaultValue(definitionConfig, definition);
066        if (_isGroupSwitch(definitionConfig) && defaultValue == null)
067        {
068            return Boolean.FALSE;
069        }
070        return defaultValue;
071    }
072
073    private boolean _isGroupSwitch(Configuration definitionConfig)
074    {
075        return definitionConfig.getAttributeAsBoolean("group-switch", false);
076    }
077}