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.web.service;
017
018import java.lang.reflect.Array;
019import java.util.ArrayList;
020import java.util.List;
021import java.util.Map;
022
023import org.ametys.runtime.i18n.I18nizableText;
024import org.ametys.runtime.model.DefaultElementDefinition;
025
026/**
027 * The definition of a service parameter
028 * @param <T> Type of the parameter value
029 */
030public class ServiceParameter<T> extends DefaultElementDefinition<T>
031{
032    @SuppressWarnings("unchecked")
033    @Override
034    public <X> X getDefaultValue()
035    {
036        X defaultValue = super.getDefaultValue();
037        
038        if (defaultValue != null && getEnumerator() != null)
039        {
040            try
041            {
042                if (isMultiple())
043                {
044                    return _multipleDefaultValuesFromEnumeration((T[]) defaultValue);
045                }
046                else
047                {
048                    if (getEnumerator().getEntry((T) defaultValue) == null)
049                    {
050                        // default value does not exist
051                        return (X) _getFirstEnumeratorEntry();
052                    }
053                }
054            }
055            catch (Exception e)
056            {
057                _logger.error("Cannot test if default value exists", e);
058            }
059        }
060
061        return defaultValue;
062    }
063    
064    @SuppressWarnings("unchecked")
065    private <X> X _multipleDefaultValuesFromEnumeration(T[] declaredDefaultValues) throws Exception
066    {
067        List<T> existingDefaultValues = new ArrayList<>();
068        for (T declaredDefaultValue : declaredDefaultValues)
069        {
070            if (getEnumerator().getEntry(declaredDefaultValue) != null)
071            {
072                existingDefaultValues.add(declaredDefaultValue);
073            }
074        }
075        
076        if (existingDefaultValues.isEmpty())
077        {
078            T firstEnumeratorEntry = _getFirstEnumeratorEntry();
079            if (firstEnumeratorEntry != null)
080            {
081                existingDefaultValues.add(firstEnumeratorEntry);
082            }
083        }
084
085        X defaultValuesAsArray = (X) Array.newInstance(getType().getManagedClass(), existingDefaultValues.size());
086        for (int i = 0; i < existingDefaultValues.size(); i++)
087        {
088            Array.set(defaultValuesAsArray, i, existingDefaultValues.get(i));
089        }
090
091        return defaultValuesAsArray;
092        
093    }
094    
095    private T _getFirstEnumeratorEntry()
096    {
097        if (getEnumerator() != null)
098        {
099            try
100            {
101                Map<T, I18nizableText> entries = getEnumerator().getTypedEntries();
102                if (!entries.isEmpty())
103                {
104                    return entries.keySet().iterator().next();
105                }
106            }
107            catch (Exception e)
108            {
109                _logger.error("Cannot find the first entry of the enumerator", e);
110            }
111        }
112        
113        // No enumerator entry has been found, retrieve null
114        return null;
115    }
116    
117    @Override
118    public String toString()
119    {
120        return "'" + getName() + "' (type:    " + getType().getId() + ", label:    " + getLabel().toString() + ", " + (getDefaultValue() != null ? ("default value: " + getDefaultValue()) : "no default value")  + ", " + (getEnumerator() != null ? ("enumerator: " + getEnumerator()) : "no enumerator") + ")";
121    }
122}