You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2015/08/03 16:35:17 UTC
svn commit: r1693911 [3/3] - in /sis/branches/JDK6: ./
core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/
core/sis-metadata/src/main/java/org/apache/sis/io/wkt/
core/sis-metadata/src/main/java/org/apache/sis/metadata/ core/s...
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -17,6 +17,7 @@
package org.apache.sis.referencing;
import java.util.Map;
+import java.util.HashMap;
import org.opengis.util.NameSpace;
import org.opengis.util.LocalName;
import org.opengis.util.GenericName;
@@ -24,6 +25,7 @@ import org.opengis.util.NameFactory;
import org.opengis.metadata.citation.Citation;
import org.opengis.metadata.Identifier;
import org.apache.sis.internal.simple.SimpleCitation;
+import org.apache.sis.internal.simple.SimpleIdentifier;
import org.apache.sis.internal.system.DefaultFactories;
import org.apache.sis.metadata.iso.ImmutableIdentifier;
import org.apache.sis.metadata.iso.citation.Citations;
@@ -49,6 +51,7 @@ public final strictfp class BuilderTest
* Tests {@link Builder#verifyParameterizedType(Class)}.
*/
@Test
+ @SuppressWarnings("ResultOfObjectAllocationIgnored")
public void testVerifyParameterizedType() {
final class Invalid extends Builder<BuilderMock> {
}
@@ -277,4 +280,36 @@ public final strictfp class BuilderTest
"GeoTIFF:CT_Mercator"
}, builder.getAsStrings(1));
}
+
+ /**
+ * Tests the {@link Builder#Builder(IdentifiedObject)} constructor.
+ *
+ * @since 0.6
+ */
+ @Test
+ public void testCreationFromObject() {
+ final Map<String,Object> properties = new HashMap<String,Object>();
+ final Identifier id = new SimpleIdentifier(null, "An identifier", false);
+ assertNull(properties.put(AbstractIdentifiedObject.IDENTIFIERS_KEY, id));
+ assertNull(properties.put(AbstractIdentifiedObject.ALIAS_KEY, "An alias"));
+ assertNull(properties.put(AbstractIdentifiedObject.NAME_KEY, "Dummy object"));
+ assertNull(properties.put(AbstractIdentifiedObject.REMARKS_KEY, "Some remarks"));
+ final BuilderMock builder = new BuilderMock(new AbstractIdentifiedObject(properties));
+
+ assertEquals("Expected only name and remarks.", 2, builder.properties.size());
+ builder.onCreate(false);
+ assertEquals("Expected name, aliases, identifiers and remarks.", 4, builder.properties.size());
+
+ assertEquals(AbstractIdentifiedObject.NAME_KEY, "Dummy object",
+ builder.properties.get(AbstractIdentifiedObject.NAME_KEY).toString());
+
+ assertEquals(AbstractIdentifiedObject.REMARKS_KEY, "Some remarks",
+ builder.properties.get(AbstractIdentifiedObject.REMARKS_KEY).toString());
+
+ assertEquals(AbstractIdentifiedObject.ALIAS_KEY, "An alias",
+ ((Object[]) builder.properties.get(AbstractIdentifiedObject.ALIAS_KEY))[0].toString());
+
+ assertSame(AbstractIdentifiedObject.IDENTIFIERS_KEY, id,
+ ((Object[]) builder.properties.get(AbstractIdentifiedObject.IDENTIFIERS_KEY))[0]);
+ }
}
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MapProjectionTestCase.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MapProjectionTestCase.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MapProjectionTestCase.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MapProjectionTestCase.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -66,6 +66,9 @@ strictfp class MapProjectionTestCase ext
final Ellipsoid ellipsoid = (ellipse ? GeodeticDatumMock.WGS84 : GeodeticDatumMock.SPHERE).getEllipsoid();
parameters.parameter(Constants.SEMI_MAJOR).setValue(ellipsoid.getSemiMajorAxis());
parameters.parameter(Constants.SEMI_MINOR).setValue(ellipsoid.getSemiMinorAxis());
+ if (ellipse) {
+ parameters.parameter(Constants.INVERSE_FLATTENING).setValue(ellipsoid.getInverseFlattening());
+ }
return parameters;
}
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorTest.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorTest.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorTest.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -65,16 +65,17 @@ public final strictfp class MercatorTest
/**
* Tests the WKT formatting of {@link NormalizedProjection}. For the Mercator projection, we expect only
- * the semi-major and semi-minor axis length. We expect nothing else because all other parameters are used
+ * the ellipsoid excentricity. We expect nothing else because all other parameters are used
* by the (de)normalization affine transforms instead than the {@link Mercator} class itself.
+ *
+ * @see LambertConicConformalTest#testNormalizedWKT()
*/
@Test
public void testNormalizedWKT() {
createNormalizedProjection(true);
assertWktEquals(
- "PARAM_MT[“Mercator_2SP”,\n" +
- " PARAMETER[“semi_major”, 1.0],\n" +
- " PARAMETER[“semi_minor”, 0.9966471893352525]]");
+ "PARAM_MT[“Mercator”,\n" +
+ " PARAMETER[“excentricity”, 0.0818191908426215]]");
}
/**
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -46,7 +46,17 @@ final strictfp class NoOp extends Confor
* @param ellipsoidal {@code true} for an ellipsoidal case, or {@code false} for a spherical case.
*/
NoOp(final boolean ellipsoidal) {
- this(parameters((ellipsoidal ? GeodeticDatumMock.WGS84 : GeodeticDatumMock.SPHERE).getEllipsoid()));
+ this(ellipsoidal, ellipsoidal);
+ }
+
+ /**
+ * Creates a new "no-operation".
+ *
+ * @param ellipsoidal {@code true} for an ellipsoidal case, or {@code false} for a spherical case.
+ * @param declareIvf {@code true} for declaring the inverse flattening factor.
+ */
+ NoOp(final boolean ellipsoidal, final boolean declareIvf) {
+ this(parameters((ellipsoidal ? GeodeticDatumMock.WGS84 : GeodeticDatumMock.SPHERE).getEllipsoid(), declareIvf));
}
/**
@@ -62,10 +72,9 @@ final strictfp class NoOp extends Confor
*/
@Workaround(library="JDK", version="1.7")
private NoOp(final Parameters parameters) {
- super(new DefaultOperationMethod(
+ super(new Initializer(new DefaultOperationMethod(
Collections.singletonMap(DefaultOperationMethod.NAME_KEY, parameters.getDescriptor().getName()),
- 2, 2, parameters.getDescriptor()), parameters,
- Collections.<ParameterRole, ParameterDescriptor<Double>>emptyMap());
+ 2, 2, parameters.getDescriptor()), parameters, Collections.<ParameterRole, ParameterDescriptor<Double>>emptyMap(), (byte) 0));
}
/**
@@ -73,9 +82,14 @@ final strictfp class NoOp extends Confor
* ("Relax constraint on placement of this()/super() call in constructors").
*/
@Workaround(library="JDK", version="1.7")
- private static Parameters parameters(final Ellipsoid ellipsoid) {
- return parameters(ellipsoid.getSemiMajorAxis(),
- ellipsoid.getSemiMinorAxis());
+ private static Parameters parameters(final Ellipsoid ellipsoid, final boolean declareIvf) {
+ final Parameters parameters = parameters(
+ ellipsoid.getSemiMajorAxis(),
+ ellipsoid.getSemiMinorAxis());
+ if (declareIvf) {
+ parameters.parameter(Constants.INVERSE_FLATTENING).setValue(ellipsoid.getInverseFlattening());
+ }
+ return parameters;
}
/**
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NormalizedProjectionTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NormalizedProjectionTest.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NormalizedProjectionTest.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NormalizedProjectionTest.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -68,8 +68,17 @@ public final strictfp class NormalizedPr
NormalizedProjection projection;
transform = projection = new NoOp(false);
assertEquals("excentricity", 0.0, projection.excentricity, 0.0);
+ /*
+ * Tested methods. Note the similarity between (1) and (3).
+ *
+ * (1) Using double arithmetic and axis lengths: 0.08181919084262157
+ * (2) Using double-double arithmetic and axis lengths: 0.08181919084262244
+ * (3) Using double-double arithmetic and flattening: 0.0818191908426215
+ */
+ transform = projection = new NoOp(true, false);
+ assertEquals("excentricity", 0.08181919084262244, projection.excentricity, 0.0);
- transform = projection = new NoOp(true);
- assertEquals("excentricity", 0.08181919084262157, projection.excentricity, TOLERANCE);
+ transform = projection = new NoOp(true, true);
+ assertEquals("excentricity", 0.0818191908426215, projection.excentricity, 0.0);
}
}
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ProjectionResultComparator.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ProjectionResultComparator.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ProjectionResultComparator.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/ProjectionResultComparator.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -19,6 +19,7 @@ package org.apache.sis.referencing.opera
import java.util.Arrays;
import java.util.List;
import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.parameter.ParameterDescriptorGroup;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.Matrix;
import org.apache.sis.internal.referencing.Formulas;
@@ -170,6 +171,15 @@ final strictfp class ProjectionResultCom
}
/**
+ * Delegates to the {@link #tested} implementation.
+ */
+ @Debug
+ @Override
+ public ParameterDescriptorGroup getParameterDescriptors() {
+ return tested.getParameterDescriptors();
+ }
+
+ /**
* Delegates to the {@link #tested} implementation.
*/
@Debug
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformTestCase.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformTestCase.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformTestCase.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformTestCase.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -370,6 +370,20 @@ public abstract strictfp class MathTrans
}
/**
+ * Asserts that the current {@linkplain #transform transform} produces a WKT matching the given regular expression.
+ *
+ * @param expected A regular expression for the expected WKT.
+ *
+ * @see #printInternalWKT()
+ *
+ * @since 0.6
+ */
+ protected final void assertWktEqualsRegex(final String expected) {
+ assertNotNull("The 'transform' field shall be assigned a value.", transform);
+ ReferencingAssert.assertWktEqualsRegex(Convention.WKT1, expected, transform);
+ }
+
+ /**
* Prints the current {@linkplain #transform transform} as normal and internal WKT.
* This method is for debugging purpose only.
*
@@ -377,6 +391,7 @@ public abstract strictfp class MathTrans
*/
@Debug
protected final void printInternalWKT() {
+ @SuppressWarnings("UseOfSystemOutOrSystemErr")
final TableAppender table = new TableAppender(System.out);
table.setMultiLinesCells(true);
table.appendHorizontalSeparator();
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -103,7 +103,7 @@ import org.junit.BeforeClass;
org.apache.sis.referencing.operation.projection.EquirectangularTest.class,
org.apache.sis.referencing.operation.projection.ConformalProjectionTest.class,
org.apache.sis.referencing.operation.projection.MercatorTest.class,
- org.apache.sis.referencing.operation.projection.LambertConformalTest.class,
+ org.apache.sis.referencing.operation.projection.LambertConicConformalTest.class,
org.apache.sis.referencing.operation.projection.TransverseMercatorTest.class,
org.apache.sis.referencing.operation.projection.PolarStereographicTest.class,
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -203,10 +203,10 @@ public class SimpleIdentifiedObject impl
}
if (object instanceof IdentifiedObject) {
if (mode != ComparisonMode.STRICT || object.getClass() == getClass()) {
- final IdentifiedObject that = (IdentifiedObject) object;
- if (mode.ordinal() >= ComparisonMode.IGNORE_METADATA.ordinal()) {
+ if (mode.isIgnoringMetadata()) {
return true;
}
+ final IdentifiedObject that = (IdentifiedObject) object;
return Objects.equals(getName(), that.getName()) &&
isNullOrEmpty(that.getIdentifiers()) &&
isNullOrEmpty(that.getAlias()) &&
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -20,6 +20,7 @@ import java.util.Map;
import java.util.IdentityHashMap;
import java.util.ServiceLoader;
import java.util.ServiceConfigurationError;
+import org.apache.sis.internal.util.Utilities;
/**
@@ -86,8 +87,7 @@ public final class DefaultFactories exte
if (factory == null && !FACTORIES.containsKey(type)) {
T fallback = null;
for (final T candidate : ServiceLoader.load(type)) {
- final Class<?> ct = candidate.getClass();
- if (ct.getName().startsWith("org.apache.sis.")) {
+ if (Utilities.isSIS(candidate.getClass())) {
if (factory != null) {
throw new ServiceConfigurationError("Found two implementations of " + type);
}
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -78,17 +78,34 @@ public final class Constants extends Sta
public static final byte CRS84 = 84;
/**
+ * The NetCDF parameter name for the Earth radius.
+ */
+ public static final String EARTH_RADIUS = "earth_radius";
+
+ /**
* Name of the {@value} projection parameter, which is handled specially during WKT formatting.
*/
public static final String SEMI_MAJOR = "semi_major",
SEMI_MINOR = "semi_minor";
/**
+ * The NetCDF parameter name for inverse flattening, and whether that parameter is definitive.
+ * The later is specific to SIS.
+ */
+ public static final String INVERSE_FLATTENING = "inverse_flattening",
+ IS_IVF_DEFINITIVE = "is_ivf_definitive";
+
+ /**
* The OGC parameter name for the central meridian.
*/
public static final String CENTRAL_MERIDIAN = "central_meridian";
/**
+ * The NetCDF parameter name for the standard parallels.
+ */
+ public static final String STANDARD_PARALLEL = "standard_parallel";
+
+ /**
* The OGC parameter name for the standard parallels.
*/
public static final String STANDARD_PARALLEL_1 = "standard_parallel_1",
@@ -125,6 +142,7 @@ public final class Constants extends Sta
*/
public static final String FALSE_EASTING = "false_easting",
FALSE_NORTHING = "false_northing";
+
/**
* Name of the {@value} matrix parameters.
*/
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -237,6 +237,20 @@ public final class DoubleDouble extends
}
/**
+ * Uses the given value verbatim, without inferring an error term for double-double arithmetic.
+ * We use this method when the value has been computed using transcendental functions (cosine,
+ * logarithm, <i>etc.</i>) in which case there is no way we can infer a meaningful error term.
+ *
+ * <p>We use this method both for readability and for making easier to search where such thing occur.</p>
+ *
+ * @param value The value to wrap in a {@code DoubleDouble} instance.
+ * @return A {@code DoubleDouble} containing exactly the given value, without error term.
+ */
+ public static DoubleDouble verbatim(final double value) {
+ return new DoubleDouble(value, 0);
+ }
+
+ /**
* Returns a new {@code DoubleDouble} instance initialized to the conversion factor
* from radians to angular degrees.
*
@@ -921,6 +935,24 @@ public final class DoubleDouble extends
}
/**
+ * Computes (1-x)/(1+x) where <var>x</var> is {@code this}.
+ * This pattern occurs in map projections.
+ */
+ public void ratio_1m_1p() {
+ final DoubleDouble numerator = new DoubleDouble(1, 0);
+ numerator.subtract(this);
+ add(1, 0);
+ inverseDivide(numerator);
+ }
+
+ /**
+ * Computes the square of this value.
+ */
+ public void square() {
+ multiply(value, error);
+ }
+
+ /**
* Sets this double-double value to its square root.
*
* <div class="section">Implementation</div>
@@ -943,13 +975,41 @@ public final class DoubleDouble extends
* <blockquote>ε ≈ (value + error - r²) / (2r)</blockquote>
*/
public void sqrt() {
- final double thisValue = this.value;
- final double thisError = this.error;
- double r = Math.sqrt(thisValue);
- setToProduct(r, r);
- subtract(thisValue, thisError);
- divide(-2*r, 0); // Multiplication by 2 does not cause any precision lost.
- setToQuickSum(r, value);
+ if (value != 0) {
+ final double thisValue = this.value;
+ final double thisError = this.error;
+ double r = Math.sqrt(thisValue);
+ setToProduct(r, r);
+ subtract(thisValue, thisError);
+ divide(-2*r, 0); // Multiplication by 2 does not cause any precision lost.
+ setToQuickSum(r, value);
+ }
+ }
+
+ /**
+ * Computes c₀ + c₁x + c₂x² + c₃x³ + c₄x⁴ + … where <var>x</var> is {@code this}.
+ * The given <var>c</var> coefficients are presumed accurate in base 2
+ * (i.e. this method does not try to apply a correction for base 10).
+ *
+ * @param coefficients The {@code c} coefficients. The array length must be at least 1.
+ */
+ public void series(final double... coefficients) {
+ final DoubleDouble x = new DoubleDouble(this);
+ value = coefficients[0];
+ error = 0;
+ final int last = coefficients.length - 1;
+ if (last >= 1) {
+ final DoubleDouble xn = new DoubleDouble(x);
+ final DoubleDouble t = new DoubleDouble(xn);
+ for (int i=1; i<last; i++) {
+ t.multiply(coefficients[i], 0);
+ add(t);
+ xn.multiply(x);
+ t.setFrom(xn);
+ }
+ t.multiply(coefficients[last], 0);
+ add(t);
+ }
}
/**
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -18,6 +18,7 @@ package org.apache.sis.internal.util;
import java.util.Map;
import java.util.HashMap;
+import org.apache.sis.util.Debug;
import org.apache.sis.util.Static;
import org.apache.sis.util.ComparisonMode;
@@ -30,7 +31,7 @@ import static java.lang.Math.abs;
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.4
+ * @version 0.6
* @module
*/
public final class Numerics extends Static {
@@ -58,9 +59,9 @@ public final class Numerics extends Stat
* Helper method for the construction of the {@link #CACHE} map.
*/
private static void cache(final double value) {
- Double key;
- key = Double.valueOf( value); CACHE.put(key, key);
- key = Double.valueOf(-value); CACHE.put(key, key);
+ Double boxed;
+ boxed = value; CACHE.put(boxed, boxed);
+ boxed = -value; CACHE.put(boxed, boxed);
}
/**
@@ -146,9 +147,9 @@ public final class Numerics extends Stat
* @return The given value as a {@code Double}.
*/
public static Double valueOf(final double value) {
- final Double n = Double.valueOf(value);
- final Object candidate = CACHE.get(value);
- return (candidate != null) ? (Double) candidate : n;
+ final Double boxed = value;
+ final Object candidate = CACHE.get(boxed);
+ return (candidate != null) ? (Double) candidate : boxed;
}
/**
@@ -188,14 +189,14 @@ public final class Numerics extends Stat
* Returns {@code true} if the given floats are equals. Positive and negative zero are
* considered different, while a NaN value is considered equal to all other NaN values.
*
- * @param o1 The first value to compare.
- * @param o2 The second value to compare.
+ * @param v1 The first value to compare.
+ * @param v2 The second value to compare.
* @return {@code true} if both values are equal.
*
* @see Float#equals(Object)
*/
- public static boolean equals(final float o1, final float o2) {
- return Float.floatToIntBits(o1) == Float.floatToIntBits(o2);
+ public static boolean equals(final float v1, final float v2) {
+ return Float.floatToIntBits(v1) == Float.floatToIntBits(v2);
}
/**
@@ -203,78 +204,86 @@ public final class Numerics extends Stat
* Positive and negative zeros are considered different.
* NaN values are considered equal to all other NaN values.
*
- * @param o1 The first value to compare.
- * @param o2 The second value to compare.
+ * @param v1 The first value to compare.
+ * @param v2 The second value to compare.
* @return {@code true} if both values are equal.
*
* @see Double#equals(Object)
*/
- public static boolean equals(final double o1, final double o2) {
- return Double.doubleToLongBits(o1) == Double.doubleToLongBits(o2);
+ public static boolean equals(final double v1, final double v2) {
+ return Double.doubleToLongBits(v1) == Double.doubleToLongBits(v2);
}
/**
* Returns {@code true} if the given doubles are equal, ignoring the sign of zero values.
* NaN values are considered equal to all other NaN values.
*
- * @param o1 The first value to compare.
- * @param o2 The second value to compare.
+ * @param v1 The first value to compare.
+ * @param v2 The second value to compare.
* @return {@code true} if both values are equal.
*/
- public static boolean equalsIgnoreZeroSign(final double o1, final double o2) {
- return (o1 == o2) || Double.doubleToLongBits(o1) == Double.doubleToLongBits(o2);
+ public static boolean equalsIgnoreZeroSign(final double v1, final double v2) {
+ return (v1 == v2) || Double.doubleToLongBits(v1) == Double.doubleToLongBits(v2);
}
/**
- * Returns {@code true} if the given values are approximatively equal,
- * up to the {@linkplain #COMPARISON_THRESHOLD comparison threshold}.
+ * Returns {@code true} if the given values are approximatively equal, up to the given comparison threshold.
*
* @param v1 The first value to compare.
* @param v2 The second value to compare.
- * @return {@code true} If both values are approximatively equal.
+ * @param threshold The comparison threshold.
+ * @return {@code true} if both values are approximatively equal.
*/
- public static boolean epsilonEqual(final double v1, final double v2) {
- final double threshold = COMPARISON_THRESHOLD * max(abs(v1), abs(v2));
- if (threshold == Double.POSITIVE_INFINITY || Double.isNaN(threshold)) {
- return Double.doubleToLongBits(v1) == Double.doubleToLongBits(v2);
- }
- return abs(v1 - v2) <= threshold;
+ public static boolean epsilonEqual(final double v1, final double v2, final double threshold) {
+ return (abs(v1 - v2) <= threshold) || equals(v1, v2);
}
/**
* Returns {@code true} if the given values are approximatively equal given the comparison mode.
+ * In mode {@code APPROXIMATIVE} or {@code DEBUG}, this method will compute a relative comparison
+ * threshold from the {@link #COMPARISON_THRESHOLD} constant.
*
- * @param v1 The first value to compare.
- * @param v2 The second value to compare.
+ * <p>This method does not thrown {@link AssertionError} in {@link ComparisonMode#DEBUG}.
+ * It is caller responsibility to handle the {@code DEBUG} case.</p>
+ *
+ * @param v1 The first value to compare.
+ * @param v2 The second value to compare.
* @param mode The comparison mode to use for comparing the numbers.
- * @return {@code true} If both values are approximatively equal.
+ * @return {@code true} if both values are considered equal for the given comparison mode.
*/
public static boolean epsilonEqual(final double v1, final double v2, final ComparisonMode mode) {
- switch (mode) {
- default: return equals(v1, v2);
- case APPROXIMATIVE: return epsilonEqual(v1, v2);
- case DEBUG: {
- final boolean equal = epsilonEqual(v1, v2);
- assert equal : "v1=" + v1 + " v2=" + v2 + " Δv=" + abs(v1-v2);
- return equal;
+ if (mode.isApproximative()) {
+ final double mg = max(abs(v1), abs(v2));
+ if (mg != Double.POSITIVE_INFINITY) {
+ return epsilonEqual(v1, v2, COMPARISON_THRESHOLD * mg);
}
}
+ return equals(v1, v2);
}
/**
- * Returns {@code true} if the following objects are floating point numbers ({@link Float} or
- * {@link Double} types) and approximatively equal. If the given object are not floating point
- * numbers, then this method returns {@code false} unconditionally on the assumption that
- * strict equality has already been checked before this method call.
+ * Creates a messages to put in {@link AssertionError} when two values differ in an unexpected way.
+ * This is a helper method for debugging purpose only, typically used with {@code assert} statements.
*
- * @param v1 The first value to compare.
- * @param v2 The second value to compare.
- * @return {@code true} If both values are real number and approximatively equal.
+ * @param name The name of the property which differ, or {@code null} if unknown.
+ * @param v1 The first value.
+ * @param v2 The second value.
+ * @return The message to put in {@code AssertionError}.
+ *
+ * @since 0.6
*/
- public static boolean floatEpsilonEqual(final Object v1, final Object v2) {
- return (v1 instanceof Float || v1 instanceof Double) &&
- (v2 instanceof Float || v2 instanceof Double) &&
- epsilonEqual(((Number) v1).doubleValue(), ((Number) v2).doubleValue());
+ @Debug
+ public static String messageForDifference(final String name, final double v1, final double v2) {
+ final StringBuilder builder = new StringBuilder();
+ if (name != null) {
+ builder.append(name).append(": ");
+ }
+ builder.append("values ").append(v1).append(" and ").append(v2).append(" differ");
+ final float delta = (float) abs(v1 - v2);
+ if (delta < Float.POSITIVE_INFINITY) {
+ builder.append(" by ").append(delta);
+ }
+ return builder.toString();
}
/**
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Utilities.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Utilities.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Utilities.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Utilities.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -39,6 +39,16 @@ public final class Utilities extends Sta
}
/**
+ * Returns {@code true} if the given class is an Apache SIS class.
+ *
+ * @param type The class to verify.
+ * @return {@code true} if the given class is an Apache SIS class.
+ */
+ public static boolean isSIS(final Class<?> type) {
+ return type.getName().startsWith("org.apache.sis.");
+ }
+
+ /**
* Appends to the given buffer only the characters that are valid for a Unicode identifier.
* The given separator character is append before the given {@code text} only if the buffer
* is not empty and at least one {@code text} character is valid.
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -41,7 +41,7 @@ package org.apache.sis.util;
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.3
+ * @version 0.6
* @module
*
* @see LenientComparable#equals(Object, ComparisonMode)
@@ -152,6 +152,32 @@ public enum ComparisonMode {
DEBUG;
/**
+ * Returns {@code true} if this comparison ignores metadata.
+ * This method currently returns {@code true} for {@code IGNORE_METADATA}, {@code APPROXIMATIVE}
+ * or {@code DEBUG} only, but this list may be extended in future SIS versions.
+ *
+ * @return Whether this comparison ignore metadata.
+ *
+ * @since 0.6
+ */
+ public boolean isIgnoringMetadata() {
+ return ordinal() >= IGNORE_METADATA.ordinal();
+ }
+
+ /**
+ * Returns {@code true} if this comparison uses a tolerance threshold.
+ * This method currently returns {@code true} for {@code APPROXIMATIVE} or {@code DEBUG} only,
+ * but this list may be extended in future SIS versions.
+ *
+ * @return Whether this comparison uses a tolerance threshold.
+ *
+ * @since 0.6
+ */
+ public boolean isApproximative() {
+ return ordinal() >= APPROXIMATIVE.ordinal();
+ }
+
+ /**
* If the two given objects are equals according one of the modes enumerated in this class,
* then returns that mode. Otherwise returns {@code null}. This method is used mostly for
* diagnostic purpose.
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/Numbers.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/Numbers.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/Numbers.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/Numbers.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -43,6 +43,10 @@ import static java.lang.Double.doubleToL
*
* @see org.apache.sis.math.MathFunctions
*/
+@SuppressWarnings({
+ "UnnecessaryBoxing",
+ "ResultOfObjectAllocationIgnored"
+})
public final class Numbers extends Static {
/**
* Constant of value {@value} used in {@code switch} statements or as index in arrays.
@@ -88,6 +92,7 @@ public final class Numbers extends Stati
/**
* Creates an entry for a type which is not a primitive type.
*/
+ @SuppressWarnings("ThisEscapedInObjectConstruction")
private Numbers(final Class<?> type, final boolean isFloat, final boolean isInteger, final byte ordinal) {
primitive = wrapper = type;
this.isFloat = isFloat;
@@ -104,6 +109,7 @@ public final class Numbers extends Stati
/**
* Creates a mapping between a primitive type and its wrapper.
*/
+ @SuppressWarnings("ThisEscapedInObjectConstruction")
private Numbers(final Class<?> primitive, final Class<?> wrapper,
final boolean isFloat, final boolean isInteger,
final byte size, final byte ordinal,
Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -179,7 +179,7 @@ final class NilObjectHandler implements
if (other == proxy) return true;
if (other == null) return false;
if (proxy.getClass() == other.getClass()) {
- if (mode.ordinal() >= ComparisonMode.IGNORE_METADATA.ordinal()) {
+ if (mode.isIgnoringMetadata()) {
return true;
}
final NilObjectHandler h = (NilObjectHandler) Proxy.getInvocationHandler(other);
Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/DoubleDoubleTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/DoubleDoubleTest.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/DoubleDoubleTest.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/DoubleDoubleTest.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -250,6 +250,17 @@ public final strictfp class DoubleDouble
}
/**
+ * Tests {@link DoubleDouble#ratio_1m_1p()}.
+ */
+ @Test
+ @DependsOnMethod("testDivide")
+ public void testRatio_1m_1p() {
+ final DoubleDouble t = new DoubleDouble(0.25, 0);
+ t.ratio_1m_1p();
+ assertEquals((1 - 0.25) / (1 + 0.25), t.doubleValue(), STRICT);
+ }
+
+ /**
* Tests {@link DoubleDouble#sqrt()} first with the square root of 2, then with random values.
* In the {@code sqrt(2)} case:
*
@@ -278,11 +289,25 @@ public final strictfp class DoubleDouble
}
final double value = dd.value;
final double error = dd.error;
- dd.multiply(dd);
+ dd.square();
dd.sqrt();
dd.subtract(value, error);
assertEquals(0, dd.doubleValue(), 1E-29);
}
+ dd.clear();
+ dd.sqrt();
+ assertTrue(dd.isZero());
+ }
+
+ /**
+ * Tests the {@link DoubleDouble#series(double...)} method.
+ */
+ @Test
+ @DependsOnMethod({"testMultiply", "testAdd"})
+ public void testSeries() {
+ final DoubleDouble t = new DoubleDouble(2);
+ t.series(1, 1./3, 1./9, 1./7, 1./13); // Random coefficient.
+ assertEquals(1 + 2./3 + 4./9 + 8./7 + 16./13, t.doubleValue(), STRICT);
}
/**
Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -20,6 +20,7 @@ import java.util.Random;
import org.apache.sis.math.MathFunctions;
import org.apache.sis.test.TestUtilities;
import org.apache.sis.test.TestCase;
+import org.apache.sis.util.ComparisonMode;
import org.junit.Test;
import static java.lang.Double.NaN;
@@ -34,9 +35,10 @@ import static org.junit.Assert.*;
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.4
+ * @version 0.6
* @module
*/
+@SuppressWarnings("UnnecessaryBoxing")
public final strictfp class NumericsTest extends TestCase {
/**
* Tests the {@link Numerics#cached(Object)} method.
@@ -67,20 +69,20 @@ public final strictfp class NumericsTest
}
/**
- * Tests the {@link Numerics#epsilonEqual(double, double)} method.
+ * Tests the {@link Numerics#epsilonEqual(double, double, ComparisonMode)} method.
*/
@Test
public void testEpsilonEqual() {
- assertTrue (epsilonEqual(POSITIVE_INFINITY, POSITIVE_INFINITY));
- assertTrue (epsilonEqual(NEGATIVE_INFINITY, NEGATIVE_INFINITY));
- assertFalse(epsilonEqual(POSITIVE_INFINITY, NEGATIVE_INFINITY));
- assertFalse(epsilonEqual(POSITIVE_INFINITY, NaN));
- assertTrue (epsilonEqual(NaN, NaN));
- assertFalse(epsilonEqual( 0, COMPARISON_THRESHOLD / 2));
- assertTrue (epsilonEqual( 1, 1 + COMPARISON_THRESHOLD / 2));
- assertFalse(epsilonEqual( 1, 1 + COMPARISON_THRESHOLD * 2));
- assertTrue (epsilonEqual(-100, -100 + COMPARISON_THRESHOLD * 50));
- assertFalse(epsilonEqual( 100, 100 + COMPARISON_THRESHOLD * 150));
+ assertTrue (epsilonEqual(POSITIVE_INFINITY, POSITIVE_INFINITY, ComparisonMode.APPROXIMATIVE));
+ assertTrue (epsilonEqual(NEGATIVE_INFINITY, NEGATIVE_INFINITY, ComparisonMode.APPROXIMATIVE));
+ assertFalse(epsilonEqual(POSITIVE_INFINITY, NEGATIVE_INFINITY, ComparisonMode.APPROXIMATIVE));
+ assertFalse(epsilonEqual(POSITIVE_INFINITY, NaN, ComparisonMode.APPROXIMATIVE));
+ assertTrue (epsilonEqual(NaN, NaN, ComparisonMode.APPROXIMATIVE));
+ assertFalse(epsilonEqual( 0, COMPARISON_THRESHOLD / 2, ComparisonMode.APPROXIMATIVE));
+ assertTrue (epsilonEqual( 1, 1 + COMPARISON_THRESHOLD / 2, ComparisonMode.APPROXIMATIVE));
+ assertFalse(epsilonEqual( 1, 1 + COMPARISON_THRESHOLD * 2, ComparisonMode.APPROXIMATIVE));
+ assertTrue (epsilonEqual(-100, -100 + COMPARISON_THRESHOLD * 50, ComparisonMode.APPROXIMATIVE));
+ assertFalse(epsilonEqual( 100, 100 + COMPARISON_THRESHOLD * 150, ComparisonMode.APPROXIMATIVE));
}
/**
Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestCase.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestCase.java?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestCase.java [UTF-8] (original)
+++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestCase.java [UTF-8] Mon Aug 3 14:35:16 2015
@@ -24,7 +24,6 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
-import org.apache.sis.internal.system.Modules;
import org.apache.sis.util.logging.Logging;
import org.junit.runner.RunWith;
@@ -182,6 +181,7 @@ public abstract strictfp class TestCase
*
* @param success {@code true} if this method is invoked on build success,
*/
+ @SuppressWarnings("UseOfSystemOutOrSystemErr")
static void flushOutput() {
System.out.flush();
System.err.flush();
Modified: sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties?rev=1693911&r1=1693910&r2=1693911&view=diff
==============================================================================
--- sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties [ISO-8859-1] (original)
+++ sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties [ISO-8859-1] Mon Aug 3 14:35:16 2015
@@ -80,7 +80,7 @@ project.GeoAPI = ../../../../GeoAP
unit-api.version = 0.6.1
jsr275.version = 0.9.3
jama.version = 1.0.3
-geometry.version = 1.1.1
+geometry.version = 1.2
georss.version = 0.9.8
rome.version = 0.9
jdom1.version = 1.0