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 2016/06/30 10:49:56 UTC
svn commit: r1750767 - in /sis/trunk: ./
application/sis-openoffice/src/main/java/org/apache/sis/openoffice/
core/sis-referencing/src/main/java/org/apache/sis/geometry/
core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/
core/si...
Author: desruisseaux
Date: Thu Jun 30 10:49:56 2016
New Revision: 1750767
URL: http://svn.apache.org/viewvc?rev=1750767&view=rev
Log:
Merge from the JDK6 branch.
Added:
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Shapes2D.java
- copied unchanged from r1750766, sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/geometry/Shapes2D.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/Shapes2DTest.java
- copied unchanged from r1750766, sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/Shapes2DTest.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/TransformTestCase.java
- copied unchanged from r1750766, sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/TransformTestCase.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformWrapper.java
- copied unchanged from r1750766, sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformWrapper.java
Modified:
sis/trunk/ (props changed)
sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/CalcAddins.java
sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/ReferencingFunctions.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/ShapeUtilities.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/TableInfo.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/TransverseMercatorTest.java
sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/XMLInputFactory.java
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java
sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java
sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
Propchange: sis/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 30 10:49:56 2016
@@ -1,4 +1,4 @@
/sis/branches/Android:1430670-1480699
-/sis/branches/JDK6:1394364-1748701
-/sis/branches/JDK7:1394913-1748694
-/sis/branches/JDK8:1584960-1748692
+/sis/branches/JDK6:1394364-1750766
+/sis/branches/JDK7:1394913-1750764
+/sis/branches/JDK8:1584960-1750763
Modified: sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/CalcAddins.java
URL: http://svn.apache.org/viewvc/sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/CalcAddins.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/CalcAddins.java [UTF-8] (original)
+++ sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/CalcAddins.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -16,7 +16,6 @@
*/
package org.apache.sis.openoffice;
-import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.LogRecord;
@@ -185,24 +184,6 @@ public abstract class CalcAddins extends
}
/**
- * Returns a table filled with {@link Double#NaN} values.
- * This method is invoked when an operation failed for a whole table.
- *
- * @param rows the number of rows.
- * @param cols the number of columns.
- * @return A table of the given size filled with NaN values.
- */
- static double[][] getFailure(final int rows, final int cols) {
- final double[][] dummy = new double[rows][];
- for (int i=0; i<rows; i++) {
- final double[] row = new double[cols];
- Arrays.fill(row, Double.NaN);
- dummy[i] = row;
- }
- return dummy;
- }
-
- /**
* Reports an exception. This is used if an exception occurred in a method that can not return
* a {@link String} instance. This method logs the stack trace at {@link Level#WARNING}.
*
Modified: sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/ReferencingFunctions.java
URL: http://svn.apache.org/viewvc/sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/ReferencingFunctions.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/ReferencingFunctions.java [UTF-8] (original)
+++ sis/trunk/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/ReferencingFunctions.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -280,7 +280,7 @@ public class ReferencingFunctions extend
}
}
if (area == null) {
- return getFailure(2,2);
+ return new double[][] {};
}
return new double[][] {
new double[] {area.getNorthBoundLatitude(), area.getWestBoundLongitude()},
@@ -366,7 +366,7 @@ public class ReferencingFunctions extend
result = tr.transform(points);
warning = tr.warning;
} catch (Exception exception) {
- result = getFailure(points.length, 2);
+ result = new double[][] {};
warning = exception;
}
if (warning != null) {
@@ -385,14 +385,12 @@ public class ReferencingFunctions extend
*/
@Override
public double[][] transformEnvelope(String sourceCRS, String targetCRS, double[][] envelope) {
- if (envelope == null || envelope.length == 0) {
- return new double[][] {};
- } else try {
+ if (envelope != null && envelope.length != 0) try {
return new Transformer(this, getCRS(sourceCRS), targetCRS, envelope).transformEnvelope(envelope);
} catch (Exception exception) {
reportException("transformEnvelope", exception);
- return getFailure(envelope.length, 2);
}
+ return new double[][] {};
}
/**
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -43,7 +43,7 @@ import org.apache.sis.internal.jdk7.Obje
/**
- * Base class for {@link DirectPosition} implementations.
+ * Default implementations of some {@code DirectPosition} methods, leaving the data storage to subclasses.
* A direct position holds the coordinates for a position within some
* {@linkplain org.apache.sis.referencing.crs.AbstractCRS coordinate reference system}.
* This base class provides default implementations for {@link #toString()},
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -51,7 +51,7 @@ import org.apache.sis.internal.jdk7.Obje
/**
- * Base class for {@link Envelope} implementations.
+ * Default implementations of most {@code Envelope} methods, leaving the data storage to subclasses.
* This base class does not hold any state and does not implement the {@link java.io.Serializable}
* or {@link Cloneable} interfaces. The internal representation, and the choice to be cloneable or
* serializable, is left to subclasses.
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -33,7 +33,7 @@ import org.apache.sis.internal.jdk7.Obje
/**
- * A two-dimensional position on top of {@link Point2D}.
+ * A two-dimensional position on top of Java2D point.
* This implementation is provided for inter-operability between Java2D and GeoAPI.
*
* <p>This class inherits {@linkplain #x x} and {@linkplain #y y} fields.
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -53,7 +53,7 @@ import org.apache.sis.internal.jdk7.Obje
/**
- * A two-dimensional envelope on top of {@link Rectangle2D}.
+ * A two-dimensional envelope on top of Java2D rectangle.
* This implementation is provided for inter-operability between Java2D and GeoAPI.
*
* <p>This class inherits {@linkplain #x x} and {@linkplain #y y} fields.
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -103,7 +103,7 @@ public final class Envelopes extends Sta
/**
* Returns {@code true} if the given axis is of kind "Wrap Around".
*/
- private static boolean isWrapAround(final CoordinateSystemAxis axis) {
+ static boolean isWrapAround(final CoordinateSystemAxis axis) {
return RangeMeaning.WRAPAROUND.equals(axis.getRangeMeaning());
}
@@ -111,8 +111,8 @@ public final class Envelopes extends Sta
* Invoked when a recoverable exception occurred. Those exceptions must be minor enough
* that they can be silently ignored in most cases.
*/
- private static void recoverableException(final TransformException exception) {
- Logging.recoverableException(Logging.getLogger(Loggers.GEOMETRY), Envelopes.class, "transform", exception);
+ static void recoverableException(final Class<? extends Static> caller, final TransformException exception) {
+ Logging.recoverableException(Logging.getLogger(Loggers.GEOMETRY), caller, "transform", exception);
}
/**
@@ -129,7 +129,7 @@ public final class Envelopes extends Sta
* @throws TransformException If the point can not be transformed
* or if a problem occurred while calculating the derivative.
*/
- private static Matrix derivativeAndTransform(final MathTransform transform, final double[] srcPts,
+ static Matrix derivativeAndTransform(final MathTransform transform, final double[] srcPts,
final double[] dstPts, final int dstOff, final boolean derivate) throws TransformException
{
if (transform instanceof AbstractMathTransform) {
@@ -296,7 +296,7 @@ public final class Envelopes extends Sta
}
isDerivativeSupported = false;
transform.transform(sourcePt, 0, ordinates, offset, 1);
- recoverableException(e); // Log only if the above call was successful.
+ recoverableException(Envelopes.class, e); // Log only if the above call was successful.
}
/*
* The transformed point has been saved for future reuse after the enclosing
@@ -554,7 +554,7 @@ public final class Envelopes extends Sta
* step. That ordinate is set to the minimal and maximal values of that axis.
*
* Example: If the above steps found that the point (90�S, 30�W) need to be included,
- * then this step #3 will also test phe points (90�S, 180�W) and (90�S, 180�E).
+ * then this step #3 will also test the points (90�S, 180�W) and (90�S, 180�E).
*
* NOTE: we test (-180�, centerY), (180�, centerY), (centerX, -90�) and (centerX, 90�)
* at step #1 before to test (-180�, -90�), (180�, -90�), (-180�, 90�) and (180�, 90�)
@@ -604,7 +604,7 @@ public final class Envelopes extends Sta
* lost dimensions. So we don't log any warning in this case.
*/
if (dimension >= mt.getSourceDimensions()) {
- recoverableException(exception);
+ recoverableException(Envelopes.class, exception);
}
return transformed;
}
@@ -720,7 +720,7 @@ public final class Envelopes extends Sta
}
}
if (warning != null) {
- recoverableException(warning);
+ recoverableException(Envelopes.class, warning);
}
return transformed;
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -45,6 +45,12 @@
* </tr>
* </table>
*
+ * <div class="section">Java2D dependency</div>
+ * All classes having a name that ends with "2D" are designed for inter-operability with Java2D.
+ * All other classes have no dependency to Java2D.
+ * This clear separation aims to make easier to use Apache SIS on platforms that do not support Java2D
+ * (for example Android) or to avoid loading Java2D classes when only JavaFX is desired.
+ *
* <div class="section">Envelopes spanning the anti-meridian of a Geographic CRS</div>
* The Web Coverage Service (WCS) 1.1 specification uses an extended interpretation
* of the bounding box definition. In a WCS 1.1 data structure, the
@@ -77,7 +83,7 @@
*
* @author Martin Desruisseaux (IRD, Geomatys)
* @since 0.3
- * @version 0.3
+ * @version 0.8
* @module
*/
package org.apache.sis.geometry;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/ShapeUtilities.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/ShapeUtilities.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/ShapeUtilities.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/j2d/ShapeUtilities.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -63,9 +63,7 @@ public final class ShapeUtilities extend
* @param by2 <var>y</var> value of the last point on the second line.
* @return The intersection point, or {@code null} if none.
*
- * @todo This method is used by Geotk (a sandbox for code that may migrate to SIS), but not yet by SIS.
- * We temporarily keep this code here, but may delete or move it elsewhere in a future SIS version
- * depending whether we port to SIS the sandbox code.
+ * @see org.apache.sis.geometry.Shapes2D#intersectionPoint(Line2D, Line2D)
*/
public static Point2D.Double intersectionPoint(final double ax1, final double ay1, double ax2, double ay2,
final double bx1, final double by1, double bx2, double by2)
@@ -118,9 +116,7 @@ public final class ShapeUtilities extend
*
* @see #colinearPoint(double,double , double,double , double,double , double)
*
- * @todo This method is used by Geotk (a sandbox for code that may migrate to SIS), but not yet by SIS.
- * We temporarily keep this code here, but may delete or move it elsewhere in a future SIS version
- * depending whether we port to SIS the sandbox code.
+ * @see org.apache.sis.geometry.Shapes2D#nearestColinearPoint(Line2D, Point2D)
*/
public static Point2D.Double nearestColinearPoint(final double x1, final double y1,
final double x2, final double y2,
@@ -179,9 +175,7 @@ public final class ShapeUtilities extend
*
* @see #nearestColinearPoint(double,double , double,double , double,double)
*
- * @todo This method is used by Geotk (a sandbox for code that may migrate to SIS), but not yet by SIS.
- * We temporarily keep this code here, but may delete or move it elsewhere in a future SIS version
- * depending whether we port to SIS the sandbox code.
+ * @see org.apache.sis.geometry.Shapes2D#colinearPoint(Line2D, Point2D, double)
*/
public static Point2D.Double colinearPoint(double x1, double y1, double x2, double y2,
double x, double y, double distance)
@@ -323,10 +317,10 @@ public final class ShapeUtilities extend
x2 -= x1;
y2 -= y1;
if (horizontal) {
- final double a = (y2 - py*x2/px) / (x2-px); // Actually "a*x2"
+ final double a = (y2 - py*x2/px) / (x2-px); // Actually "a*x2"
final double check = abs(a);
- if (!(check <= 1/EPS)) return null; // Two points have the same coordinates.
- if (!(check >= EPS)) return null; // The three points are co-linear.
+ if (!(check <= 1/EPS)) return null; // Two points have the same coordinates.
+ if (!(check >= EPS)) return null; // The three points are co-linear.
final double b = y2/x2 - a;
px = (1 + b/(2*a))*x2 - y2/(2*a);
py = y1 + b*px;
@@ -339,18 +333,18 @@ public final class ShapeUtilities extend
final double rx2 = x2;
final double ry2 = y2;
x2 = hypot(x2,y2);
- y2 = (px*rx2 + py*ry2) / x2; // use 'y2' as a temporary variable for 'x1'
+ y2 = (px*rx2 + py*ry2) / x2; // use 'y2' as a temporary variable for 'x1'
py = (py*rx2 - px*ry2) / x2;
px = y2;
- y2 = 0; // set as a matter of principle (but not used).
+ y2 = 0; // set as a matter of principle (but not used).
/*
* Now compute the control point coordinates in our new coordinate system axis.
*/
- final double x = 0.5; // Actually "x/x2"
- final double y = (py*x*x2) / (px*(x2-px)); // Actually "y/y2"
+ final double x = 0.5; // Actually "x/x2"
+ final double y = (py*x*x2) / (px*(x2-px)); // Actually "y/y2"
final double check = abs(y);
- if (!(check <= 1/EPS)) return null; // Two points have the same coordinates.
- if (!(check >= EPS)) return null; // The three points are co-linear.
+ if (!(check <= 1/EPS)) return null; // Two points have the same coordinates.
+ if (!(check >= EPS)) return null; // The three points are co-linear.
/*
* Applies the inverse rotation then a translation to bring
* us back to the original coordinate system.
@@ -362,7 +356,7 @@ public final class ShapeUtilities extend
}
/**
- * Returns a circle passing by the 3 given points. The distance between the returned
+ * Returns the center of a circle passing by the 3 given points. The distance between the returned
* point and any of the given points will be constant; it is the circle radius.
*
* @param x1 <var>x</var> value of the first point.
@@ -371,11 +365,9 @@ public final class ShapeUtilities extend
* @param y2 <var>y</var> value of the second point.
* @param x3 <var>x</var> value of the third point.
* @param y3 <var>y</var> value of the third point.
- * @return A circle passing by the given points.
+ * @return The center of a circle passing by the given points.
*
- * @todo This method is used by Geotk (a sandbox for code that may migrate to SIS), but not yet by SIS.
- * We temporarily keep this code here, but may delete or move it elsewhere in a future SIS version
- * depending whether we port to SIS the sandbox code.
+ * @see org.apache.sis.geometry.Shapes2D#circle(Point2D, Point2D, Point2D)
*/
public static Point2D.Double circleCentre(double x1, double y1,
double x2, double y2,
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/AuthorityCodes.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/AuthorityCodes.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/AuthorityCodes.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -148,8 +148,8 @@ final class AuthorityCodes extends Abstr
for (int i=0; i<table.subTypes.length; i++) {
final Class<?> candidate = table.subTypes[i];
if (candidate.isAssignableFrom(type)) {
- buffer.append(" WHERE (").append(table.typeColumn)
- .append(" LIKE '").append(table.typeNames[i]).append("%')");
+ buffer.append(" WHERE (CAST(").append(table.typeColumn).append(" AS ").append(TableInfo.ENUM_REPLACEMENT)
+ .append(") LIKE '").append(table.typeNames[i]).append("%')");
hasWhere = true;
tableType = candidate;
break;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -3328,7 +3328,7 @@ next: while (r.next()) {
"SELECT COORD_REF_SYS_CODE" +
" FROM [Coordinate Reference System]" +
" WHERE PROJECTION_CONV_CODE = ?" +
- " AND COORD_REF_SYS_KIND LIKE 'projected%'", code);
+ " AND CAST(COORD_REF_SYS_KIND AS " + TableInfo.ENUM_REPLACEMENT + ") LIKE 'projected%'", code);
try {
projection = result.next();
} finally {
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -162,9 +162,9 @@ final class EPSGInstaller extends Script
prependNamespace(schema);
}
if (!isEnumTypeSupported) {
- addReplacement(SQLTranslator.TABLE_PREFIX + "datum_kind", "VARCHAR(24)");
- addReplacement(SQLTranslator.TABLE_PREFIX + "crs_kind", "VARCHAR(24)");
- addReplacement(SQLTranslator.TABLE_PREFIX + "cs_kind", "VARCHAR(24)");
+ addReplacement(SQLTranslator.TABLE_PREFIX + "datum_kind", TableInfo.ENUM_REPLACEMENT);
+ addReplacement(SQLTranslator.TABLE_PREFIX + "crs_kind", TableInfo.ENUM_REPLACEMENT);
+ addReplacement(SQLTranslator.TABLE_PREFIX + "cs_kind", TableInfo.ENUM_REPLACEMENT);
addReplacement(SQLTranslator.TABLE_PREFIX + "table_name", "VARCHAR(80)");
}
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/TableInfo.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/TableInfo.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/TableInfo.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/TableInfo.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -162,10 +162,17 @@ final class TableInfo {
/**
* Column type for the type (usually with the {@code "_TYPE"} suffix), or {@code null}.
+ * {@link EPSGDataAccess} and {@link AuthorityCodes} assumes that values in this column
+ * have the maximal length described in the {@value #ENUM_REPLACEMENT} statement.
*/
final String typeColumn;
/**
+ * The SQL type to use as a replacement for enumerated values on databases that do not support enumerations.
+ */
+ static final String ENUM_REPLACEMENT = "VARCHAR(24)";
+
+ /**
* Sub-interfaces of {@link #type} to handle, or {@code null} if none.
*/
final Class<?>[] subTypes;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -355,8 +355,10 @@ public class Mercator extends ConformalP
final double a = abs(\u03c6);
if (a < PI/2) {
y = log(expOfNorthing(\u03c6, eccentricity * sin\u03c6)); // Snyder (7-7)
+ } else if (a <= (PI/2 + ANGULAR_TOLERANCE)) {
+ y = copySign(POSITIVE_INFINITY, \u03c6);
} else {
- y = copySign(a <= (PI/2 + ANGULAR_TOLERANCE) ? POSITIVE_INFINITY : NaN, \u03c6);
+ y = NaN;
}
}
dstPts[dstOff ] = srcPts[srcOff]; // Scale will be applied by the denormalization matrix.
@@ -396,8 +398,10 @@ public class Mercator extends ConformalP
final double y;
if (a < PI/2) {
y = log(expOfNorthing(\u03c6, eccentricity * sin(\u03c6)));
+ } else if (a <= (PI/2 + ANGULAR_TOLERANCE)) {
+ y = copySign(POSITIVE_INFINITY, \u03c6);
} else {
- y = copySign(a <= (PI/2 + ANGULAR_TOLERANCE) ? POSITIVE_INFINITY : NaN, \u03c6);
+ y = NaN;
}
dstPts[dstOff] = y;
}
@@ -485,8 +489,10 @@ public class Mercator extends ConformalP
final double a = abs(\u03c6);
if (a < PI/2) {
y = log(tan(PI/4 + 0.5*\u03c6)); // Part of Snyder (7-2)
+ } else if (a <= (PI/2 + ANGULAR_TOLERANCE)) {
+ y = copySign(POSITIVE_INFINITY, \u03c6);
} else {
- y = copySign(a <= (PI/2 + ANGULAR_TOLERANCE) ? POSITIVE_INFINITY : NaN, \u03c6);
+ y = NaN;
}
}
dstPts[dstOff ] = srcPts[srcOff];
@@ -519,8 +525,10 @@ public class Mercator extends ConformalP
final double y;
if (a < PI/2) {
y = log(tan(PI/4 + 0.5*\u03c6)); // Part of Snyder (7-2)
+ } else if (a <= (PI/2 + ANGULAR_TOLERANCE)) {
+ y = copySign(POSITIVE_INFINITY, \u03c6);
} else {
- y = copySign(a <= (PI/2 + ANGULAR_TOLERANCE) ? POSITIVE_INFINITY : NaN, \u03c6);
+ y = NaN;
}
dstPts[dstOff] = y;
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -78,14 +78,4 @@ public class ProjectionException extends
ProjectionException(final short code) {
this(Errors.format(code));
}
-
- /**
- * Constructs a new exception with the specified detail message.
- *
- * @param code One of the constants suitable for {@link Errors#format(short)}.
- * @param value An argument value to be formatted.
- */
- ProjectionException(final short code, final Object value) {
- this(Errors.format(code, value));
- }
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -59,7 +59,7 @@ import static org.apache.sis.internal.re
* @author Martin Desruisseaux (Geomatys)
* @author R�mi Mar�chal (Geomatys)
* @since 0.6
- * @version 0.7
+ * @version 0.8
* @module
*
* @see Mercator
@@ -314,13 +314,34 @@ public class TransverseMercator extends
final double[] dstPts, final int dstOff,
final boolean derivate) throws ProjectionException
{
- final double \u03bb = srcPts[srcOff ];
+ final double \u03bb = srcPts[srcOff];
+ if (abs(\u03bb) >= (0.9*PI/2)) {
+ /*
+ * The Transverse Mercator projection is conceptually a Mercator projection rotated by 90�.
+ * In Mercator projection, y values tend toward infinity for latitudes close to �90�.
+ * In Transverse Mercator, x values tend toward infinity for longitudes close to �90�
+ * at equator and after subtraction of central meridian. After we pass the 90� limit,
+ * the Transverse Mercator results at (90� + \u0394) are the same as for (90� - \u0394).
+ *
+ * Problem is that 90� is an ordinary longitude value, not even close to the limit of longitude
+ * values range (�180�). So having f(\u03c0/2+\u0394, \u03c6) = f(\u03c0/2-\u0394, \u03c6) results in wrong behavior in some
+ * algorithms like the one used by Envelopes.transform(CoordinateOperation, Envelope).
+ * Since a distance of 90� from central meridian is far outside the Transverse Mercator
+ * domain of validity anyway, we do not let the user go further.
+ *
+ * In the particular case of ellipsoidal formulas, we put a limit of 81� instead of 90�
+ * because experience shows that results close to equator become chaotic after 85� when
+ * using WGS84 ellipsoid. We do not need to reduce the limit for the spherical formulas,
+ * because the mathematic are simpler and the function still smooth until 90�.
+ */
+ throw new ProjectionException(Errors.Keys.OutsideDomainOfValidity);
+ }
final double \u03c6 = srcPts[srcOff+1];
final double sin\u03bb = sin(\u03bb);
final double \u212fsin\u03c6 = sin(\u03c6) * eccentricity;
final double Q = asinh(tan(\u03c6)) - atanh(\u212fsin\u03c6) * eccentricity;
- final double coshQ = cosh(Q);
- final double \u03b70 = atanh(sin\u03bb / coshQ);
+ final double coshQ = cosh(Q); // Can not be smaller than 1.
+ final double \u03b70 = atanh(sin\u03bb / coshQ); // Tends toward �\u221e if \u03bb \u2192 �90�.
/*
* Original formula: \u03b70 = atanh(sin(\u03bb) * cos(\u03b2)) where
* cos(\u03b2) = cos(atan(sinh(Q)))
@@ -596,7 +617,11 @@ public class TransverseMercator extends
final double[] dstPts, final int dstOff,
final boolean derivate) throws ProjectionException
{
- final double \u03bb = srcPts[srcOff ];
+ final double \u03bb = srcPts[srcOff ];
+ if (abs(\u03bb) > PI/2) {
+ // See comment in the overridden class.
+ throw new ProjectionException(Errors.Keys.OutsideDomainOfValidity);
+ }
final double \u03c6 = srcPts[srcOff+1];
final double sin\u03bb = sin(\u03bb);
final double cos\u03bb = cos(\u03bb);
Modified: sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -16,34 +16,87 @@
*/
package org.apache.sis.geometry;
+import java.util.Collections;
import org.opengis.geometry.Envelope;
import org.opengis.util.FactoryException;
-import org.apache.sis.test.TestCase;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.CoordinateOperation;
+import org.opengis.referencing.operation.MathTransform2D;
+import org.opengis.referencing.operation.TransformException;
+import org.apache.sis.referencing.crs.DefaultCompoundCRS;
+import org.apache.sis.referencing.crs.HardCodedCRS;
+import org.apache.sis.referencing.operation.transform.MathTransformWrapper;
import org.apache.sis.test.DependsOn;
import org.junit.Test;
-import static org.apache.sis.test.Assert.*;
+import static org.apache.sis.test.ReferencingAssert.*;
import static org.opengis.test.Validators.validate;
/**
* Tests the {@link Envelopes} class.
+ * This class inherits the test methods defined in {@link TransformTestCase}.
*
* @author Martin Desruisseaux (IRD, Geomatys)
* @since 0.3
- * @version 0.3
+ * @version 0.8
* @module
*/
@DependsOn({
GeneralEnvelopeTest.class,
CurveExtremumTest.class
})
-public final strictfp class EnvelopesTest extends TestCase {
+public final strictfp class EnvelopesTest extends TransformTestCase<GeneralEnvelope> {
+ /**
+ * Creates an envelope for the given CRS and coordinate values.
+ */
+ @Override
+ GeneralEnvelope createFromExtremums(CoordinateReferenceSystem crs, double xmin, double ymin, double xmax, double ymax) {
+ final GeneralEnvelope env = new GeneralEnvelope(crs);
+ env.setRange(0, xmin, xmax);
+ env.setRange(1, ymin, ymax);
+ return env;
+ }
- /*
- * Tests of the 'transform' methods are not yet ported because they need more MathTransform
- * implementations. Those tests will be ported in a future Apache SIS version.
+ /**
+ * Transforms an envelope using the given math transform.
+ * This transformation can not handle poles.
+ *
+ * <p>This method wraps the math transform into an opaque object for hiding the fact that the given
+ * transform implement the {@link MathTransform2D}�interface. The intend is to disable optimization
+ * paths (if any), in order to test the generic path.</p>
*/
+ @Override
+ GeneralEnvelope transform(CoordinateReferenceSystem targetCRS, MathTransform2D transform, GeneralEnvelope envelope) throws TransformException {
+ final GeneralEnvelope env = Envelopes.transform(new MathTransformWrapper(transform), envelope);
+ env.setCoordinateReferenceSystem(targetCRS);
+ return env;
+ }
+
+ /**
+ * Transforms an envelope using the given operation.
+ * This transformation can handle poles.
+ */
+ @Override
+ GeneralEnvelope transform(CoordinateOperation operation, GeneralEnvelope envelope) throws TransformException {
+ return Envelopes.transform(operation, envelope);
+ }
+
+ /**
+ * Returns {@code true} if the outer envelope contains the inner one.
+ */
+ @Override
+ boolean contains(GeneralEnvelope outer, GeneralEnvelope inner) {
+ return outer.contains(inner);
+ }
+
+ /**
+ * Asserts that the given envelope is equals to the expected value.
+ */
+ @Override
+ void assertGeometryEquals(GeneralEnvelope expected, GeneralEnvelope actual, double tolx, double toly) {
+ assertEnvelopeEquals(expected, actual, tolx, toly);
+ }
/**
* Tests {@link Envelopes#fromWKT(CharSequence)}. This test is provided as a matter of principle,
@@ -83,4 +136,39 @@ public final strictfp class EnvelopesTes
envelope.setRange(1, 20, 25);
assertEquals("POLYGON((40 20, 40 25, 50 25, 50 20, 40 20))", Envelopes.toPolygonWKT(envelope));
}
+
+ /**
+ * Tests the transformation of an envelope from a 4D CRS to a 2D CRS
+ * where the ordinates in one dimension are NaN.
+ *
+ * @throws TransformException if an error occurred while transforming the envelope.
+ *
+ * @since 0.8
+ */
+ @Test
+ public void testTransform4to2D() throws TransformException {
+ final CoordinateReferenceSystem targetCRS = HardCodedCRS.WGS84;
+ final CoordinateReferenceSystem sourceCRS = new DefaultCompoundCRS(
+ Collections.singletonMap(DefaultCompoundCRS.NAME_KEY, "4D CRS"),
+ HardCodedCRS.WGS84,
+ HardCodedCRS.GRAVITY_RELATED_HEIGHT,
+ HardCodedCRS.TIME);
+
+ final GeneralEnvelope env = new GeneralEnvelope(sourceCRS);
+ env.setRange(0, -170, 170);
+ env.setRange(1, -80, 80);
+ env.setRange(2, -50, -50);
+ env.setRange(3, Double.NaN, Double.NaN);
+ assertFalse("isAllNaN", env.isAllNaN()); // Opportunist test (not really the topic of this method).
+ assertTrue ("isEmpty", env.isEmpty()); // Opportunist test (not really the topic of this method).
+ /*
+ * If the referencing framework has selected the CopyTransform implementation
+ * as expected, then the envelope ordinates should not be NaN.
+ */
+ final Envelope env2D = Envelopes.transform(env, targetCRS);
+ assertEquals(-170, env2D.getMinimum(0), 0);
+ assertEquals( 170, env2D.getMaximum(0), 0);
+ assertEquals( -80, env2D.getMinimum(1), 0);
+ assertEquals( 80, env2D.getMaximum(1), 0);
+ }
}
Modified: sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/TransverseMercatorTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/TransverseMercatorTest.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/TransverseMercatorTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/TransverseMercatorTest.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -158,6 +158,10 @@ public final strictfp class TransverseMe
*/
final double[] source = CoordinateDomain.GEOGRAPHIC_RADIANS_HALF_\u03bb.generateRandomInput(new Random(5346144739450824145L), 2, 10);
final double[] target = new double[source.length];
+ for (int i=0; i<source.length; i+=2) {
+ // A longitude range of [-90 \u2026 +90]� is still too wide for Transverse Mercator. Reduce to [-45 \u2026 +45]�.
+ source[i] /= 2;
+ }
transform.transform(source, 0, target, 0, 10);
transform = assertSerializedEquals(transform);
tolerance = Formulas.LINEAR_TOLERANCE;
Modified: sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -26,7 +26,7 @@ import org.junit.BeforeClass;
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.7
+ * @version 0.8
* @module
*/
@Suite.SuiteClasses({
@@ -216,6 +216,7 @@ import org.junit.BeforeClass;
org.apache.sis.geometry.ImmutableEnvelopeTest.class,
org.apache.sis.geometry.Envelope2DTest.class,
org.apache.sis.geometry.CurveExtremumTest.class,
+ org.apache.sis.geometry.Shapes2DTest.class, // Simpler than EnvelopesTest.
org.apache.sis.geometry.EnvelopesTest.class,
org.apache.sis.internal.referencing.ServicesForMetadataTest.class,
Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/XMLInputFactory.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/XMLInputFactory.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/XMLInputFactory.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/XMLInputFactory.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -37,7 +37,7 @@ import org.apache.sis.util.Static;
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.4
- * @version 0.4
+ * @version 0.8
* @module
*/
public final class XMLInputFactory extends Static {
@@ -52,6 +52,31 @@ public final class XMLInputFactory exten
private XMLInputFactory() {
}
+ /**
+ * Creates a new reader for the given object. The given object should be one of the types
+ * expected by a {@code createXMLStreamReader(\u2026)} method defined in this class.
+ *
+ * <p>Note that this method does <strong>not</strong> open streams from files, paths or URLs.
+ * Creating input streams and closing them after usage are caller's responsibility.</p>
+ *
+ * @param in where to read from.
+ * @return the reader, or {@code null} if the given file where not recognized.
+ * @throws XMLStreamException if the type of the given input is one recognized types,
+ * but despite that the reader can not be created.
+ *
+ * @since 0.8
+ */
+ public static XMLStreamReader createFromAny(final Object in) throws XMLStreamException {
+ if (in instanceof XMLStreamReader) return ((XMLStreamReader) in);
+ if (in instanceof XMLEventReader) return createXMLStreamReader((XMLEventReader) in);
+ if (in instanceof InputSource) return createXMLStreamReader((InputSource) in);
+ if (in instanceof InputStream) return createXMLStreamReader((InputStream) in);
+ if (in instanceof Reader) return createXMLStreamReader((Reader) in);
+ if (in instanceof Source) return createXMLStreamReader((Source) in);
+ if (in instanceof Node) return createXMLStreamReader((Node) in);
+ return null;
+ }
+
/*
* Do not provide convenience method for java.io.File, because the caller needs to close the created
* input stream himself (this is not done by XMLInputFactory.close(), despite its method name).
@@ -60,9 +85,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given stream.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final InputStream in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(in);
@@ -71,9 +96,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given stream.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final Reader in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(in);
@@ -82,9 +107,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given source.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final InputSource in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(new SAXSource(in));
@@ -93,9 +118,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given source.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final XMLEventReader in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(new StAXSource(in));
@@ -104,9 +129,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given source.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final Node in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(new DOMSource(in));
@@ -115,9 +140,9 @@ public final class XMLInputFactory exten
/**
* Creates a new reader for the given source.
*
- * @param in Where to read from.
- * @return The reader.
- * @throws XMLStreamException If the reader can not be created.
+ * @param in where to read from.
+ * @return the reader.
+ * @throws XMLStreamException if the reader can not be created.
*/
public static XMLStreamReader createXMLStreamReader(final Source in) throws XMLStreamException {
return FACTORY.createXMLStreamReader(in);
Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -201,6 +201,11 @@ public final class Errors extends Indexe
public static final short CloneNotSupported_1 = 13;
/**
+ * This {0} reader is closed.
+ */
+ public static final short ClosedReader_1 = 231;
+
+ /**
* Axis directions {0} and {1} are colinear.
*/
public static final short ColinearAxisDirections_2 = 14;
@@ -408,6 +413,11 @@ public final class Errors extends Indexe
public static final short IllegalIdentifierForCodespace_2 = 208;
/**
+ * The {0} reader does not accept inputs of type \u2018{1}\u2019.
+ */
+ public static final short IllegalInputTypeForReader_2 = 230;
+
+ /**
* The \u201c{0}\u201d language is not recognized.
*/
public static final short IllegalLanguageCode_1 = 36;
Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] Thu Jun 30 10:49:56 2016
@@ -51,6 +51,7 @@ CanNotUseGeodeticParameters_2 = Can
CircularReference = Circular reference.
ClassNotFinal_1 = Class \u2018{0}\u2019 is not final.
CloneNotSupported_1 = Can not clone an object of type \u2018{0}\u2019.
+ClosedReader_1 = This {0} reader is closed.
ColinearAxisDirections_2 = Axis directions {0} and {1} are colinear.
CoordinateOperationNotFound_2 = Coordinate conversion of transformation from system \u201c{0}\u201d to \u201c{1}\u201d has not been found.
DatabaseError_2 = Database error while creating a \u2018{0}\u2019 object for code \u201c{1}\u201d.
@@ -91,6 +92,7 @@ IllegalCoordinateSystem_1 = Coor
IllegalCRSType_1 = Coordinate reference system can not be of type \u2018{0}\u2019.
IllegalFormatPatternForClass_2 = The \u201c{1}\u201d pattern can not be applied to formating of objects of type \u2018{0}\u2019.
IllegalIdentifierForCodespace_2 = \u201c{1}\u201d is not a valid identifier for the \u201c{0}\u201d code space.
+IllegalInputTypeForReader_2 = The {0} reader does not accept inputs of type \u2018{1}\u2019.
IllegalLanguageCode_1 = The \u201c{0}\u201d language is not recognized.
IllegalMemberType_2 = Member \u201c{0}\u201d can not be associated to type \u201c{1}\u201d.
IllegalOperationDimension_3 = Dimensions of \u201c{0}\u201d operation can not be ({1} \u2192 {2}).
Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] Thu Jun 30 10:49:56 2016
@@ -48,6 +48,7 @@ CanNotUseGeodeticParameters_2 = Ne p
CircularReference = R\u00e9f\u00e9rence circulaire.
ClassNotFinal_1 = La classe \u2018{0}\u2019 n\u2019est pas finale.
CloneNotSupported_1 = Un objet de type \u2018{0}\u2019 ne peut pas \u00eatre clon\u00e9.
+ClosedReader_1 = Ce lecteur {0} est ferm\u00e9.
ColinearAxisDirections_2 = Les directions d\u2019axes {0} et {1} sont colin\u00e9aires.
CoordinateOperationNotFound_2 = La conversion ou transformation des coordonn\u00e9es du syst\u00e8me \u00ab\u202f{0}\u202f\u00bb vers \u00ab\u202f{1}\u202f\u00bb n\u2019a pas \u00e9t\u00e9 trouv\u00e9e.
DatabaseError_2 = Erreur de base de donn\u00e9es lors de la cr\u00e9ation d\u2019un objet \u2018{0}\u2019 pour le code \u00ab\u202f{1}\u202f\u00bb.
@@ -88,6 +89,7 @@ IllegalCoordinateSystem_1 = Le s
IllegalCRSType_1 = Le syst\u00e8me de r\u00e9f\u00e9rence des coordonn\u00e9es ne peut pas \u00eatre de type \u2018{0}\u2019.
IllegalFormatPatternForClass_2 = Le mod\u00e8le \u00ab\u202f{1}\u202f\u00bb ne peut pas \u00eatre appliqu\u00e9 au formatage d\u2019objets de type \u2018{0}\u2019.
IllegalIdentifierForCodespace_2 = \u00ab\u202f{1}\u202f\u00bb n\u2019est pas un identifiant valide pour l\u2019espace de codes \u00ab\u202f{0}\u202f\u00bb.
+IllegalInputTypeForReader_2 = Le lecteur {0} n\u2019accepte pas des entr\u00e9s de type \u2018{1}\u2019.
IllegalLanguageCode_1 = Le code de langue \u00ab\u202f{0}\u202f\u00bb n\u2019est pas reconnu.
IllegalMemberType_2 = Le membre \u00ab\u202f{0}\u202f\u00bb ne peut pas \u00eatre associ\u00e9 au type \u00ab\u202f{1}\u202f\u00bb.
IllegalOperationDimension_3 = Les dimensions de l\u2019op\u00e9ration \u00ab\u202f{0}\u202f\u00bb ne peuvent pas \u00eatre ({1} \u2192 {2}).
Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -63,7 +63,7 @@ import static org.apache.sis.util.Argume
* @author C�dric Brian�on (Geomatys)
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.4
+ * @version 0.8
* @module
*/
public final class XML extends Static {
@@ -353,7 +353,7 @@ public final class XML extends Static {
*
* @param object The root of content tree to be marshalled.
* @return The XML representation of the given object.
- * @throws JAXBException If an error occurred during the marshalling.
+ * @throws JAXBException if an error occurred during the marshalling.
*/
public static String marshal(final Object object) throws JAXBException {
ensureNonNull("object", object);
@@ -370,7 +370,7 @@ public final class XML extends Static {
*
* @param object The root of content tree to be marshalled.
* @param output The stream where to write.
- * @throws JAXBException If an error occurred during the marshalling.
+ * @throws JAXBException if an error occurred during the marshalling.
*/
public static void marshal(final Object object, final OutputStream output) throws JAXBException {
ensureNonNull("object", object);
@@ -386,7 +386,7 @@ public final class XML extends Static {
*
* @param object The root of content tree to be marshalled.
* @param output The file to be written.
- * @throws JAXBException If an error occurred during the marshalling.
+ * @throws JAXBException if an error occurred during the marshalling.
*/
public static void marshal(final Object object, final File output) throws JAXBException {
ensureNonNull("object", object);
@@ -409,7 +409,7 @@ public final class XML extends Static {
* @param object The root of content tree to be marshalled.
* @param output The file to be written.
* @param properties An optional map of properties to give to the marshaller, or {@code null} if none.
- * @throws JAXBException If a property has an illegal value, or if an error occurred during the marshalling.
+ * @throws JAXBException if a property has an illegal value, or if an error occurred during the marshalling.
*
* @since 0.4
*/
@@ -434,7 +434,7 @@ public final class XML extends Static {
*
* @param xml The XML representation of an object.
* @return The object unmarshalled from the given input.
- * @throws JAXBException If an error occurred during the unmarshalling.
+ * @throws JAXBException if an error occurred during the unmarshalling.
*/
public static Object unmarshal(final String xml) throws JAXBException {
ensureNonNull("input", xml);
@@ -451,7 +451,7 @@ public final class XML extends Static {
*
* @param input The stream from which to read a XML representation.
* @return The object unmarshalled from the given input.
- * @throws JAXBException If an error occurred during the unmarshalling.
+ * @throws JAXBException if an error occurred during the unmarshalling.
*/
public static Object unmarshal(final InputStream input) throws JAXBException {
ensureNonNull("input", input);
@@ -467,7 +467,7 @@ public final class XML extends Static {
*
* @param input The URL from which to read a XML representation.
* @return The object unmarshalled from the given input.
- * @throws JAXBException If an error occurred during the unmarshalling.
+ * @throws JAXBException if an error occurred during the unmarshalling.
*/
public static Object unmarshal(final URL input) throws JAXBException {
ensureNonNull("input", input);
@@ -483,7 +483,7 @@ public final class XML extends Static {
*
* @param input The file from which to read a XML representation.
* @return The object unmarshalled from the given input.
- * @throws JAXBException If an error occurred during the unmarshalling.
+ * @throws JAXBException if an error occurred during the unmarshalling.
*/
public static Object unmarshal(final File input) throws JAXBException {
ensureNonNull("input", input);
@@ -506,7 +506,7 @@ public final class XML extends Static {
* @param input The file from which to read a XML representation.
* @param properties An optional map of properties to give to the unmarshaller, or {@code null} if none.
* @return The object unmarshalled from the given input.
- * @throws JAXBException If a property has an illegal value, or if an error occurred during the unmarshalling.
+ * @throws JAXBException if a property has an illegal value, or if an error occurred during the unmarshalling.
*
* @since 0.4
*/
Modified: sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java [UTF-8] (original)
+++ sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -192,8 +192,8 @@ final class MetadataReader {
/**
* Invoked when a non-fatal exception occurred while reading metadata.
- * This method will send a record to the registered listeners if any,
- * or will log the record otherwise.
+ * This method sends a record to the registered listeners if any,
+ * or logs the record otherwise.
*/
private void warning(final Exception e) {
decoder.listeners.warning(null, e);
Modified: sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java [UTF-8] (original)
+++ sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -19,7 +19,9 @@ package org.apache.sis.storage.netcdf;
import java.io.IOException;
import org.opengis.metadata.Metadata;
import org.apache.sis.util.Debug;
+import org.apache.sis.util.Classes;
import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.resources.Errors;
import org.apache.sis.storage.DataStore;
import org.apache.sis.storage.DataStoreException;
import org.apache.sis.storage.StorageConnector;
@@ -33,7 +35,7 @@ import org.apache.sis.metadata.Modifiabl
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.3
- * @version 0.3
+ * @version 0.8
* @module
*
* @see NetcdfStoreProvider
@@ -56,7 +58,7 @@ public class NetcdfStore extends DataSto
* needed resource.
*
* @param storage Information about the storage (URL, stream, {@link ucar.nc2.NetcdfFile} instance, <i>etc</i>).
- * @throws DataStoreException If an error occurred while opening the NetCDF file.
+ * @throws DataStoreException if an error occurred while opening the NetCDF file.
*/
public NetcdfStore(final StorageConnector storage) throws DataStoreException {
ArgumentChecks.ensureNonNull("storage", storage);
@@ -65,6 +67,10 @@ public class NetcdfStore extends DataSto
} catch (IOException e) {
throw new DataStoreException(e);
}
+ if (decoder == null) {
+ throw new DataStoreException(Errors.format(Errors.Keys.IllegalInputTypeForReader_2,
+ "NetCDF", Classes.getClass(storage.getStorage())));
+ }
}
/**
@@ -73,7 +79,7 @@ public class NetcdfStore extends DataSto
* data quality, usage constraints and more.
*
* @return Information about the dataset.
- * @throws DataStoreException If an error occurred while reading the data.
+ * @throws DataStoreException if an error occurred while reading the data.
*/
@Override
public Metadata getMetadata() throws DataStoreException {
@@ -92,7 +98,7 @@ public class NetcdfStore extends DataSto
/**
* Closes this NetCDF store and releases any underlying resources.
*
- * @throws DataStoreException If an error occurred while closing the NetCDF file.
+ * @throws DataStoreException if an error occurred while closing the NetCDF file.
*/
@Override
public void close() throws DataStoreException {
Modified: sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java [UTF-8] (original)
+++ sis/trunk/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -202,7 +202,7 @@ public class NetcdfStoreProvider extends
*
* @param storage Information about the storage (URL, stream, {@link ucar.nc2.NetcdfFile} instance, <i>etc</i>).
* @return A data store implementation associated with this provider for the given storage.
- * @throws DataStoreException If an error occurred while creating the data store instance.
+ * @throws DataStoreException if an error occurred while creating the data store instance.
*/
@Override
public DataStore open(final StorageConnector storage) throws DataStoreException {
@@ -215,9 +215,9 @@ public class NetcdfStoreProvider extends
*
* @param listeners Where to send the warnings.
* @param storage Information about the input (file, input stream, <i>etc.</i>)
- * @return The decoder for the given input.
- * @throws IOException If an error occurred while opening the NetCDF file.
- * @throws DataStoreException If a logical error (other than I/O) occurred.
+ * @return The decoder for the given input, or {@code null} if the input type is not recognized.
+ * @throws IOException if an error occurred while opening the NetCDF file.
+ * @throws DataStoreException if a logical error (other than I/O) occurred.
*/
static Decoder decoder(final WarningListeners<?> listeners, final StorageConnector storage)
throws IOException, DataStoreException
@@ -252,9 +252,9 @@ public class NetcdfStoreProvider extends
* @param input The NetCDF file object of filename string from which to read data.
* @param isUCAR {@code true} if {@code input} is an instance of the UCAR {@link ucar.nc2.NetcdfFile} object,
* or {@code false} if it is the filename as a {@code String}.
- * @return The {@link DecoderWrapper} instance for the given input.
- * @throws IOException If an error occurred while opening the NetCDF file.
- * @throws DataStoreException If a logical error (other than I/O) occurred.
+ * @return The {@link DecoderWrapper} instance for the given input, or {@code null} if the input type is not recognized.
+ * @throws IOException if an error occurred while opening the NetCDF file.
+ * @throws DataStoreException if a logical error (other than I/O) occurred.
*/
private static Decoder createByReflection(final WarningListeners<?> listeners, final Object input, final boolean isUCAR)
throws IOException, DataStoreException
Modified: sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java [UTF-8] (original)
+++ sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -390,7 +390,7 @@ public final class IOUtilities extends S
*/
final Set<Object> optionSet;
if (options == null || options.length == 0) {
- optionSet = Collections.emptySet();
+ optionSet = Collections.<Object>singleton(StandardOpenOption.READ);
} else {
optionSet = new HashSet<Object>(Arrays.asList(options));
optionSet.add(StandardOpenOption.READ);
Modified: sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java [UTF-8] (original)
+++ sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -144,7 +144,7 @@ final class Store extends DataStore {
private void unmarshal() throws DataStoreException {
final StreamSource s = source;
final Closeable in = input(s);
- source = null; // Cleared first in case of error.
+ source = null; // Cleared first in case of error.
if (in != null) try {
try {
object = XML.unmarshal(s, properties());
@@ -197,7 +197,7 @@ final class Store extends DataStore {
public void close() throws DataStoreException {
object = null;
final Closeable in = input(source);
- source = null; // Cleared first in case of failure.
+ source = null; // Cleared first in case of failure.
if (in != null) try {
in.close();
} catch (IOException e) {
Modified: sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
URL: http://svn.apache.org/viewvc/sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java?rev=1750767&r1=1750766&r2=1750767&view=diff
==============================================================================
--- sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java [UTF-8] (original)
+++ sis/trunk/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java [UTF-8] Thu Jun 30 10:49:56 2016
@@ -94,7 +94,7 @@ public abstract class DataStore implemen
* or distributor, data quality, update frequency, usage constraints and more.
*
* @return Information about the dataset, or {@code null} if none.
- * @throws DataStoreException If an error occurred while reading the data.
+ * @throws DataStoreException if an error occurred while reading the data.
*/
public abstract Metadata getMetadata() throws DataStoreException;
@@ -122,7 +122,7 @@ public abstract class DataStore implemen
* }
*
* @param listener The listener to add.
- * @throws IllegalArgumentException If the given listener is already registered in this data store.
+ * @throws IllegalArgumentException if the given listener is already registered in this data store.
*/
public void addWarningListener(final WarningListener<? super DataStore> listener)
throws IllegalArgumentException
@@ -134,7 +134,7 @@ public abstract class DataStore implemen
* Removes a previously registered listener.
*
* @param listener The listener to remove.
- * @throws NoSuchElementException If the given listener is not registered in this data store.
+ * @throws NoSuchElementException if the given listener is not registered in this data store.
*/
public void removeWarningListener(final WarningListener<? super DataStore> listener)
throws NoSuchElementException
@@ -145,7 +145,7 @@ public abstract class DataStore implemen
/**
* Closes this data store and releases any underlying resources.
*
- * @throws DataStoreException If an error occurred while closing this data store.
+ * @throws DataStoreException if an error occurred while closing this data store.
*/
public abstract void close() throws DataStoreException;
}