/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
* 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.
*
* This package contains documentation from OpenGIS specifications.
* OpenGIS consortium's work is fully acknowledged here.
*/
package org.geotools.parameter;
import java.util.Map;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.GeneralParameterDescriptor;
import org.geotools.referencing.AbstractIdentifiedObject;
import org.geotools.referencing.wkt.Formatter;
import org.geotools.resources.i18n.ErrorKeys;
import org.geotools.resources.i18n.Errors;
/**
* Abstract definition of a parameter or group of parameters used by an operation method.
*
* @since 2.1
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux (IRD)
*
* @see AbstractParameter
*/
public abstract class AbstractParameterDescriptor extends AbstractIdentifiedObject
implements GeneralParameterDescriptor
{
/**
* Serial number for interoperability with different versions.
*/
private static final long serialVersionUID = -2630644278783845276L;
/**
* The minimum number of times that values for this parameter group or
* parameter are required.
*/
private final int minimumOccurs;
/**
* Constructs a descriptor with the same values than the specified one. This copy constructor
* may be used in order to wraps an arbitrary implementation into a Geotools one.
*
* @since 2.2
*/
protected AbstractParameterDescriptor(final GeneralParameterDescriptor descriptor) {
super(descriptor);
minimumOccurs = descriptor.getMinimumOccurs();
}
/**
* Constructs a parameter from a set of properties. The properties map is given unchanged to the
* {@linkplain AbstractIdentifiedObject#AbstractIdentifiedObject(Map) super-class constructor}.
*
* @param properties Set of properties. Should contains at least {@code "name"}.
* @param minimumOccurs The {@linkplain #getMinimumOccurs minimum number of times}
* that values for this parameter group or parameter are required.
* @param maximumOccurs The {@linkplain #getMaximumOccurs maximum number of times} that values
* for this parameter group or parameter are required. This value is used in order to
* check the range. For {@link org.opengis.parameter.ParameterValue}, it should always
* be 1.
*/
protected AbstractParameterDescriptor(final Map<String,?> properties,
final int minimumOccurs,
final int maximumOccurs)
{
super(properties);
this.minimumOccurs = minimumOccurs;
if (minimumOccurs < 0 || maximumOccurs < minimumOccurs) {
throw new IllegalArgumentException(Errors.format(ErrorKeys.BAD_RANGE_$2,
minimumOccurs, maximumOccurs));
}
}
/**
* Creates a new instance of {@linkplain AbstractParameter parameter value or group} initialized
* with the {@linkplain DefaultParameterDescriptor#getDefaultValue default value(s)}.
* The {@linkplain AbstractParameter#getDescriptor parameter value descriptor} for the
* created parameter value(s) will be {@code this} object.
* <p>
* Example implementation:
* <pre>
* <b>return</b> new {@linkplain Parameter}(this);
* </pre>
*/
public abstract GeneralParameterValue createValue();
/**
* The minimum number of times that values for this parameter group or
* parameter are required. The default value is one. A value of 0 means
* an optional parameter.
*
* @see #getMaximumOccurs
*/
public int getMinimumOccurs() {
return minimumOccurs;
}
/**
* The maximum number of times that values for this parameter group or parameter
* can be included. For a {@linkplain DefaultParameterDescriptor single parameter},
* the value is always 1. For a {@linkplain DefaultParameterDescriptorGroup parameter group},
* it may vary.
*
* @see #getMinimumOccurs
*/
public abstract int getMaximumOccurs();
/**
* Compares the specified object with this parameter for equality.
*
* @param object The object to compare to {@code this}.
* @param compareMetadata {@code true} for performing a strict comparaison, or
* {@code false} for comparing only properties relevant to transformations.
* @return {@code true} if both objects are equal.
*/
@Override
public boolean equals(final AbstractIdentifiedObject object, final boolean compareMetadata) {
if (super.equals(object, compareMetadata)) {
final AbstractParameterDescriptor that = (AbstractParameterDescriptor) object;
return this.minimumOccurs == that.minimumOccurs;
}
return false;
}
/**
* Returns a hash value for this parameter.
*
* @return The hash code value. This value doesn't need to be the same
* in past or future versions of this class.
*/
@Override
public int hashCode() {
return (int)serialVersionUID ^ minimumOccurs;
}
/**
* Format the inner part of a
* <A HREF="http://geoapi.sourceforge.net/snapshot/javadoc/org/opengis/referencing/doc-files/WKT.html"><cite>Well
* Known Text</cite> (WKT)</A> element. Note that WKT is not yet defined for parameter descriptor.
* Current implementation print only the name.
*
* @param formatter The formatter to use.
* @return The WKT element name, which is "PARAMETER"
*/
@Override
protected String formatWKT(final Formatter formatter) {
formatter.setInvalidWKT(GeneralParameterDescriptor.class);
return "PARAMETER";
}
}