Author: desruisseaux
Date: Fri Feb 27 23:01:11 2015
New Revision: 1662851

URL: http://svn.apache.org/r1662851
Log:
Re-target the Parameters class as the base class of DefaultParameterValueGroup, 
but
providing an API which is more convenient to use at least for the referencing 
module.

Modified:
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
    
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/Static.java

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -210,6 +210,7 @@ public class DefaultParameterValue<T> ex
      *         and there is no default value.
      *
      * @see #setValue(Object)
+     * @see Parameters#getValue(ParameterDescriptor)
      */
     @Override
     public T getValue() {
@@ -228,6 +229,7 @@ public class DefaultParameterValue<T> ex
      * @throws IllegalStateException if the value is not defined and there is 
no default value.
      *
      * @see #setValue(boolean)
+     * @see Parameters#booleanValue(ParameterDescriptor)
      */
     @Override
     public boolean booleanValue() throws IllegalStateException {
@@ -251,6 +253,7 @@ public class DefaultParameterValue<T> ex
      *
      * @see #setValue(int)
      * @see #intValueList()
+     * @see Parameters#intValue(ParameterDescriptor)
      */
     @Override
     public int intValue() throws IllegalStateException {
@@ -277,6 +280,7 @@ public class DefaultParameterValue<T> ex
      *
      * @see #setValue(Object)
      * @see #intValue()
+     * @see Parameters#intValueList(ParameterDescriptor)
      */
     @Override
     public int[] intValueList() throws IllegalStateException {
@@ -302,6 +306,7 @@ public class DefaultParameterValue<T> ex
      * @see #getUnit()
      * @see #setValue(double)
      * @see #doubleValueList()
+     * @see Parameters#doubleValue(ParameterDescriptor)
      */
     @Override
     public double doubleValue() throws IllegalStateException {
@@ -374,6 +379,7 @@ public class DefaultParameterValue<T> ex
      * @see #getUnit()
      * @see #setValue(double,Unit)
      * @see #doubleValueList(Unit)
+     * @see Parameters#doubleValue(ParameterDescriptor)
      */
     @Override
     public double doubleValue(final Unit<?> unit) throws 
IllegalArgumentException, IllegalStateException {
@@ -398,6 +404,7 @@ public class DefaultParameterValue<T> ex
      * @see #getUnit()
      * @see #setValue(double[],Unit)
      * @see #doubleValue(Unit)
+     * @see Parameters#doubleValueList(ParameterDescriptor)
      */
     @Override
     public double[] doubleValueList(final Unit<?> unit) throws 
IllegalArgumentException, IllegalStateException {
@@ -419,6 +426,7 @@ public class DefaultParameterValue<T> ex
      *
      * @see #getValue()
      * @see #setValue(Object)
+     * @see Parameters#stringValue(ParameterDescriptor)
      */
     @Override
     public String stringValue() throws IllegalStateException {

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -97,15 +97,13 @@ import java.util.Objects;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @since   0.4
- * @version 0.4
+ * @version 0.6
  * @module
  *
  * @see DefaultParameterDescriptorGroup
  * @see DefaultParameterValue
  */
-public class DefaultParameterValueGroup implements ParameterValueGroup,
-        LenientComparable, Serializable, Cloneable
-{
+public class DefaultParameterValueGroup extends Parameters implements 
LenientComparable, Serializable {
     /**
      * Serial number for inter-operability with different versions.
      */
@@ -157,6 +155,8 @@ public class DefaultParameterValueGroup
      * The list will verify those conditions and throws {@link 
org.opengis.parameter.InvalidParameterNameException},
      * {@link org.opengis.parameter.InvalidParameterCardinalityException} or 
other runtime exceptions if a condition
      * is not meet.
+     *
+     * @return The values in this group.
      */
     @Override
     public List<GeneralParameterValue> values() {
@@ -197,13 +197,49 @@ public class DefaultParameterValueGroup
      * @param  name The name of the parameter to search for.
      * @return The parameter value for the given name.
      * @throws ParameterNotFoundException if there is no parameter value for 
the given name.
+     *
+     * @see #getValue(ParameterDescriptor)
      */
     @Override
     public ParameterValue<?> parameter(final String name) throws 
ParameterNotFoundException {
+        ParameterValue<?> value = parameterIfExist(name);
+        if (value == null) {
+            /*
+             * No existing parameter found. Maybe the parameter is optional 
and not yet created.
+             * Get the descriptor of that parameter. If the descriptor is not 
found, or is not
+             * a descriptor for a single parameter (not a group), or the 
parameter is disabled
+             * (maximum occurrence = 0), behaves as if the parameter was not 
found.
+             */
+            final GeneralParameterDescriptor descriptor = 
values.descriptor.descriptor(name);
+            if (!(descriptor instanceof ParameterDescriptor<?>) || 
descriptor.getMaximumOccurs() == 0) {
+                throw new 
ParameterNotFoundException(Errors.format(Errors.Keys.ParameterNotFound_2,
+                        values.descriptor.getName(), name), name);
+            }
+            /*
+             * Create the optional parameter and add it to our internal list. 
Note that this is
+             * not the only place were a ParameterValue may be created,  so do 
not extract just
+             * this call to 'createValue()' in a user-overrideable method.
+             */
+            value = ((ParameterDescriptor<?>) descriptor).createValue();
+            values.addUnchecked(value);
+        }
+        return value;
+    }
+
+    /**
+     * Returns the value in this group for the specified name if it exists, or 
{@code null} if none.
+     * This method does not create any new {@code ParameterValue} instance.
+     */
+    @Override
+    final ParameterValue<?> parameterIfExist(final String name) throws 
ParameterNotFoundException {
         ArgumentChecks.ensureNonNull("name", name);
         final ParameterValueList values = this.values; // Protect against 
accidental changes.
-
-        // Quick search for an exact match.
+        /*
+         * Quick search for an exact match. By invoking 'descriptor(i)' 
instead of 'get(i)',
+         * we avoid the creation of mandatory ParameterValue which was 
deferred. If we find
+         * a matching name, the ParameterValue will be lazily created (if not 
already done)
+         * by the call to 'get(i)'.
+         */
         final int size = values.size();
         for (int i=0; i<size; i++) {
             final GeneralParameterDescriptor descriptor = values.descriptor(i);
@@ -213,8 +249,11 @@ public class DefaultParameterValueGroup
                 }
             }
         }
-        // More costly search before to give up.
-        int fallback = -1, ambiguity = -1;
+        /*
+         * More costly search, including aliases, before to give up.
+         */
+        int fallback  = -1;
+        int ambiguity = -1;
         for (int i=0; i<size; i++) {
             final GeneralParameterDescriptor descriptor = values.descriptor(i);
             if (descriptor instanceof ParameterDescriptor<?>) {
@@ -229,23 +268,12 @@ public class DefaultParameterValueGroup
         }
         if (fallback >= 0) {
             if (ambiguity < 0) {
-                return (ParameterValue<?>) values.get(fallback);
+                return (ParameterValue<?>) values.get(fallback);   // May 
lazily create a ParameterValue.
             }
             throw new 
ParameterNotFoundException(Errors.format(Errors.Keys.AmbiguousName_3,
                     values.descriptor(fallback).getName(), 
values.descriptor(ambiguity).getName(), name), name);
         }
-        /*
-         * No existing parameter found. The parameter may be optional. Check 
if a descriptor exists.
-         * If such a descriptor is found, create the parameter, add it to the 
values list and returns it.
-         */
-        final GeneralParameterDescriptor descriptor = 
values.descriptor.descriptor(name);
-        if (descriptor instanceof ParameterDescriptor<?> && 
descriptor.getMaximumOccurs() != 0) {
-            final ParameterValue<?> value = ((ParameterDescriptor<?>) 
descriptor).createValue();
-            values.addUnchecked(value);
-            return value;
-        }
-        throw new 
ParameterNotFoundException(Errors.format(Errors.Keys.ParameterNotFound_2,
-                values.descriptor.getName(), name), name);
+        return null;
     }
 
     /**
@@ -385,16 +413,12 @@ public class DefaultParameterValueGroup
      * Included parameter values and subgroups are cloned recursively.
      *
      * @return A copy of this group of parameter values.
+     *
+     * @see #copy(ParameterValueGroup, ParameterValueGroup)
      */
     @Override
-    @SuppressWarnings("unchecked")
     public DefaultParameterValueGroup clone() {
-        final DefaultParameterValueGroup copy;
-        try {
-            copy = (DefaultParameterValueGroup) super.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new AssertionError(e);
-        }
+        final DefaultParameterValueGroup copy = (DefaultParameterValueGroup) 
super.clone();
         copy.values = new ParameterValueList(copy.values);
         return copy;
     }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -18,30 +18,115 @@ package org.apache.sis.parameter;
 
 import java.util.Map;
 import java.util.HashMap;
+import java.util.List;
+import java.io.Serializable;
 import javax.measure.unit.Unit;
 import org.opengis.util.MemberName;
+import org.opengis.metadata.Identifier;
+import org.opengis.metadata.citation.Citation;
 import org.opengis.parameter.*; // We use almost all types from this package.
 import org.apache.sis.internal.jaxb.metadata.replace.ServiceParameter;
 import org.apache.sis.measure.Range;
 import org.apache.sis.measure.NumberRange;
 import org.apache.sis.measure.MeasurementRange;
+import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.ObjectConverters;
 import org.apache.sis.util.resources.Errors;
-import org.apache.sis.util.Static;
+
+import static 
org.apache.sis.referencing.IdentifiedObjects.isHeuristicMatchForName;
 
 
 /**
- * Static methods working on parameters and their descriptors.
+ * Convenience methods for fetching parameter values despite the variations in 
parameter names, value types and units.
+ * See {@link DefaultParameterValueGroup} javadoc for a description of the 
standard way to get and set a particular
+ * parameter in a group. The remaining of this javadoc is specific to Apache 
SIS.
+ *
+ * {@section Convenience static methods}
+ * This class provides the following convenience static methods:
+ * <ul>
+ *   <li>{@link #cast(ParameterValue, Class) cast(…, Class)} for type safety 
with parameterized types.</li>
+ *   <li>{@link #getMemberName(ParameterDescriptor)} for inter-operability 
between ISO 19111 and ISO 19115.</li>
+ *   <li>{@link #getValueDomain(ParameterDescriptor)} for information 
purpose.</li>
+ *   <li>{@link #copy(ParameterValueGroup, ParameterValueGroup)} for copying 
values into an existing instance.</li>
+ * </ul>
+ *
+ * {@section Finding a parameter despite different names}
+ * The same parameter may be known under different names. For example the
+ * {@linkplain 
org.apache.sis.referencing.datum.DefaultEllipsoid#getSemiMajorAxis() length of 
the semi-major axis of the
+ * ellipsoid} is commonly known as {@code "semi_major"}. But that parameter 
can also be named {@code "semi_major_axis"}
+ * or {@code "earth_radius"} in NetCDF files, or simply {@code "a"} in the 
Proj.4 library.
+ *
+ * <p>The common way to get a parameter is to invoke the {@link 
#parameter(String)} method.
+ * But we do not always know in advance which of the above-cited names is 
recognized by an arbitrary
+ * {@code ParameterValueGroup} implementation.</p>
+ *
+ * <div class="note"><b>Note:</b>
+ * This uncertainty is mitigated with the Apache SIS implementation since it 
compares the given {@code String}
+ * argument against all parameter's {@linkplain 
DefaultParameterDescriptor#getAlias() aliases} in addition to
+ * the {@linkplain DefaultParameterDescriptor#getName() name}. However we do 
not have the guarantee that all
+ * implementations do that.</div>
+ *
+ * This {@code Parameters} class provides an alternative way to search for 
parameters,
+ * which use a given {@link ParameterDescriptor} argument instead than a 
{@code String}.
+ * {@code Parameters} uses the additional information provided by the 
descriptor for
+ * choosing a {@code String} argument that {@link #parameter(String)} is more 
likely to know.
+ * See for example {@link #getValue(ParameterDescriptor)}.
+ *
+ * {@section Note for subclass implementors}
+ * All methods in this class get their information from the {@link 
ParameterValueGroup} methods.
+ * In addition, each method in this class is isolated from all others: 
overriding one of those
+ * methods have no impact on other methods.
+ *
+ * <div class="note"><b>Note on this class name:</b>
+ * Despite implementing the {@link ParameterValueGroup} interface, this class 
is not named
+ * {@code AbstractParameterValueGroup} because it does not implement any 
method from the interface.
+ * Extending this class or extending {@link Object} make almost no difference 
for implementors.
+ * This {@code Parameters} class intend is rather to extend the API with 
methods that are convenient
+ * for the way Apache SIS uses parameters.
+ * Consequently this class is intended for users rather than 
implementors.</div>
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.4
- * @version 0.5
+ * @version 0.6
  * @module
  */
-public final class Parameters extends Static {
+public abstract class Parameters implements ParameterValueGroup, Cloneable {
     /**
-     * Do not allow instantiation of this class.
+     * For subclass constructors only.
      */
-    private Parameters() {
+    protected Parameters() {
+    }
+
+    /**
+     * Returns the given parameter value group as a {@code Parameters} 
instance.
+     * If the given parameters is already an instance of {@code Parameters}, 
then it is returned as-is.
+     * Otherwise this method returns a wrapper which delegate all method 
invocations to the given instance.
+     *
+     * @param  parameters The object to cast or wrap, or {@code null}.
+     * @return The given argument as an instance of {@code Parameters} (may be 
the same reference),
+     *         or {@code null} if the given argument was null.
+     */
+    public static Parameters castOrWrap(final ParameterValueGroup parameters) {
+        if (parameters == null || parameters instanceof Parameters) {
+            return (Parameters) parameters;
+        } else {
+            return new Wrapper(parameters);
+        }
+    }
+
+    /** Wrappers used as a fallback by {@link 
Parameters#castOrWrap(ParameterValueGroup)}. */
+    private static final class Wrapper extends Parameters implements 
Serializable {
+        private static final long serialVersionUID = -5491790565456920471L;
+        private final ParameterValueGroup delegate;
+        Wrapper(final ParameterValueGroup delegate) {this.delegate = delegate;}
+
+        @Override public ParameterDescriptorGroup    getDescriptor()        
{return delegate.getDescriptor();}
+        @Override public List<GeneralParameterValue> values()               
{return delegate.values();}
+        @Override public ParameterValue<?>           parameter(String name) 
{return delegate.parameter(name);}
+        @Override public List<ParameterValueGroup>   groups   (String name) 
{return delegate.groups(name);}
+        @Override public ParameterValueGroup         addGroup (String name) 
{return delegate.addGroup(name);}
+        @Override public Parameters                  clone()                
{return new Wrapper(delegate.clone());}
     }
 
     /**
@@ -114,6 +199,301 @@ public final class Parameters extends St
     }
 
     /**
+     * Returns the name or alias of the given parameter for the authority code 
space expected by this group.
+     * If no name or alias for this group's authority can be found, then the 
primary name will be returned.
+     *
+     * @param  source The parameter for which the name is wanted.
+     * @return The name of the given parameter.
+     */
+    private String getName(final GeneralParameterDescriptor source) {
+        final ParameterDescriptorGroup descriptor = getDescriptor();
+        if (descriptor != null) {   // Paranoiac check (should never be null)
+            final Identifier group = descriptor.getName();
+            if (group != null) {    // Paranoiac check (should never be null)
+                final Citation authority = group.getAuthority();
+                if (authority != null) {
+                    final String name = IdentifiedObjects.getName(source, 
group.getAuthority());
+                    if (name != null) {
+                        return name;
+                    }
+                }
+            }
+        }
+        return IdentifiedObjects.getName(source, null);
+    }
+
+    /**
+     * Returns the parameter of the given name, or {@code null} if it does not 
exist.
+     * The default implementation iterates over the {@link #values()} and 
compares the descriptor names.
+     * The {@link DefaultParameterValueGroup} subclass will override this 
method with a more efficient
+     * implementation which avoid creating some deferred parameters.
+     */
+    ParameterValue<?> parameterIfExist(final String name) throws 
ParameterNotFoundException {
+        for (final GeneralParameterValue value : values()) {
+            if (value instanceof ParameterValue<?>) {
+                if (isHeuristicMatchForName(value.getDescriptor(), name)) {
+                    return (ParameterValue<?>) value;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the parameter value for the specified operation parameter.
+     * This method tries to do the same work than {@link #parameter(String)} 
but without
+     * instantiating optional parameters if that parameter was not already 
instantiated.
+     *
+     * @param  parameter The parameter to search.
+     * @return The requested parameter value, or {@code null} if none.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     */
+    private ParameterValue<?> getParameter(final ParameterDescriptor<?> 
parameter) throws ParameterNotFoundException {
+        ArgumentChecks.ensureNonNull("parameter", parameter);
+        /*
+         * Search for an identifier matching this group's authority. For 
example if this ParameterValueGroup
+         * was created from an EPSG database, then we want to use the EPSG 
names instead than the OGC names.
+         */
+        final String name = getName(parameter);
+        if (parameter.getMinimumOccurs() == 0) {
+            /*
+             * The parameter is optional. We do not want to invoke 
'parameter(name)' because we do not want
+             * to create a new parameter if the user did not supplied one.  We 
search the parameter ourself
+             * (so we don't create any) and return null if we do not find any.
+             *
+             * If we find a parameter,  we can return it directly only if this 
object is an instance of a known
+             * implementation (currently DefaultParameterValueGroup only), 
otherwise we do not know if the user
+             * overrode the 'parameter' method  (we do not use 
Class.getMethod(...).getDeclaringClass() because
+             * it is presumed not worth the cost).  In case of doubt, we 
delegate to 'parameter(name)'.
+             */
+            final ParameterValue<?> value = parameterIfExist(name);
+            if (value == null || getClass() == 
DefaultParameterValueGroup.class) {
+                return value;
+            }
+        }
+        return parameter(name);
+    }
+
+    /**
+     * Returns the value of the parameter identified by the given descriptor.
+     * This method uses the following information from the given {@code 
parameter} descriptor:
+     *
+     * <ul>
+     *   <li>The most appropriate {@linkplain 
DefaultParameterDescriptor#getName() name} or
+     *       {@linkplain DefaultParameterDescriptor#getAlias() alias} to use 
for searching
+     *       in this {@code ParameterValueGroup};</li>
+     *   <li>The {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value}
+     *       to return if there is no value associated to the above-cited name 
or alias;</li>
+     *   <li>The {@linkplain DefaultParameterDescriptor#getUnit() unit of 
measurement}
+     *       (if any) of numerical value to return;</li>
+     *   <li>The {@linkplain DefaultParameterDescriptor#getValueClass() type} 
of value to return.</li>
+     * </ul>
+     *
+     * This method can be useful when the {@code ParameterDescriptor} are 
known in advance, for example in the
+     * implementation of some {@linkplain 
org.apache.sis.referencing.operation.DefaultOperationMethod coordinate
+     * operation method}. If the caller has no such {@code 
ParameterDescriptor} at hand, then the
+     * {@link DefaultParameterValueGroup#parameter(String) parameter(String)} 
method is probably more convenient.
+     *
+     * @param  <T> The type of the parameter value.
+     * @param  parameter The name or alias of the parameter to look for, 
together with the desired type and unit of value.
+     * @return The requested parameter value if it exists, or the {@linkplain 
DefaultParameterDescriptor#getDefaultValue()
+     *         default value} otherwise (which may be {@code null}).
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     *
+     * @see DefaultParameterValueGroup#parameter(String)
+     * @see DefaultParameterValue#getValue()
+     *
+     * @since 0.6
+     */
+    public <T> T getValue(final ParameterDescriptor<T> parameter) throws 
ParameterNotFoundException {
+        final ParameterValue<?> p = getParameter(parameter);
+        if (p != null) {
+            final Object value;
+            final Class<T> type = parameter.getValueClass();
+            final Unit<?>  unit = parameter.getUnit();
+            if (unit == null) {
+                value = p.getValue();
+            } else if (type.isArray()) {
+                value = p.doubleValueList(unit);
+            } else {
+                value = p.doubleValue(unit);
+            }
+            if (value != null) {
+                return ObjectConverters.convert(value, type);
+            }
+        }
+        return parameter.getDefaultValue();     // Returning null is allowed 
here.
+    }
+
+    /**
+     * Returns the default value of the given descriptor, or throws an 
exception if the
+     * descriptor does not define a default value. This check should be kept 
consistent
+     * with the {@link DefaultParameterValue#incompatibleValue(Object)} check.
+     */
+    private static <T> T defaultValue(final ParameterDescriptor<T> parameter) 
throws IllegalStateException {
+        final T value = parameter.getDefaultValue();
+        if (value != null) {
+            return value;
+        } else {
+            throw new IllegalStateException(Errors.format(
+                    Errors.Keys.MissingValueForParameter_1, 
Verifier.getName(parameter)));
+        }
+    }
+
+    /**
+     * Returns the boolean value of the parameter identified by the given 
descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this
+     * method uses the given {@code parameter} argument.
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter value if it exists, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#booleanValue()
+     *
+     * @since 0.6
+     */
+    public boolean booleanValue(final ParameterDescriptor<Boolean> parameter) 
throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        return (value != null) ? value.booleanValue() : 
defaultValue(parameter);
+    }
+
+    /**
+     * Returns the integer value of the parameter identified by the given 
descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this
+     * method uses the given {@code parameter} argument.
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter value if it exists, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#intValue()
+     *
+     * @since 0.6
+     */
+    public int intValue(final ParameterDescriptor<? extends Number> parameter) 
throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        return (value != null) ? value.intValue() : 
defaultValue(parameter).intValue();
+    }
+
+    /**
+     * Returns the integer values of the parameter identified by the given 
descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this
+     * method uses the given {@code parameter} argument.
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter values if they exist, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#intValueList()
+     *
+     * @since 0.6
+     */
+    public int[] intValueList(final ParameterDescriptor<int[]> parameter) 
throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        return (value != null) ? value.intValueList() : 
defaultValue(parameter);
+    }
+
+    /**
+     * Returns the floating point value of the parameter identified by the 
given descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this method
+     * uses the given {@code parameter} argument.
+     *
+     * <p>If the given descriptor supplies a {@linkplain 
DefaultParameterDescriptor#getUnit()
+     * unit of measurement}, then the returned value will be converted into 
that unit.</p>
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter value if it exists, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#doubleValue(Unit)
+     *
+     * @since 0.6
+     */
+    public double doubleValue(final ParameterDescriptor<? extends Number> 
parameter) throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        if (value != null) {
+            final Unit<?> unit = parameter.getUnit();
+            return (unit != null) ? value.doubleValue(unit) : 
value.doubleValue();
+        } else {
+            return defaultValue(parameter).doubleValue();
+        }
+    }
+
+    /**
+     * Returns the floating point values of the parameter identified by the 
given descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this method
+     * uses the given {@code parameter} argument.
+     *
+     * <p>If the given descriptor supplies a {@linkplain 
DefaultParameterDescriptor#getUnit()
+     * unit of measurement}, then the returned values will be converted into 
that unit.</p>
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter values if they exists, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#doubleValueList(Unit)
+     *
+     * @since 0.6
+     */
+    public double[] doubleValueList(final ParameterDescriptor<double[]> 
parameter) throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        if (value != null) {
+            final Unit<?> unit = parameter.getUnit();
+            return (unit != null) ? value.doubleValueList(unit) : 
value.doubleValueList();
+        } else {
+            return defaultValue(parameter);
+        }
+    }
+
+    /**
+     * Returns the string value of the parameter identified by the given 
descriptor.
+     * See {@link #getValue(ParameterDescriptor)} for more information about 
how this
+     * method uses the given {@code parameter} argument.
+     *
+     * @param  parameter The name or alias of the parameter to look for.
+     * @return The requested parameter value if it exists, or the 
<strong>non-null</strong>
+     *         {@linkplain DefaultParameterDescriptor#getDefaultValue() 
default value} otherwise.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     * @throws IllegalStateException if the value is not defined and there is 
no default value.
+     *
+     * @see DefaultParameterValue#stringValue()
+     *
+     * @since 0.6
+     */
+    public String stringValue(final ParameterDescriptor<? extends 
CharSequence> parameter) throws ParameterNotFoundException {
+        final ParameterValue<?> value = getParameter(parameter);
+        return (value != null) ? value.stringValue() : 
defaultValue(parameter).toString();
+    }
+
+    /**
+     * Returns the parameter identified by the given descriptor.
+     * If the identified parameter is optional and not yet created, then it 
will be created now.
+     *
+     * @param  <T> The type of the parameter value.
+     * @param  parameter The parameter to look for.
+     * @return The requested parameter instance.
+     * @throws ParameterNotFoundException if the given {@code parameter} name 
or alias is not legal for this group.
+     *
+     * @see DefaultParameterValueGroup#parameter(String)
+     *
+     * @since 0.6
+     */
+    public <T> ParameterValue<T> getOrCreate(final ParameterDescriptor<T> 
parameter) throws ParameterNotFoundException {
+        return cast(parameter(getName(parameter)), parameter.getValueClass());
+    }
+
+    /**
      * Casts the given parameter descriptor to the given type.
      * An exception is thrown immediately if the parameter does not have the 
expected
      * {@linkplain DefaultParameterDescriptor#getValueClass() value class}.
@@ -184,6 +564,8 @@ public final class Parameters extends St
      * @throws InvalidParameterNameException if a {@code source} parameter 
name is unknown to the {@code destination}.
      * @throws InvalidParameterValueException if the value of a {@code source} 
parameter is invalid for the {@code destination}.
      *
+     * @see #clone()
+     *
      * @since 0.5
      */
     public static void copy(final ParameterValueGroup values, final 
ParameterValueGroup destination)
@@ -276,4 +658,21 @@ public final class Parameters extends St
             throw new IndexOutOfBoundsException(name);
         }
     }
+
+    /**
+     * Returns a deep copy of this group of parameter values.
+     * Included parameter values and subgroups are cloned recursively.
+     *
+     * @return A copy of this group of parameter values.
+     *
+     * @see #copy(ParameterValueGroup, ParameterValueGroup)
+     */
+    @Override
+    public Parameters clone() {
+        try {
+            return (Parameters) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError(e);   // Should never happen since we are 
Cloneable
+        }
+    }
 }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -27,8 +27,8 @@
  *     do not contain the actual parameter value.</li>
  *   <li><b>Parameter values</b> are (<var>descriptor</var>, <var>value</var>) 
tuples, together with convenience methods
  *     for performing unit conversions and getting the values as instances of 
some commonly used types.</li>
- *   <li>Builders, formatters and static methods aim to simplify the creation 
of {@code ParameterDescriptor}s,
- *     the search for parameter values and visualizing them in a tabular 
format.</li>
+ *   <li><b>Builders</b>, <b>formatters</b> and search methods aim to simplify 
the creation of
+ *     {@code ParameterDescriptor}s, the search for parameter values and 
visualizing them in a tabular format.</li>
  * </ul>
  *
  * <p>Parameters are organized in <cite>groups</cite>.
@@ -84,8 +84,8 @@
  * if the given value is not assignable to the expected class or is not inside 
the value domain.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @since   0.5
- * @version 0.4
+ * @since   0.4
+ * @version 0.6
  * @module
  */
 package org.apache.sis.parameter;

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -16,8 +16,9 @@
  */
 package org.apache.sis.parameter;
 
-import java.util.Collection;
 import java.util.Set;
+import java.util.Collection;
+import java.util.Collections;
 import javax.measure.unit.SI;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDirection;
@@ -42,12 +43,14 @@ import static org.junit.Assert.*;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.4
- * @version 0.5
+ * @version 0.6
  * @module
  */
 @DependsOn({
     DefaultParameterDescriptorTest.class,
-    DefaultParameterValueTest.class
+    DefaultParameterDescriptorGroupTest.class,
+    DefaultParameterValueTest.class,
+    DefaultParameterValueGroupTest.class
 })
 public final strictfp class ParametersTest extends TestCase {
     /**
@@ -155,4 +158,38 @@ public final strictfp class ParametersTe
         assertEquals("Optional 4 (second occurrence)", 50,
                 ((ParameterValue<?>) destination.values().get(4)).intValue());
     }
+
+    /**
+     * Tests {@link Parameters#getValue(ParameterDescriptor)} and {@link 
Parameters#intValue(ParameterDescriptor)}.
+     *
+     * @since 0.6
+     */
+    @Test
+    public void testGetIntValue() {
+        final ParameterDescriptor<Integer> descriptor = 
DefaultParameterDescriptorTest.create("My param", 5, 15, 10);
+        final ParameterDescriptor<Integer> incomplete = 
DefaultParameterDescriptorTest.createSimpleOptional("My param", Integer.class);
+        final Parameters group = Parameters.castOrWrap(new 
DefaultParameterDescriptorGroup(Collections.singletonMap(
+                DefaultParameterDescriptorGroup.NAME_KEY, "My group"), 1, 1, 
incomplete).createValue());
+        /*
+         * Test when the ParameterValueGroup is empty. We test both with the 
"incomplete" descriptor,
+         * which contain no default value, and with the complete one, which 
provide a default value.
+         */
+        assertNull("No value and no default value.", 
group.getValue(incomplete));
+        assertEquals("No value, should fallback on default.", 
Integer.valueOf(10), group.getValue(descriptor));
+        try {
+            group.intValue(incomplete);
+            fail("Can not return when there is no value.");
+        } catch (IllegalStateException e) {
+            final String message = e.getMessage();
+            assertTrue(message, message.contains("My param"));
+        }
+        /*
+         * Define a value and test again.
+         */
+        group.parameter("My param").setValue(12);
+        assertEquals(Integer.valueOf(12), group.getValue(incomplete));
+        assertEquals(Integer.valueOf(12), group.getValue(descriptor));
+        assertEquals(12, group.intValue(incomplete));
+        assertEquals(12, group.intValue(descriptor));
+    }
 }

Modified: 
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/Static.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/Static.java?rev=1662851&r1=1662850&r2=1662851&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/Static.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/Static.java
 [UTF-8] Fri Feb 27 23:01:11 2015
@@ -71,7 +71,8 @@ package org.apache.sis.util;
  *     <td>Parses axis names and creates transforms between {@link 
org.opengis.referencing.cs.CoordinateSystem}
  *         instances.</td></tr>
  * <tr><td>{@link org.apache.sis.parameter.Parameters}</td>
- *     <td>Creates, searches or modifies {@link 
org.opengis.parameter.ParameterValue} instances.</td></tr>
+ *     <td>Creates, searches or modifies {@link 
org.opengis.parameter.ParameterValue} instances
+ *         in a group of parameters.</td></tr>
  *
  * <tr><th colspan="2" class="hsep">Input / Output (including CRS, XML, 
images)</th></tr>
  * <tr><td>{@link org.apache.sis.io.IO}</td>
@@ -97,7 +98,7 @@ package org.apache.sis.util;
  *     <td>Create {@link ObjectConverter} instances, or collection views using 
object converters.</td></tr>
  * </table>
  *
- * @author Martin Desruisseaux (Geomatys)
+ * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3
  * @version 0.3
  * @module


Reply via email to