/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.utility.parameter; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.measure.Unit; import org.apache.sis.measure.MeasurementRange; import org.apache.sis.measure.Range; import org.opengis.metadata.citation.Citation; /** * ExtendedParameterDescriptor extent the {@link org.apache.sis.parameter.DefaultParameterDescriptor} class to add * a {@code userObject} Map that will contain others additional parameters. * Add also a new constructor that take parameter name and remarks and others parameters like * validValues, minimum, maximum and units. * * @author Quentin Boileau (Geomatys). * * @see org.apache.sis.parameter.DefaultParameterDescriptor * * @module */ public class ExtendedParameterDescriptor<T> extends org.apache.sis.parameter.DefaultParameterDescriptor<T> { private Map<String, Object> userObject; /** * {@inheritDoc} */ public ExtendedParameterDescriptor(final ExtendedParameterDescriptor<T> descriptor) { super(descriptor); this.userObject = descriptor.getUserObject(); } /** * {@inheritDoc} * * @param userObject map that contain additional value for the parameter. */ public ExtendedParameterDescriptor(final String name, final Class<T> valueClass, final T[] validValues, final T defaultValue, final Map<String, Object> userObject) { super(properties(name, null), 1, 1, valueClass, null, validValues, defaultValue); this.userObject = userObject; } /** * {@inheritDoc} * * @param userObject map that contain additional value for the parameter. */ public ExtendedParameterDescriptor(final String name, final CharSequence remarks, final Class<T> valueClass, final T defaultValue, final boolean required, final Map<String, Object> userObject) { super(properties(name, remarks), (required ? 1 : 0), 1, valueClass, null, null, defaultValue); this.userObject = userObject; } /** * {@inheritDoc} * * @param name * @param remarks * @param minOccurs * @param maxOccurs * @param valueClass * @param defaultValue * @param userObject */ public ExtendedParameterDescriptor(final String name, final CharSequence remarks, final int minOccurs, final int maxOccurs, final Class<T> valueClass, final T defaultValue, final Map<String, Object> userObject) { super(properties(name, remarks),minOccurs, maxOccurs, valueClass, null, null, defaultValue); this.userObject = userObject; } /** * {@inheritDoc} * * @param unit not used since ExtendedParameter extend SIS DefaultParameterDescriptor. * @param userObject map that contain additional value for the parameter. */ public ExtendedParameterDescriptor(final Map<String, ?> properties, final Class<T> valueClass, final T[] validValues, final T defaultValue, final Comparable<T> minimum, final Comparable<T> maximum, final Unit<?> unit, final boolean required, final Map<String, Object> userObject) { super(properties, (required ? 1 : 0), 1, valueClass, toRange(valueClass, minimum, maximum, unit), validValues, defaultValue); this.userObject = userObject; } /** * {@inheritDoc} * * @param unit not used since ExtendedParameter extend SIS DefaultParameterDescriptor. * @param userObject map that contain additional value for the parameter. */ public ExtendedParameterDescriptor(final String name, final CharSequence remarks, final Class<T> valueClass, final T[] validValues, final T defaultValue, final Comparable<T> minimum, final Comparable<T> maximum, final Unit<?> unit, final boolean required, final Map<String, Object> userObject) { super(properties(name, remarks), (required ? 1 : 0), 1, valueClass, toRange(valueClass, minimum, maximum, unit), validValues, defaultValue); this.userObject = userObject; } /** * {@inheritDoc} * * @param authority not used since ExtendedParameter extend SIS DefaultParameterDescriptor. * @param userObject map that contain additional value for the parameter. */ public ExtendedParameterDescriptor(final Citation authority, final String name, final Class<T> valueClass, final T[] validValues, final T defaultValue, final Comparable<T> minimum, final Comparable<T> maximum, final Unit<?> unit, final boolean required, final Map<String, Object> userObject) { super(properties(name, null), (required ? 1 : 0), 1, valueClass, toRange(valueClass, minimum, maximum, unit), validValues, defaultValue); this.userObject = userObject; } /** * Returns the user object map. * * @return The user object map. */ public Map<String, Object> getUserObject() { return userObject; } /** * Work around for RFE #4093999 in Sun's bug database * ("Relax constraint on placement of this()/super() call in constructors"). */ private static Map<String,CharSequence> properties(final String name, final CharSequence remarks) { final Map<String,CharSequence> properties; if (remarks == null ){ properties = Collections.singletonMap(NAME_KEY, (CharSequence) name); } else { properties = new HashMap<>(4); properties.put(NAME_KEY, name); properties.put(REMARKS_KEY, remarks); } return properties; } /** * Create a range from min/max values. * * @param valueClass * @param minimum value inclusive * @param maximum value inclusive * @param unit * @return a Range */ private static <T> Range<?> toRange(Class<T> valueClass, Comparable<T> minimum, Comparable<T> maximum, Unit<?> unit) { if (unit != null && Number.class.isAssignableFrom(valueClass)) { return new MeasurementRange(valueClass, (Number)minimum, true, (Number)maximum, true, unit); } else { return new Range(valueClass, minimum, true, maximum, true); } } }