Author: desruisseaux
Date: Wed Sep  2 15:37:39 2015
New Revision: 1700843

URL: http://svn.apache.org/r1700843
Log:
Add test for <gml:Conversion> unmarshalling.

Added:
    
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/
    
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
   (with props)
Modified:
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.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/referencing/operation/AbstractSingleOperation.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/OperationMarshallingTest.java

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java?rev=1700843&r1=1700842&r2=1700843&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
 [UTF-8] Wed Sep  2 15:37:39 2015
@@ -17,12 +17,17 @@
 package org.apache.sis.internal.jaxb.referencing;
 
 import java.util.Map;
+import java.util.Collection;
 import java.util.Collections;
 import javax.xml.bind.annotation.XmlElement;
+import javax.measure.unit.Unit;
 import org.opengis.util.FactoryException;
 import org.opengis.metadata.Identifier;
 import org.opengis.parameter.GeneralParameterValue;
 import org.opengis.parameter.GeneralParameterDescriptor;
+import org.opengis.parameter.ParameterValue;
+import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.referencing.operation.OperationMethod;
 import org.opengis.referencing.operation.CoordinateOperationFactory;
@@ -30,6 +35,8 @@ import org.apache.sis.internal.jaxb.Cont
 import org.apache.sis.internal.jaxb.gco.PropertyType;
 import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.internal.referencing.provider.MapProjection;
+import org.apache.sis.parameter.DefaultParameterValue;
+import org.apache.sis.parameter.DefaultParameterValueGroup;
 import org.apache.sis.parameter.DefaultParameterDescriptorGroup;
 import org.apache.sis.referencing.operation.DefaultOperationMethod;
 import org.apache.sis.referencing.IdentifiedObjects;
@@ -186,4 +193,50 @@ public final class CC_OperationMethod ex
         }
         return new DefaultParameterDescriptorGroup(properties, 1, 1, 
descriptors);
     }
+
+    /**
+     * Stores the given {@code parameters} into the given {@code addTo} 
collection.
+     * This method copies only the <em>references</em> if possible. However is 
some
+     * cases the values may need to be copied in new parameter instances.
+     *
+     * <div class="note"><b>Note:</b>
+     * this code is defined in this {@code CC_OperationMethod} class instead 
than in the
+     * {@link DefaultOperationMethod} class in the hope to reduce the amount 
of code processed
+     * by the JVM in the common case where JAXB (un)marshalling is not 
needed.</div>
+     *
+     * @param parameters   The parameters to add to the {@code addTo} 
collection.
+     * @param addTo        Where to store the {@code parameters}.
+     * @param replacements The replacements to apply in the {@code 
GeneralParameterValue} instances.
+     */
+    public static void store(final GeneralParameterValue[] parameters,
+                             final Collection<GeneralParameterValue> addTo,
+                             final 
Map<GeneralParameterDescriptor,GeneralParameterDescriptor> replacements)
+    {
+        for (GeneralParameterValue p : parameters) {
+            final GeneralParameterDescriptor replacement = 
replacements.get(p.getDescriptor());
+            if (replacement != null) {
+                if (p instanceof ParameterValue<?>) {
+                    final ParameterValue<?> source = (ParameterValue<?>) p;
+                    final ParameterValue<?> target = new 
DefaultParameterValue<>((ParameterDescriptor<?>) replacement);
+                    final Object value = source.getValue();
+                    final Unit<?> unit = source.getUnit();
+                    if (unit == null) {
+                        target.setValue(value);
+                    } else if (value instanceof double[]) {
+                        target.setValue((double[]) value, unit);
+                    } else {
+                        target.setValue(((Number) value).doubleValue(), unit);
+                    }
+                    p = target;
+                } else if (p instanceof ParameterValueGroup) {
+                    final ParameterValueGroup source = (ParameterValueGroup) p;
+                    final ParameterValueGroup target = new 
DefaultParameterValueGroup((ParameterDescriptorGroup) replacement);
+                    final Collection<GeneralParameterValue> values = 
source.values();
+                    store(values.toArray(new 
GeneralParameterValue[values.size()]), target.values(), replacements);
+                    p = target;
+                }
+            }
+            addTo.add(p);
+        }
+    }
 }

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=1700843&r1=1700842&r2=1700843&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] Wed Sep  2 15:37:39 2015
@@ -526,16 +526,10 @@ public class DefaultParameterValueGroup
      * {@link 
org.apache.sis.internal.jaxb.referencing.CC_GeneralOperationParameter} for 
logging purpose.</p>
      */
     private void setValues(final GeneralParameterValue[] parameters) {
-        final GeneralParameterDescriptor[] fromValues = new 
GeneralParameterDescriptor[parameters.length];
-        for (int i=0; i<parameters.length; i++) {
-            fromValues[i] = parameters[i].getDescriptor();
-        }
         ParameterValueList addTo = values;
         if (addTo == null) {
             // Should never happen, unless the XML document is invalid and 
does not have a 'group' element.
             addTo = new ParameterValueList(new 
DefaultParameterDescriptorGroup());
-        } else {
-            addTo.clear();  // Because references to parameter descriptors 
have changed.
         }
         /*
          * Merge the descriptors declared in the <gml:group> element with the 
descriptors given in each
@@ -543,8 +537,9 @@ public class DefaultParameterValueGroup
          * because this is the type declared in the JAXBContext and in 
adapters.
          */
         final Map<GeneralParameterDescriptor,GeneralParameterDescriptor> 
replacements = new IdentityHashMap<>(4);
-        ((DefaultParameterDescriptorGroup) addTo.descriptor).merge(fromValues, 
replacements);
-        addAll(parameters, replacements, addTo);
+        ((DefaultParameterDescriptorGroup) 
addTo.descriptor).merge(getDescriptors(parameters), replacements);
+        addTo.clear();  // Because references to parameter descriptors have 
changed.
+        setValues(parameters, replacements, addTo);
     }
 
     /**
@@ -556,7 +551,7 @@ public class DefaultParameterValueGroup
      * @param addTo        Where to store the new values.
      */
     @SuppressWarnings({"unchecked", 
"AssignmentToCollectionOrArrayFieldFromParameter"})
-    private void addAll(GeneralParameterValue[] parameters,
+    private void setValues(GeneralParameterValue[] parameters,
             final Map<GeneralParameterDescriptor,GeneralParameterDescriptor> 
replacements,
             final ParameterValueList addTo)
     {
@@ -569,7 +564,7 @@ public class DefaultParameterValueGroup
                 if (p instanceof DefaultParameterValue<?>) {
                     ((DefaultParameterValue<?>) 
p).setDescriptor((ParameterDescriptor) replacement);
                 } else if (p instanceof DefaultParameterValueGroup) {
-                    ((DefaultParameterValueGroup) p).addAll(null, replacements,
+                    ((DefaultParameterValueGroup) p).setValues(null, 
replacements,
                             new ParameterValueList((ParameterDescriptorGroup) 
replacement));
                 }
             }

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=1700843&r1=1700842&r2=1700843&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] Wed Sep  2 15:37:39 2015
@@ -217,6 +217,35 @@ public abstract class Parameters impleme
     }
 
     /**
+     * Returns the descriptors of the given parameters, in the same order.
+     * Special cases:
+     *
+     * <ul>
+     *   <li>If the given array is {@code null}, then this method returns 
{@code null}.
+     *   <li>If an element of the given array is {@code null}, then the 
corresponding
+     *       element of the returned array is also {@code null}.</li>
+     * </ul>
+     *
+     * @param  parameters The parameter values from which to get the 
descriptors, or {@code null}.
+     * @return The descriptors of the given parameter values, or {@code null} 
if the {@code parameters} argument was null.
+     *
+     * @since 0.6
+     */
+    public static GeneralParameterDescriptor[] getDescriptors(final 
GeneralParameterValue... parameters) {
+        if (parameters == null) {
+            return null;
+        }
+        final GeneralParameterDescriptor[] descriptors = new 
GeneralParameterDescriptor[parameters.length];
+        for (int i=0; i<parameters.length; i++) {
+            final GeneralParameterValue p = parameters[i];
+            if (p != null) {
+                descriptors[i] = p.getDescriptor();
+            }
+        }
+        return descriptors;
+    }
+
+    /**
      * Gets the parameter name as an instance of {@code MemberName}.
      * This method performs the following checks:
      *

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java?rev=1700843&r1=1700842&r2=1700843&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
 [UTF-8] Wed Sep  2 15:37:39 2015
@@ -18,24 +18,27 @@ package org.apache.sis.referencing.opera
 
 import java.util.Map;
 import java.util.List;
-import java.util.Arrays;
+import java.util.IdentityHashMap;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.parameter.ParameterDescriptorGroup;
+import org.opengis.parameter.GeneralParameterDescriptor;
 import org.opengis.parameter.GeneralParameterValue;
 import org.opengis.referencing.operation.Matrix;
 import org.opengis.referencing.operation.SingleOperation;
 import org.opengis.referencing.operation.OperationMethod;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.apache.sis.parameter.Parameters;
 import org.apache.sis.parameter.Parameterized;
 import org.apache.sis.parameter.DefaultParameterValueGroup;
 import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.operation.transform.MathTransforms;
 import org.apache.sis.referencing.operation.transform.PassThroughTransform;
+import org.apache.sis.internal.jaxb.referencing.CC_OperationParameterGroup;
 import org.apache.sis.internal.jaxb.referencing.CC_OperationMethod;
 import org.apache.sis.internal.referencing.ReferencingUtilities;
 import org.apache.sis.internal.metadata.ReferencingServices;
@@ -450,12 +453,38 @@ class AbstractSingleOperation extends Ab
         if (ReferencingUtilities.canSetProperty(DefaultOperationMethod.class,
                 "setParameters", "parameterValue", parameters != null))
         {
-            ParameterDescriptorGroup descriptor = method.getParameters();
-            parameters = new DefaultParameterValueGroup(descriptor);
-            parameters.values().addAll(Arrays.asList(values));
-            if (method instanceof DefaultOperationMethod) {
-                ((DefaultOperationMethod) 
method).setParameters(parameters.getDescriptor());
+            /*
+             * The descriptors in the <gml:method> element do not know the 
class of parameter value
+             * (String, Integer, Double, double[], etc.) because this 
information is not part of GML.
+             * But this information is available to descriptors in the 
<gml:parameterValue> elements
+             * because Apache SIS infers the type from the actual parameter 
value. The 'merge' method
+             * below puts those information together.
+             */
+            final Map<GeneralParameterDescriptor,GeneralParameterDescriptor> 
replacements = new IdentityHashMap<>(4);
+            final GeneralParameterDescriptor[] merged = 
CC_OperationParameterGroup.merge(
+                    method.getParameters().descriptors(),
+                    Parameters.getDescriptors(values),
+                    replacements);
+            /*
+             * Sometime Apache SIS recognizes the OperationMethod as one of 
its build-in methods and use the
+             * build-in parameters. In such cases the unmarshalled 
ParameterDescriptorGroup can be used as-in.
+             * But if the above 'merge' method has changed any parameter 
descriptor, then we will need to create
+             * a new ParameterDescriptorGroup with the new descriptors.
+             */
+            for (int i=0; i<merged.length; i++) {
+                if (merged[i] != values[i].getDescriptor()) {
+                    ((DefaultOperationMethod) 
method).updateDescriptors(merged);
+                    break;
+                }
             }
+            /*
+             * Sometime the descriptors associated to ParameterValues need to 
be updated, for example because
+             * the descriptors in OperationMethod contain more information 
(remarks, etc.). Those updates, if
+             * needed, are applied on-the-fly by the copy operation below, 
using the information provided by
+             * the 'replacements' map.
+             */
+            parameters = new 
DefaultParameterValueGroup(method.getParameters());
+            CC_OperationMethod.store(values, parameters.values(), 
replacements);
         }
     }
 }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java?rev=1700843&r1=1700842&r2=1700843&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
 [UTF-8] Wed Sep  2 15:37:39 2015
@@ -825,10 +825,10 @@ public class DefaultOperationMethod exte
 
     /**
      * Invoked by {@link AbstractSingleOperation} for completing the parameter 
descriptor.
-     *
-     * @see #getParameters()
      */
-    final void setParameters(final ParameterDescriptorGroup descriptor) {
-        parameters = descriptor;
+    final void updateDescriptors(final GeneralParameterDescriptor[] 
descriptors) {
+        final ParameterDescriptorGroup previous = parameters;
+        parameters = new 
DefaultParameterDescriptorGroup(IdentifiedObjects.getProperties(previous),
+                previous.getMinimumOccurs(), previous.getMaximumOccurs(), 
descriptors);
     }
 }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java?rev=1700843&r1=1700842&r2=1700843&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
 [UTF-8] Wed Sep  2 15:37:39 2015
@@ -200,26 +200,43 @@ public final strictfp class CC_Operation
 
         assertSame("name", group.getName(), group.getName());
         assertEquals("descriptors.size", 2, descriptors.size());
-        verifyMethodParameter((DefaultParameterDescriptor<?>) 
descriptors.get(0), (DefaultParameterDescriptor<?>) 
Mercator1SP.LATITUDE_OF_ORIGIN, REMARK);
-        verifyMethodParameter((DefaultParameterDescriptor<?>) 
descriptors.get(1), (DefaultParameterDescriptor<?>) 
Mercator1SP.LONGITUDE_OF_ORIGIN, null);
+        verifyMethodParameter(Mercator1SP.LATITUDE_OF_ORIGIN, REMARK, 
(ParameterDescriptor<?>) descriptors.get(0));
+        verifyMethodParameter(Mercator1SP.LONGITUDE_OF_ORIGIN,  null, 
(ParameterDescriptor<?>) descriptors.get(1));
     }
 
     /**
      * Verifies the properties of an operation method parameter.
+     *
+     * @param expected A parameter descriptor containing the expected 
properties (except remarks).
+     * @param actual   The parameter descriptor to verify.
      */
-    private static void verifyMethodParameter(final 
DefaultParameterDescriptor<?> actual,
-                                              final 
DefaultParameterDescriptor<?> expected,
-                                              final String remarks)
+    public static void verifyMethodParameter(final ParameterDescriptor<?> 
expected,
+                                             final ParameterDescriptor<?> 
actual)
     {
-        assertSame  ("name",          expected.getName(),         
actual.getName());
-        assertSame  ("description",   expected.getDescription(),  
actual.getDescription());
+        assertEquals("name",          expected.getName(),         
actual.getName());
+        assertEquals("description",   expected.getDescription(),  
actual.getDescription());
         assertEquals("valueClass",    expected.getValueClass(),   
actual.getValueClass());
-        assertSame  ("valueDomain",   expected.getValueDomain(),  
actual.getValueDomain());
         assertEquals("validValues",   expected.getValidValues(),  
actual.getValidValues());
-        assertSame  ("defaultValue",  expected.getDefaultValue(), 
actual.getDefaultValue());
-        assertSame  ("unit",          expected.getUnit(),         
actual.getUnit());
+        assertEquals("unit",          expected.getUnit(),         
actual.getUnit());
         assertEquals("minimumOccurs", DEFAULT_OCCURRENCE,         
actual.getMinimumOccurs());
         assertEquals("maximumOccurs", DEFAULT_OCCURRENCE,         
actual.getMaximumOccurs());
+    }
+
+    /**
+     * Same verification than {@link 
#verifyMethodParameter(ParameterDescriptor, ParameterDescriptor)}, but stricter.
+     *
+     * @param expected A parameter descriptor containing the expected 
properties (except remarks).
+     * @param remarks  The expected remarks, or {@code null} for fetching this 
information from {@code expected}.
+     * @param actual   The parameter descriptor to verify.
+     */
+    private static void verifyMethodParameter(final ParameterDescriptor<?> 
expected,
+            final String remarks, final ParameterDescriptor<?> actual)
+    {
+        verifyMethodParameter(expected, actual);
+        assertSame("name",         expected.getName(),         
actual.getName());
+        assertSame("minimumValue", expected.getMinimumValue(), 
actual.getMinimumValue());
+        assertSame("maximumValue", expected.getMaximumValue(), 
actual.getMaximumValue());
+        assertSame("defaultValue", expected.getDefaultValue(), 
actual.getDefaultValue());
         if (remarks != null) {
             assertEquals("remarks", remarks, actual.getRemarks().toString());
         } else {

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/OperationMarshallingTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/OperationMarshallingTest.java?rev=1700843&r1=1700842&r2=1700843&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/OperationMarshallingTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/OperationMarshallingTest.java
 [UTF-8] Wed Sep  2 15:37:39 2015
@@ -21,18 +21,24 @@ import java.util.HashMap;
 import java.util.Iterator;
 import javax.xml.bind.JAXBException;
 import javax.measure.unit.NonSI;
+import org.opengis.metadata.extent.GeographicBoundingBox;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.parameter.GeneralParameterDescriptor;
+import org.opengis.referencing.operation.OperationMethod;
 import org.apache.sis.parameter.ParameterBuilder;
+import org.apache.sis.internal.referencing.provider.Mercator1SP;
+import org.apache.sis.internal.jaxb.referencing.CC_OperationParameterGroupTest;
 import org.apache.sis.xml.Namespaces;
 import org.apache.sis.xml.XML;
 import org.apache.sis.test.DependsOn;
+import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.XMLTestCase;
 import org.junit.Test;
 
-import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.metadata.iso.citation.Citations.EPSG;
+import static org.apache.sis.test.TestUtilities.getSingleton;
+import static org.apache.sis.test.ReferencingAssert.*;
 
 
 /**
@@ -45,6 +51,7 @@ import static org.apache.sis.metadata.is
  */
 @DependsOn({
     DefaultOperationMethodTest.class,
+    CC_OperationParameterGroupTest.class,
     org.apache.sis.parameter.ParameterMarshallingTest.class
 })
 public final strictfp class OperationMarshallingTest extends XMLTestCase {
@@ -75,24 +82,24 @@ public final strictfp class OperationMar
     @Test
     public void testOperationMethod() throws JAXBException {
         final String xml = XML.marshal(createMercatorMethod());
-        assertXmlEquals("<gml:OperationMethod xmlns:gml=\"" + Namespaces.GML + 
"\">\n"
-                      + "  <gml:name>Mercator (1SP)</gml:name>\n"
-                      + "  <gml:formula>See EPSG guide.</gml:formula>\n"
-                      + "  <gml:sourceDimensions>2</gml:sourceDimensions>\n"
-                      + "  <gml:targetDimensions>2</gml:targetDimensions>\n"
-                      + "  <gml:parameter>\n"
-                      + "    <gml:OperationParameter 
gml:id=\"epsg-parameter-8801\">\n"
-                      + "      <gml:identifier 
codeSpace=\"IOGP\">urn:ogc:def:parameter:EPSG::8801</gml:identifier>\n"
-                      + "      <gml:name codeSpace=\"EPSG\">Latitude of 
natural origin</gml:name>\n"
-                      + "    </gml:OperationParameter>\n"
-                      + "  </gml:parameter>\n"
-                      + "  <gml:parameter>\n"
-                      + "    <gml:OperationParameter 
gml:id=\"epsg-parameter-8802\">\n"
-                      + "      <gml:identifier 
codeSpace=\"IOGP\">urn:ogc:def:parameter:EPSG::8802</gml:identifier>\n"
-                      + "      <gml:name codeSpace=\"EPSG\">Longitude of 
natural origin</gml:name>\n"
-                      + "    </gml:OperationParameter>\n"
-                      + "  </gml:parameter>\n"
-                      + "</gml:OperationMethod>", xml, "xmlns:*");
+        assertXmlEquals("<gml:OperationMethod xmlns:gml=\"" + Namespaces.GML + 
"\">\n" +
+                        "  <gml:name>Mercator (1SP)</gml:name>\n" +
+                        "  <gml:formula>See EPSG guide.</gml:formula>\n" +
+                        "  <gml:sourceDimensions>2</gml:sourceDimensions>\n" +
+                        "  <gml:targetDimensions>2</gml:targetDimensions>\n" +
+                        "  <gml:parameter>\n" +
+                        "    <gml:OperationParameter 
gml:id=\"epsg-parameter-8801\">\n" +
+                        "      <gml:identifier 
codeSpace=\"IOGP\">urn:ogc:def:parameter:EPSG::8801</gml:identifier>\n" +
+                        "      <gml:name codeSpace=\"EPSG\">Latitude of 
natural origin</gml:name>\n" +
+                        "    </gml:OperationParameter>\n" +
+                        "  </gml:parameter>\n" +
+                        "  <gml:parameter>\n" +
+                        "    <gml:OperationParameter 
gml:id=\"epsg-parameter-8802\">\n" +
+                        "      <gml:identifier 
codeSpace=\"IOGP\">urn:ogc:def:parameter:EPSG::8802</gml:identifier>\n" +
+                        "      <gml:name codeSpace=\"EPSG\">Longitude of 
natural origin</gml:name>\n" +
+                        "    </gml:OperationParameter>\n" +
+                        "  </gml:parameter>\n" +
+                        "</gml:OperationMethod>", xml, "xmlns:*");
 
         verifyMethod((DefaultOperationMethod) XML.unmarshal(xml));
     }
@@ -100,7 +107,7 @@ public final strictfp class OperationMar
     /**
      * Verifies the unmarshalled parameter descriptors.
      */
-    private static void verifyMethod(final DefaultOperationMethod method) {
+    private static void verifyMethod(final OperationMethod method) {
         assertIdentifierEquals("name", null, null, null, "Mercator (1SP)", 
method.getName());
         assertEquals("formula", "See EPSG guide.", 
method.getFormula().getFormula().toString());
         assertEquals("sourceDimensions", Integer.valueOf(2), 
method.getSourceDimensions());
@@ -108,21 +115,31 @@ public final strictfp class OperationMar
         final ParameterDescriptorGroup parameters = method.getParameters();
         assertEquals("parameters.name", "Mercator (1SP)", 
parameters.getName().getCode());
         final Iterator<GeneralParameterDescriptor> it = 
parameters.descriptors().iterator();
-        verifyIncompleteDescriptor("Latitude of natural origin",  it.next());
-        verifyIncompleteDescriptor("Longitude of natural origin", it.next());
+        
CC_OperationParameterGroupTest.verifyMethodParameter(Mercator1SP.LATITUDE_OF_ORIGIN,
  (ParameterDescriptor<?>) it.next());
+        
CC_OperationParameterGroupTest.verifyMethodParameter(Mercator1SP.LONGITUDE_OF_ORIGIN,
 (ParameterDescriptor<?>) it.next());
         assertFalse("Unexpected parameter.", it.hasNext());
     }
 
     /**
-     * Verifies that the given parameter descriptor has the expected EPSG 
name. This method does not
-     * verify that {@link ParameterDescriptor#getValueClass()} returns {@code 
Double.class}, because
-     * this information is not known to {@code OperationMethod}.
+     * Tests unmarshalling of a conversion.
      *
-     * @param name       The expected EPSG name.
-     * @param descriptor The parameter descriptor to verify.
+     * @throws JAXBException if an error occurred during marshalling or 
unmarshalling.
      */
-    private static void verifyIncompleteDescriptor(final String name, final 
GeneralParameterDescriptor descriptor) {
-        assertIdentifierEquals("name", "##unrestricted", "EPSG", null, name, 
descriptor.getName());
-        assertEquals("maximumOccurs", 1, descriptor.getMaximumOccurs());
+    @Test
+    @DependsOnMethod("testOperationMethod")
+    public void testConversionUnmarshalling() throws JAXBException {
+        final DefaultConversion c = unmarshalFile(DefaultConversion.class, 
"Conversion.xml");
+        assertEquals("name", "World Mercator", c.getName().getCode());
+        assertEquals("identifier", "3395", 
getSingleton(c.getIdentifiers()).getCode());
+        assertEquals("scope", "Very small scale mapping.", 
String.valueOf(c.getScope()));
+
+        final GeographicBoundingBox e = (GeographicBoundingBox) 
getSingleton(c.getDomainOfValidity().getGeographicElements());
+        assertEquals("eastBoundLongitude", +180, e.getEastBoundLongitude(), 
STRICT);
+        assertEquals("westBoundLongitude", -180, e.getWestBoundLongitude(), 
STRICT);
+        assertEquals("northBoundLatitude",   84, e.getNorthBoundLatitude(), 
STRICT);
+        assertEquals("southBoundLatitude",  -80, e.getSouthBoundLatitude(), 
STRICT);
+
+        // The most difficult part.
+        verifyMethod(c.getMethod());
     }
 }

Added: 
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml?rev=1700843&view=auto
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
 (added)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
 Wed Sep  2 15:37:39 2015
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<gml:Conversion xsi:schemaLocation = "http://www.opengis.net/gml/3.2 
http://schemas.opengis.net/gml/3.2.1/datums.xsd";
+                xmlns:gml          = "http://www.opengis.net/gml/3.2";
+                xmlns:gmd          = "http://www.isotc211.org/2005/gmd";
+                xmlns:gco          = "http://www.isotc211.org/2005/gco";
+                xmlns:xsi          = 
"http://www.w3.org/2001/XMLSchema-instance";
+                xmlns:xlink        = "http://www.w3.org/1999/xlink";
+                gml:id             = "WorldMercator">
+
+  <gml:identifier codeSpace="test">3395</gml:identifier>  <!-- Not the real 
EPSG::3395 -->
+  <gml:name>World Mercator</gml:name>
+  <gml:domainOfValidity>
+    <gmd:EX_Extent>
+      <gmd:geographicElement>
+        <gmd:EX_GeographicBoundingBox>
+          
<gmd:westBoundLongitude><gco:Decimal>-180</gco:Decimal></gmd:westBoundLongitude>
+          
<gmd:eastBoundLongitude><gco:Decimal>+180</gco:Decimal></gmd:eastBoundLongitude>
+          <gmd:southBoundLatitude><gco:Decimal> 
-80</gco:Decimal></gmd:southBoundLatitude>
+          <gmd:northBoundLatitude><gco:Decimal> 
+84</gco:Decimal></gmd:northBoundLatitude>
+        </gmd:EX_GeographicBoundingBox>
+      </gmd:geographicElement>
+    </gmd:EX_Extent>
+  </gml:domainOfValidity>
+  <gml:scope>Very small scale mapping.</gml:scope>
+  <gml:coordinateOperationAccuracy>
+    <gmd:DQ_RelativeInternalPositionalAccuracy>
+      <gmd:result>
+        <gmd:DQ_QuantitativeResult>
+          <gmd:valueUnit>
+            <gml:BaseUnit gml:id="m">
+              <gml:identifier 
codeSpace="IOGP">urn:ogc:def:uom:EPSG::9001</gml:identifier>
+              <gml:name>metre</gml:name>
+              <gml:quantityType>length</gml:quantityType>
+              <gml:unitsSystem xlink:href="http://www.bipm.fr/en/si"/>
+            </gml:BaseUnit>
+          </gmd:valueUnit>
+          <gmd:value>
+            <gco:Record>
+              <gco:Decimal>0</gco:Decimal>
+            </gco:Record>
+          </gmd:value>
+        </gmd:DQ_QuantitativeResult>
+      </gmd:result>
+    </gmd:DQ_RelativeInternalPositionalAccuracy>
+  </gml:coordinateOperationAccuracy>
+  <gml:method>
+    <gml:OperationMethod gml:id="Mercator">
+      <gml:identifier codeSpace="test">19883</gml:identifier>  <!-- Not the 
real EPSG::19883 -->
+      <gml:name>Mercator (1SP)</gml:name>
+      <gml:formula>See EPSG guide.</gml:formula>
+      <gml:sourceDimensions>2</gml:sourceDimensions>
+      <gml:targetDimensions>2</gml:targetDimensions>
+      <gml:parameter>
+        <gml:OperationParameter gml:id="epsg-parameter-8801">
+          <gml:identifier 
codeSpace="IOGP">urn:ogc:def:parameter:EPSG::8801</gml:identifier>
+          <gml:name codeSpace="EPSG">Latitude of natural origin</gml:name>
+        </gml:OperationParameter>
+      </gml:parameter>
+      <gml:parameter>
+        <gml:OperationParameter gml:id="epsg-parameter-8802">
+          <gml:identifier 
codeSpace="IOGP">urn:ogc:def:parameter:EPSG::8802</gml:identifier>
+          <gml:name codeSpace="EPSG">Longitude of natural origin</gml:name>
+        </gml:OperationParameter>
+      </gml:parameter>
+
+      <!-- There is more parameters in a Mercator projection,
+           but two are enough for (un)marshaling test purpose. -->
+
+    </gml:OperationMethod>
+  </gml:method>
+  <gml:parameterValue>
+    <gml:ParameterValue>
+      <gml:value uom="urn:ogc:def:uom:EPSG::9102">0</gml:value>
+
+      <!-- All descriptors below this point are duplication of the descriptors 
already defined above.
+           For now we do not yet use the XML references, but this is something 
that we will need to
+           support in a future SIS version. See 
https://issues.apache.org/jira/browse/SIS-173 issue.
+           In the meantime, we have to change the gml:id attribute values used 
below for avoiding
+           collisions with the gml:id attribute used in above descriptors. -->
+
+      <gml:operationParameter>
+        <gml:OperationParameter gml:id="LatitudeOfNaturalOrigin">
+          <gml:identifier 
codeSpace="IOGP">urn:ogc:def:parameter:EPSG::8801</gml:identifier>
+          <gml:name codeSpace="EPSG">Latitude of natural origin</gml:name>
+          <gml:remarks>This parameter is shown for completeness, but should 
never have a value different than 0 for this projection.</gml:remarks>
+        </gml:OperationParameter>
+      </gml:operationParameter>
+    </gml:ParameterValue>
+  </gml:parameterValue>
+  <gml:parameterValue>
+    <gml:ParameterValue>
+      <gml:value uom="urn:ogc:def:uom:EPSG::9102">0</gml:value>
+      <gml:operationParameter>
+        <gml:OperationParameter gml:id="LongitudeOfNaturalOrigin">
+          <gml:identifier 
codeSpace="IOGP">urn:ogc:def:parameter:EPSG::8802</gml:identifier>
+          <gml:name codeSpace="EPSG">Longitude of natural origin</gml:name>
+        </gml:OperationParameter>
+      </gml:operationParameter>
+    </gml:ParameterValue>
+  </gml:parameterValue>
+
+  <!-- There is more parameters in a Mercator projection,
+       but two are enough for (un)marshaling test purpose. -->
+
+</gml:Conversion>

Propchange: 
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sis/branches/JDK8/core/sis-referencing/src/test/resources/org/apache/sis/referencing/operation/Conversion.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml


Reply via email to