Author: desruisseaux
Date: Mon Oct 16 10:01:46 2017
New Revision: 1812269
URL: http://svn.apache.org/viewvc?rev=1812269&view=rev
Log:
Merge from JDK8 branch.
Added:
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/TestFactorySource.java
- copied unchanged from r1812266,
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/TestFactorySource.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/test/integration/CoordinateReferenceSystemTest.java
- copied unchanged from r1812266,
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/integration/CoordinateReferenceSystemTest.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/internal/jdk8/BinaryOperator.java
(with props)
Modified:
sis/branches/JDK7/ (props changed)
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/AxisDirections.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombiner.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameMeaning.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/NameMeaningTest.java
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/sql/TestDatabase.java
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/ExtentsTest.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticObjectFactory.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CRSPair.java
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombinerTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ReferencingUtilitiesTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/DatumShiftTestCase.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CodesTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/AuthorityFactoryMock.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2001.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2002.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2003.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2004.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2005.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2006.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2007.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2008.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GIGS2009.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGFactoryTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGInstallerTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationRegistryTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/PrimitiveTypeProperties.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/ArraysExt.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/xml/NilReason.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/internal/converter/PathConverterTest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/internal/util/DefinitionURITest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/RangeTest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/test/Assume.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/xml/OGCNamespacePrefixMapperTest.java
sis/branches/JDK7/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/PJTest.java
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/folder/StoreTest.java
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/storage/StorageConnectorTest.java
Propchange: sis/branches/JDK7/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 16 10:01:46 2017
@@ -1,5 +1,5 @@
/sis/branches/Android:1430670-1480699
/sis/branches/JDK6:1394913-1508480
-/sis/branches/JDK8:1584960-1811544
+/sis/branches/JDK8:1584960-1812266
/sis/branches/JDK9:1773327-1803064
/sis/trunk:1394364-1508466,1519089-1519674
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/AxisDirections.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/AxisDirections.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/AxisDirections.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/AxisDirections.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -429,22 +429,22 @@ public final class AxisDirections extend
* Returns the angular unit of the specified coordinate system.
* The preference will be given to the longitude axis, if found.
*
- * @param cs the coordinate system from which to get the angular unit,
or {@code null}.
- * @param unit the default unit to return if no angular unit is found.
+ * @param cs the coordinate system from which to get the angular
unit, or {@code null}.
+ * @param fallback the default unit to return if no angular unit is
found.
* @return the angular unit, of {@code unit} if no angular unit was found.
*
* @see
org.apache.sis.internal.referencing.ReferencingUtilities#getUnit(CoordinateSystem)
*
* @since 0.6
*/
- public static Unit<Angle> getAngularUnit(final CoordinateSystem cs,
Unit<Angle> unit) {
+ public static Unit<Angle> getAngularUnit(final CoordinateSystem cs,
Unit<Angle> fallback) {
if (cs != null) {
for (int i = cs.getDimension(); --i>=0;) {
final CoordinateSystemAxis axis = cs.getAxis(i);
if (axis != null) {
// Paranoiac check.
final Unit<?> candidate = axis.getUnit();
if (Units.isAngular(candidate)) {
- unit = candidate.asType(Angle.class);
+ fallback = candidate.asType(Angle.class);
if
(AxisDirection.EAST.equals(absolute(axis.getDirection()))) {
break;
// Found the longitude axis.
}
@@ -452,7 +452,7 @@ public final class AxisDirections extend
}
}
}
- return unit;
+ return fallback;
}
/**
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombiner.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombiner.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombiner.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/EllipsoidalHeightCombiner.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -17,6 +17,8 @@
package org.apache.sis.internal.metadata;
import java.util.Map;
+import java.util.HashMap;
+import org.opengis.metadata.extent.Extent;
import org.opengis.referencing.crs.CRSFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeodeticCRS;
@@ -32,6 +34,8 @@ import org.opengis.referencing.datum.Ver
import org.opengis.referencing.operation.Conversion;
import org.opengis.referencing.operation.CoordinateOperationFactory;
import org.opengis.util.FactoryException;
+import org.apache.sis.metadata.iso.extent.Extents;
+import org.apache.sis.util.ArgumentChecks;
import org.apache.sis.util.ArraysExt;
@@ -204,4 +208,27 @@ public class EllipsoidalHeightCombiner {
}
return null;
}
+
+ /**
+ * Suggests properties for a compound CRS made of the given elements.
+ * This method builds a default CRS name and domain of validity.
+ *
+ * @param components the components for which to get a default set of
properties.
+ * @return suggested properties in a modifiable map. Callers can modify
the returned map.
+ */
+ public static Map<String,Object> properties(final
CoordinateReferenceSystem... components) {
+ final StringBuilder name = new StringBuilder(40);
+ Extent domain = null;
+ for (int i=0; i<components.length; i++) {
+ final CoordinateReferenceSystem crs = components[i];
+ ArgumentChecks.ensureNonNullElement("components", i, crs);
+ if (i != 0) name.append(" + ");
+ name.append(crs.getName().getCode());
+ domain = Extents.intersection(domain, crs.getDomainOfValidity());
+ }
+ final Map<String,Object> properties = new HashMap<>(2);
+ properties.put(CoordinateReferenceSystem.NAME_KEY, name.toString());
+ properties.put(CoordinateReferenceSystem.DOMAIN_OF_VALIDITY_KEY,
domain);
+ return properties;
+ }
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameMeaning.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameMeaning.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameMeaning.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameMeaning.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -29,19 +29,20 @@ import org.opengis.referencing.operation
import org.opengis.util.InternationalString;
import org.opengis.metadata.citation.Citation;
import org.apache.sis.util.Static;
+import org.apache.sis.internal.util.Utilities;
import org.apache.sis.internal.util.Constants;
import org.apache.sis.internal.util.DefinitionURI;
import org.apache.sis.metadata.iso.citation.Citations;
/**
- * The meaning of some part of URN in the {@code "ogc"} namespace.
+ * The meaning of some parts of URN in the {@code "ogc"} namespace.
* The meaning are defined by <cite>OGC Naming Authority</cite> (OGCNA) or
other OGC sources.
*
* @author Martin Desruisseaux (IRD, Geomatys)
- * @version 0.7
+ * @version 0.8
*
- * @see org.apache.sis.internal.util.DefinitionURI
+ * @see DefinitionURI
* @see <a
href="http://www.opengeospatial.org/ogcna">http://www.opengeospatial.org/ogcna</a>
* @see <a
href="http://portal.opengeospatial.org/files/?artifact_id=24045">Definition
identifier URNs in OGC namespace</a>
*
@@ -71,7 +72,7 @@ public final class NameMeaning extends S
/**
* The object types for instances of {@link #CLASSES}.
- * See {@link org.apache.sis.internal.util.DefinitionURI} javadoc for a
list of object types in URN.
+ * See {@link DefinitionURI} javadoc for a list of object types in URN.
*
* <p>Types not yet listed (waiting to see if there is a use for them):</p>
*
@@ -142,8 +143,10 @@ public final class NameMeaning extends S
/**
* Formats the given identifier using the {@code "ogc:urn:def:"} syntax
with possible heuristic changes to
- * the given values. This method delegates to {@link
DefinitionURI#format(String, String, String, String)}
- * after "fixing" the given values using some heuristic knowledge about
the meaning of URN.
+ * the given values. The identifier code space, version and code are
appended omitting any characters that
+ * are not valid for a Unicode identifier. If some information are missing
in the given identifier, then
+ * this method returns {@code null}. This method tries to "fix" the given
values using some heuristic
+ * knowledge about the meaning of URN.
*
* @param type the object type.
* @param authority the authority as one of the values documented in
{@link DefinitionURI} javadoc.
@@ -151,49 +154,67 @@ public final class NameMeaning extends S
* @param code the code.
* @return an identifier using the URN syntax, or {@code null} if a
mandatory information is missing.
*
- * @see DefinitionURI#format(String, String, String, String)
- *
* @since 0.7
*/
public static String toURN(final Class<?> type, final String authority,
String version, String code) {
- if (type != null && authority != null && code != null) {
- final String key = authority.toUpperCase(Locale.US);
- String codeSpace = AUTHORITIES.get(key);
- if (codeSpace == null) {
- /*
- * If the given authority is not one of the authorities that
we expected for the OGC namespace,
- * verify if we can related it to one of the specifications
enumerated in the Citations class.
- * For example if the user gave us "OGP" as the authority, we
will replace that by "IOGP" (the
- * new name for that organization).
- */
- final Citation c = Citations.fromName(key);
- codeSpace = Citations.getCodeSpace(c);
- if (AUTHORITIES.get(codeSpace) == null) {
- return null; // Not an authority that we
recognize for the OGC namespace.
- }
- version = getVersion(c); // Unconditionally overwrite the
user-specified version.
+ if (type == null || authority == null || code == null) {
+ return null;
+ }
+ final String key = authority.toUpperCase(Locale.US);
+ String codeSpace = AUTHORITIES.get(key);
+ if (codeSpace == null) {
+ /*
+ * If the given authority is not one of the authorities that we
expected for the OGC namespace,
+ * verify if we can related it to one of the specifications
enumerated in the Citations class.
+ * For example if the user gave us "OGP" as the authority, we will
replace that by "IOGP" (the
+ * new name for that organization).
+ */
+ final Citation c = Citations.fromName(key);
+ codeSpace = Citations.getCodeSpace(c);
+ if (AUTHORITIES.get(codeSpace) == null) {
+ return null; // Not an authority that we recognize
for the OGC namespace.
+ }
+ version = getVersion(c); // Unconditionally overwrite the
user-specified version.
+ /*
+ * If the above lines resulted in a change of codespace, we may
need to concatenate the authority
+ * with the code for preserving information. The main use case is
WMS codes like "CRS:84":
+ *
+ * 1) Citations.fromName("CRS") gave us Citations.WMS (version
1.3) as the authority.
+ * 2) getCodeSpace(Citations.WMS) gave us "OGC", which is indeed
the codespace used in URN.
+ * 3) OGC Naming Authority – Procedures (OGC-09-046r2) said that
"CRS:84" should be formatted
+ * as "urn:ogc:def:crs:OGC:1.3:CRS84". We already got the
"OGC" and "1.3" parts with above
+ * steps, the last part is to replace "84" by "CRS84".
+ */
+ if (!authority.equals(codeSpace) && !code.startsWith(authority)) {
+ code = authority + code; // Intentionally no ':' separator.
+ }
+ }
+ final StringBuilder buffer = new StringBuilder(DefinitionURI.PREFIX);
+loop: for (int p=0; ; p++) {
+ final String part;
+ switch (p) {
+ case 0: part = toObjectType(type); break;
+ case 1: part = codeSpace; break;
+ case 2: part = version; break;
+ case 3: part = code; break;
+ default: break loop;
+ }
+ if
(!Utilities.appendUnicodeIdentifier(buffer.append(DefinitionURI.SEPARATOR),
'\u0000', part, ".-", false)) {
/*
- * If the above lines resulted in a chance of codespace, we
may need to concatenate the authority
- * with the code for preserving information. The main use case
is WMS codes like "CRS:84":
- *
- * 1) Citations.fromName("CRS") gave us Citations.WMS
(version 1.3) as the authority.
- * 2) getCodeSpace(Citations.WMS) gave us "OGC", which is
indeed the codespace used in URN.
- * 3) OGC Naming Authority – Procedures (OGC-09-046r2) said
that "CRS:84" should be formatted
- * as "urn:ogc:def:crs:OGC:1.3:CRS84". We already got the
"OGC" and "1.3" parts with above
- * steps, the last part is to replace "84" by "CRS84".
+ * Only the version (p = 2) is optional. All other fields are
mandatory.
+ * If no character has been added for a mandatory field, we
can not build a URN.
*/
- if (!authority.equals(codeSpace) &&
!code.startsWith(authority)) {
- code = authority + code; // Intentionally no ':'
separator.
+ if (p != 2) {
+ return null;
}
}
- return DefinitionURI.format(toObjectType(type), codeSpace,
version, code);
}
- return null;
+ return buffer.toString();
}
/**
* Returns the "object type" part of an OGC URN for the given class, or
{@code null} if unknown.
- * See {@link org.apache.sis.internal.util.DefinitionURI} javadoc for a
list of object types in URN.
+ * See {@link DefinitionURI} javadoc for a list of object types in URN.
*
* @param type the class for which to get the URN type.
* @return the URN type, or {@code null} if unknown.
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -505,6 +505,8 @@ public class ReferencingServices extends
* If the given properties are empty and the {@code mtFactory} is the
system default, then this method
* returns the system default {@code CoordinateOperationFactory} instead
of creating a new one.
*
+ * <p>It is okay to set all parameters to {@code null} in order to get the
system default factory.</p>
+ *
* @param properties the default properties.
* @param mtFactory the math transform factory to use.
* @param crsFactory the factory to use if the operation factory needs
to create CRS for intermediate steps.
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -251,7 +251,7 @@ public final class Citations extends Sta
* <ul>
* <li><a href="http://www.opengeospatial.org/standards/ct">Coordinate
Transformation Service</a></li>
* <li><a href="http://www.opengeospatial.org/standards/wms">Web Map
Service</a></li>
- * <li>Definition identifier URNs in OGC namespace</li>
+ * <li><a
href="http://portal.opengeospatial.org/files/?artifact_id=24045">Definition
identifier URNs in OGC namespace</a></li>
* </ul>
*
* We do not commit to a particular OGC specification in order to keep the
flexibility to change the
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -16,6 +16,8 @@
*/
package org.apache.sis.metadata.iso.extent;
+import java.util.Set;
+import java.util.LinkedHashSet;
import java.util.Collection;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlElement;
@@ -29,9 +31,17 @@ import org.opengis.metadata.extent.Geogr
import org.opengis.referencing.operation.TransformException;
import org.opengis.util.InternationalString;
import org.apache.sis.util.iso.Types;
+import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.collection.Containers;
+import org.apache.sis.metadata.AbstractMetadata;
import org.apache.sis.metadata.iso.ISOMetadata;
import org.apache.sis.metadata.TitleProperty;
import org.apache.sis.internal.metadata.ReferencingServices;
+import org.apache.sis.xml.NilObject;
+import org.apache.sis.xml.NilReason;
+
+// Branch-dependent imports
+import org.apache.sis.internal.jdk8.BinaryOperator;
/**
@@ -74,7 +84,7 @@ import org.apache.sis.internal.metadata.
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Touraïvane (IRD)
* @author Cédric Briançon (Geomatys)
- * @version 0.3
+ * @version 0.8
*
* @see Extents#getGeographicBoundingBox(Extent)
* @see
org.apache.sis.referencing.AbstractReferenceSystem#getDomainOfValidity()
@@ -289,6 +299,85 @@ public class DefaultExtent extends ISOMe
*/
public void addElements(final Envelope envelope) throws TransformException
{
checkWritePermission();
+ ArgumentChecks.ensureNonNull("envelope", envelope);
ReferencingServices.getInstance().addElements(envelope, this);
}
+
+ /**
+ * Sets this extent to the intersection of this extent with the specified
one.
+ * This method computes the intersections of all geographic, vertical and
temporal elements in this extent
+ * with all geographic, vertical and temporal elements in the other
extent, ignoring duplicated results.
+ *
+ * @param other the extent to intersect with this extent.
+ * @throws IllegalArgumentException if two elements to intersect are not
compatible (e.g. mismatched
+ * {@linkplain DefaultGeographicBoundingBox#getInclusion()
bounding box inclusion status} or
+ * mismatched {@linkplain DefaultVerticalExtent#getVerticalCRS()
vertical datum}).
+ * @throws UnsupportedOperationException if a {@code TemporalFactory} is
required but no implementation
+ * has been found on the classpath.
+ *
+ * @see Extents#intersection(Extent, Extent)
+ * @see org.apache.sis.geometry.GeneralEnvelope#intersect(Envelope)
+ *
+ * @since 0.8
+ */
+ public void intersect(final Extent other) {
+ checkWritePermission();
+ ArgumentChecks.ensureNonNull("other", other);
+ final InternationalString od = other.getDescription();
+ if (od != null && !(description instanceof NilObject)) {
+ if (description == null || (od instanceof NilObject)) {
+ description = od;
+ } else if (!description.equals(od)) {
+ description =
NilReason.MISSING.createNilObject(InternationalString.class);
+ }
+ }
+ geographicElements = intersect(GeographicExtent.class,
geographicElements, other.getGeographicElements(), new
BinaryOperator<GeographicExtent>() {@Override public GeographicExtent
apply(GeographicExtent e1, GeographicExtent e2) {return
Extents.intersection(e1, e2);}});
+ verticalElements = intersect(VerticalExtent.class,
verticalElements, other.getVerticalElements(), new
BinaryOperator<VerticalExtent> () {@Override public VerticalExtent
apply(VerticalExtent e1, VerticalExtent e2) {return
Extents.intersection(e1, e2);}});
+ temporalElements = intersect(TemporalExtent.class,
temporalElements, other.getTemporalElements(), new
BinaryOperator<TemporalExtent> () {@Override public TemporalExtent
apply(TemporalExtent e1, TemporalExtent e2) {return
Extents.intersection(e1, e2);}});
+ }
+
+ /**
+ * Computes the intersections of all elements in the given {@code sources}
collection will all elements
+ * in the given {@code targets} collection. If one of those collections is
null or empty, this method
+ * returns all elements of the other collection (may be {@code targets}
itself).
+ *
+ * @param <T> compile-time value of {@code type} argument.
+ * @param type the type of elements in the collections.
+ * @param targets the elements in this {@code DefaultExtent}. Also the
collection where results will be stored.
+ * @param sources the elements from the other {@code Extent} to
intersect with this extent.
+ * @param intersect the function computing intersections.
+ * @return the intersection results. May be the same instance than {@code
targets} with elements replaced.
+ */
+ private <T> Collection<T> intersect(final Class<T> type, Collection<T>
targets, Collection<? extends T> sources, final BinaryOperator<T> intersect) {
+ if (!Containers.isNullOrEmpty(sources)) {
+ if (!Containers.isNullOrEmpty(targets)) {
+ final Set<T> results = new
LinkedHashSet<>(Containers.hashMapCapacity(targets.size()));
+ T empty = null;
+ for (final T target : targets) {
+ for (final T source : sources) {
+ final T e = intersect.apply(target, source);
+ results.add(e);
+ /*
+ * If the two elements do not intersect, remember the
value created by the intersection method
+ * for meaning "no intersection". We remember only
the first value since we always create the
+ * same value for meaning "no intersection".
+ */
+ if (empty == null && e != source && e != target && (e
instanceof AbstractMetadata) && ((AbstractMetadata) e).isEmpty()) {
+ empty = e;
+ }
+ }
+ }
+ /*
+ * Remove the "no intersection" value, unless this is the only
result.
+ */
+ results.remove(null);
+ if (results.size() > 1) {
+ results.remove(empty);
+ }
+ sources = results;
+ }
+ targets = writeCollection(sources, targets, type);
+ }
+ return targets;
+ }
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -536,7 +536,7 @@ public class DefaultGeographicBoundingBo
ArgumentChecks.ensureNonNull("box", box);
setBounds(box.getWestBoundLongitude(), box.getEastBoundLongitude(),
box.getSouthBoundLatitude(), box.getNorthBoundLatitude());
- setInclusion(box.getInclusion()); // Set only on success.
+ setInclusion(box.getInclusion()); // Set
only on success.
}
/*
@@ -650,6 +650,7 @@ public class DefaultGeographicBoundingBo
*/
public void add(final GeographicBoundingBox box) {
checkWritePermission();
+ ArgumentChecks.ensureNonNull("box", box);
double λmin = box.getWestBoundLongitude();
double λmax = box.getEastBoundLongitude();
double φmin = box.getSouthBoundLatitude();
@@ -707,6 +708,7 @@ public class DefaultGeographicBoundingBo
*/
public void intersect(final GeographicBoundingBox box) throws
IllegalArgumentException {
checkWritePermission();
+ ArgumentChecks.ensureNonNull("box", box);
if (getInclusion(getInclusion()) != getInclusion(box.getInclusion())) {
throw new
IllegalArgumentException(Errors.format(Errors.Keys.IncompatiblePropertyValue_1,
"inclusion"));
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -31,6 +31,8 @@ import org.opengis.referencing.operation
import org.apache.sis.metadata.iso.ISOMetadata;
import org.apache.sis.internal.util.TemporalUtilities;
import org.apache.sis.internal.metadata.ReferencingServices;
+import org.apache.sis.xml.NilObject;
+import org.apache.sis.xml.NilReason;
/**
@@ -60,7 +62,7 @@ import org.apache.sis.internal.metadata.
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Touraïvane (IRD)
* @author Cédric Briançon (Geomatys)
- * @version 0.3
+ * @version 0.8
* @since 0.3
* @module
*/
@@ -242,4 +244,49 @@ public class DefaultTemporalExtent exten
checkWritePermission();
ReferencingServices.getInstance().setBounds(envelope, this);
}
+
+ /**
+ * Sets this temporal extent to the intersection of this extent with the
specified one.
+ * If there is no intersection between the two extents, then this method
sets the temporal primitive to nil.
+ * If either this extent or the specified extent has nil primitive, then
the intersection result will also be nil.
+ *
+ * @param other the temporal extent to intersect with this extent.
+ * @throws UnsupportedOperationException if no implementation of {@code
TemporalFactory} has been found
+ * on the classpath.
+ *
+ * @see Extents#intersection(TemporalExtent, TemporalExtent)
+ * @see org.apache.sis.geometry.GeneralEnvelope#intersect(Envelope)
+ *
+ * @since 0.8
+ */
+ public void intersect(final TemporalExtent other) {
+ checkWritePermission();
+ final TemporalPrimitive ot = other.getExtent();
+ if (ot != null && !(extent instanceof NilObject)) {
+ if (extent == null || (ot instanceof NilObject)) {
+ extent = ot;
+ } else {
+ Date t0 = getTime(extent, true);
+ Date t1 = getTime(extent, false);
+ Date h0 = getTime(ot, true);
+ Date h1 = getTime(ot, false);
+ boolean changed = false;
+ if (h0 != null && (t0 == null || h0.after(t0))) {
+ t0 = h0;
+ changed = true;
+ }
+ if (h1 != null && (t1 == null || h1.before(t1))) {
+ t1 = h1;
+ changed = true;
+ }
+ if (changed) {
+ if (t0 != null && t1 != null && t0.after(t1)) {
+ extent =
NilReason.MISSING.createNilObject(TemporalPrimitive.class);
+ } else {
+ setBounds(t0, t1);
+ }
+ }
+ }
+ }
+ }
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -21,12 +21,20 @@ import javax.xml.bind.annotation.XmlElem
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.opengis.geometry.Envelope;
+import org.opengis.util.FactoryException;
import org.opengis.referencing.crs.VerticalCRS;
+import org.opengis.referencing.operation.MathTransform1D;
import org.opengis.referencing.operation.TransformException;
+import org.opengis.geometry.MismatchedReferenceSystemException;
import org.opengis.metadata.extent.VerticalExtent;
import org.apache.sis.metadata.iso.ISOMetadata;
import org.apache.sis.internal.jaxb.gco.GO_Real;
import org.apache.sis.internal.metadata.ReferencingServices;
+import org.apache.sis.math.MathFunctions;
+import org.apache.sis.util.resources.Errors;
+import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.Utilities;
+import org.apache.sis.xml.NilReason;
/**
@@ -55,7 +63,7 @@ import org.apache.sis.internal.metadata.
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Touraïvane (IRD)
* @author Cédric Briançon (Geomatys)
- * @version 0.3
+ * @version 0.8
* @since 0.3
* @module
*/
@@ -241,4 +249,118 @@ public class DefaultVerticalExtent exten
checkWritePermission();
ReferencingServices.getInstance().setBounds(envelope, this);
}
+
+ /**
+ * Sets this vertical extent to the intersection of this extent with the
specified one.
+ * The {@linkplain
org.apache.sis.referencing.crs.DefaultVerticalCRS#getDatum() vertical datum}
+ * must be the same (ignoring metadata) for both extents; this method does
not perform datum shift.
+ * However this method can perform unit conversions.
+ *
+ * <p>If there is no intersection between the two extents, then this
method sets both minimum and
+ * maximum values to {@linkplain Double#NaN}. If either this extent or the
specified extent has NaN
+ * bounds, then the corresponding bounds of the intersection result will
also be NaN.</p>
+ *
+ * @param other the vertical extent to intersect with this extent.
+ * @throws MismatchedReferenceSystemException if the two extents do not
use the same datum, ignoring metadata.
+ *
+ * @see Extents#intersection(VerticalExtent, VerticalExtent)
+ * @see org.apache.sis.geometry.GeneralEnvelope#intersect(Envelope)
+ *
+ * @since 0.8
+ */
+ public void intersect(final VerticalExtent other) throws
MismatchedReferenceSystemException {
+ checkWritePermission();
+ ArgumentChecks.ensureNonNull("other", other);
+ Double min = other.getMinimumValue();
+ Double max = other.getMaximumValue();
+ try {
+ final MathTransform1D cv =
getConversionFrom(other.getVerticalCRS());
+ if (isReversing(cv, min, max)) {
+ Double tmp = min;
+ min = max;
+ max = tmp;
+ }
+ /*
+ * If minimumValue is NaN, keep it unchanged (because x >
minimumValue is false)
+ * in order to preserve the NilReason. Conversely if min is NaN,
then we want to
+ * take it without conversion for preserving its NilReason.
+ */
+ if (min != null) {
+ if (minimumValue == null || min.isNaN() || (min = convert(cv,
min)) > minimumValue) {
+ minimumValue = min;
+ }
+ }
+ if (max != null) {
+ if (maximumValue == null || max.isNaN() || (max = convert(cv,
max)) < maximumValue) {
+ maximumValue = max;
+ }
+ }
+ } catch (UnsupportedOperationException | FactoryException |
ClassCastException | TransformException e) {
+ throw new
MismatchedReferenceSystemException(Errors.format(Errors.Keys.IncompatiblePropertyValue_1,
"verticalCRS"), e);
+ }
+ if (minimumValue != null && maximumValue != null && minimumValue >
maximumValue) {
+ minimumValue = maximumValue =
NilReason.MISSING.createNilObject(Double.class);
+ }
+ }
+
+ /**
+ * Returns the conversion from the given CRS to the CRS of this extent, or
{@code null} if none or unknown.
+ * The returned {@code MathTransform1D} may apply unit conversions or axis
direction reversal, but usually
+ * not datum shift.
+ *
+ * @param source the CRS from which to perform the conversions, or
{@code null} if unknown.
+ * @return the conversion from {@code source}, or {@code null} if none or
unknown.
+ * @throws UnsupportedOperationException if the {@code sis-referencing}
module is not on the classpath.
+ * @throws FactoryException if the coordinate operation factory is not
available.
+ * @throws ClassCastException if the conversion is not an instance of
{@link MathTransform1D}.
+ */
+ private MathTransform1D getConversionFrom(final VerticalCRS source) throws
FactoryException {
+ if (!Utilities.equalsIgnoreMetadata(verticalCRS, source) &&
verticalCRS != null && source != null) {
+ final MathTransform1D cv = (MathTransform1D)
ReferencingServices.getInstance()
+ .getCoordinateOperationFactory(null, null, null, null)
+ .createOperation(source, verticalCRS).getMathTransform();
+ if (!cv.isIdentity()) {
+ return cv;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns {@code true} if the given conversion seems to change the axis
direction.
+ * This happen for example with conversions from "Elevation" axis to
"Depth" axis.
+ * In case of doubt, this method returns {@code false}.
+ *
+ * <div class="note"><b>Note about alternatives:</b>
+ * we could compare axis directions instead, but it would not work with
user-defined directions
+ * or user-defined unit conversions with negative scale factor (should
never happen, but we are
+ * paranoiac). We could compare the minimum and maximum values after
conversions, but it would
+ * not work if one or both values are {@code null} or {@code NaN}. Since
we want to preserve
+ * {@link NilReason}, we still need to know if axes are reversed in order
to put the nil reason
+ * in the right location.</div>
+ *
+ * @param cv the conversion computed by {@link
#getConversionFrom(VerticalCRS)} (may be {@code null}).
+ * @param sample the minimum or the maximum value.
+ * @param other the minimum or maximum value at the opposite bound.
+ * @return {@code true} if the axis direction is reversed at the given
value.
+ */
+ private static boolean isReversing(final MathTransform1D cv, Double
sample, final Double other) throws TransformException {
+ if (cv == null) {
+ return false;
+ }
+ if (sample == null || sample.isNaN()) {
+ sample = other;
+ } else if (other != null && !other.isNaN()) {
+ sample = (sample + other) / 2;
+ }
+ return MathFunctions.isNegative(cv.derivative(sample != null ? sample
: Double.NaN));
+ }
+
+ /**
+ * Converts the given value with the given transform if non-null. This
converter can generally
+ * not perform datum shift; the operation is merely unit conversion and
change of axis direction.
+ */
+ private static Double convert(MathTransform1D tr, Double value) throws
TransformException {
+ return (tr != null) ? tr.transform(value) : value;
+ }
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -29,6 +29,8 @@ import org.opengis.metadata.extent.Tempo
import org.opengis.metadata.extent.BoundingPolygon;
import org.opengis.metadata.extent.GeographicExtent;
import org.opengis.metadata.extent.GeographicBoundingBox;
+import org.opengis.metadata.extent.GeographicDescription;
+import org.opengis.geometry.MismatchedReferenceSystemException;
import org.opengis.referencing.cs.CoordinateSystemAxis;
import org.opengis.referencing.cs.AxisDirection;
import org.opengis.referencing.crs.VerticalCRS;
@@ -45,6 +47,7 @@ import org.apache.sis.measure.Range;
import org.apache.sis.util.resources.Vocabulary;
import org.apache.sis.util.resources.Errors;
import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.ComparisonMode;
import org.apache.sis.util.Static;
import static java.lang.Math.*;
@@ -437,33 +440,6 @@ public final class Extents extends Stati
}
/**
- * Returns the intersection of the given geographic bounding boxes. If any
of the arguments is {@code null},
- * then this method returns the other argument (which may be null).
Otherwise this method returns a box which
- * is the intersection of the two given boxes.
- *
- * <p>This method never modify the given boxes, but may return directly
one of the given arguments if it
- * already represents the intersection result.</p>
- *
- * @param b1 the first bounding box, or {@code null}.
- * @param b2 the second bounding box, or {@code null}.
- * @return the intersection (may be any of the {@code b1} or {@code b2}
argument if unchanged),
- * or {@code null} if the two given boxes are null.
- * @throws IllegalArgumentException if the {@linkplain
DefaultGeographicBoundingBox#getInclusion() inclusion status}
- * is not the same for both boxes.
- *
- * @see DefaultGeographicBoundingBox#intersect(GeographicBoundingBox)
- *
- * @since 0.4
- */
- public static GeographicBoundingBox intersection(final
GeographicBoundingBox b1, final GeographicBoundingBox b2) {
- if (b1 == null) return b2;
- if (b2 == null || b2 == b1) return b1;
- final DefaultGeographicBoundingBox box = new
DefaultGeographicBoundingBox(b1);
- box.intersect(b2);
- return box;
- }
-
- /**
* Returns an <em>estimation</em> of the area (in square metres) of the
given bounding box.
* Since {@code GeographicBoundingBox} provides only approximative
information (for example
* it does not specify the datum), the value returned by this method is
also approximative.
@@ -497,4 +473,145 @@ public final class Extents extends Stati
max(0, sin(toRadians(box.getNorthBoundLatitude())) -
sin(toRadians(box.getSouthBoundLatitude())));
}
+
+ /**
+ * Returns the intersection of the given geographic bounding boxes. If any
of the arguments is {@code null},
+ * then this method returns the other argument (which may be null).
Otherwise this method returns a box which
+ * is the intersection of the two given boxes.
+ *
+ * <p>This method never modify the given boxes, but may return directly
one of the given arguments if it
+ * already represents the intersection result.</p>
+ *
+ * @param b1 the first bounding box, or {@code null}.
+ * @param b2 the second bounding box, or {@code null}.
+ * @return the intersection (may be any of the {@code b1} or {@code b2}
argument if unchanged),
+ * or {@code null} if the two given boxes are null.
+ * @throws IllegalArgumentException if the {@linkplain
DefaultGeographicBoundingBox#getInclusion() inclusion status}
+ * is not the same for both boxes.
+ *
+ * @see DefaultGeographicBoundingBox#intersect(GeographicBoundingBox)
+ *
+ * @since 0.4
+ */
+ public static GeographicBoundingBox intersection(final
GeographicBoundingBox b1, final GeographicBoundingBox b2) {
+ if (b1 == null) return b2;
+ if (b2 == null || b2 == b1) return b1;
+ final DefaultGeographicBoundingBox box = new
DefaultGeographicBoundingBox(b1);
+ box.intersect(b2);
+ if (box.equals(b1, ComparisonMode.BY_CONTRACT)) return b1;
+ if (box.equals(b2, ComparisonMode.BY_CONTRACT)) return b2;
+ return box;
+ }
+
+ /**
+ * May compute an intersection between the given geographic extents.
+ * Current implementation supports only {@link GeographicBoundingBox};
+ * all other kinds are handled as if they were {@code null}.
+ *
+ * <p>We may improve this method in future Apache SIS version, but it is
not yet clear how.
+ * For example how to handle {@link GeographicDescription} or {@link
BoundingPolygon}?
+ * This method should not be public before we find a better contract.</p>
+ */
+ static GeographicExtent intersection(final GeographicExtent e1, final
GeographicExtent e2) {
+ return intersection(e1 instanceof GeographicBoundingBox ?
(GeographicBoundingBox) e1 : null,
+ e2 instanceof GeographicBoundingBox ?
(GeographicBoundingBox) e2 : null);
+ }
+
+ /**
+ * Returns the intersection of the given vertical extents. If any of the
arguments is {@code null},
+ * then this method returns the other argument (which may be null).
Otherwise this method returns a
+ * vertical extent which is the intersection of the two given extents.
+ *
+ * <p>This method never modify the given extents, but may return directly
one of the given arguments
+ * if it already represents the intersection result.</p>
+ *
+ * <div class="section">Advantage and inconvenient of this method</div>
+ * This method can not intersect extents defined with different datums
because height transformations
+ * generally require the geodetic positions (latitudes and longitudes) of
the heights to transform.
+ * For more general transformations, it is better to convert all extent
components into a single envelope,
+ * then {@linkplain
org.apache.sis.geometry.Envelopes#transform(CoordinateOperation, Envelope)
transform
+ * the envelope at once}. On the other hand, this {@code intersect(…)}
method preserves better
+ * the {@link org.apache.sis.xml.NilReason} (if any).
+ *
+ * @param e1 the first extent, or {@code null}.
+ * @param e2 the second extent, or {@code null}.
+ * @return the intersection (may be any of the {@code e1} or {@code e2}
argument if unchanged),
+ * or {@code null} if the two given extents are null.
+ * @throws MismatchedReferenceSystemException if the two extents do not
use the same datum, ignoring metadata.
+ *
+ * @see DefaultVerticalExtent#intersect(VerticalExtent)
+ *
+ * @since 0.8
+ */
+ public static VerticalExtent intersection(final VerticalExtent e1, final
VerticalExtent e2) {
+ if (e1 == null) return e2;
+ if (e2 == null || e2 == e1) return e1;
+ final DefaultVerticalExtent extent = new DefaultVerticalExtent(e1);
+ extent.intersect(e2);
+ if (extent.equals(e1, ComparisonMode.BY_CONTRACT)) return e1;
+ if (extent.equals(e2, ComparisonMode.BY_CONTRACT)) return e2;
+ return extent;
+ }
+
+ /**
+ * Returns the intersection of the given temporal extents. If any of the
arguments is {@code null},
+ * then this method returns the other argument (which may be null).
Otherwise this method returns a
+ * temporal extent which is the intersection of the two given extents.
+ *
+ * <p>This method never modify the given extents, but may return directly
one of the given arguments
+ * if it already represents the intersection result.</p>
+ *
+ * @param e1 the first extent, or {@code null}.
+ * @param e2 the second extent, or {@code null}.
+ * @return the intersection (may be any of the {@code e1} or {@code e2}
argument if unchanged),
+ * or {@code null} if the two given extents are null.
+ * @throws UnsupportedOperationException if no implementation of {@code
TemporalFactory} has been found
+ * on the classpath.
+ *
+ * @see DefaultTemporalExtent#intersect(TemporalExtent)
+ *
+ * @since 0.8
+ */
+ public static TemporalExtent intersection(final TemporalExtent e1, final
TemporalExtent e2) {
+ if (e1 == null) return e2;
+ if (e2 == null || e2 == e1) return e1;
+ final DefaultTemporalExtent extent = new DefaultTemporalExtent(e1);
+ extent.intersect(e2);
+ if (extent.equals(e1, ComparisonMode.BY_CONTRACT)) return e1;
+ if (extent.equals(e2, ComparisonMode.BY_CONTRACT)) return e2;
+ return extent;
+ }
+
+ /**
+ * Returns the intersection of the given extents. If any of the arguments
is {@code null},
+ * then this method returns the other argument (which may be null).
Otherwise this method
+ * returns an extent which is the intersection of all geographic, vertical
and temporal
+ * elements in the two given extents.
+ *
+ * <p>This method never modify the given extents, but may return directly
one of the given
+ * arguments if it already represents the intersection result.</p>
+ *
+ * @param e1 the first extent, or {@code null}.
+ * @param e2 the second extent, or {@code null}.
+ * @return the intersection (may be any of the {@code e1} or {@code e2}
argument if unchanged),
+ * or {@code null} if the two given extents are null.
+ * @throws IllegalArgumentException if two elements to intersect are not
compatible (e.g. mismatched
+ * {@linkplain DefaultGeographicBoundingBox#getInclusion()
bounding box inclusion status} or
+ * mismatched {@linkplain DefaultVerticalExtent#getVerticalCRS()
vertical datum}).
+ * @throws UnsupportedOperationException if a {@code TemporalFactory} is
required but no implementation
+ * has been found on the classpath.
+ *
+ * @see DefaultExtent#intersect(Extent)
+ *
+ * @since 0.8
+ */
+ public static Extent intersection(final Extent e1, final Extent e2) {
+ if (e1 == null) return e2;
+ if (e2 == null || e2 == e1) return e1;
+ final DefaultExtent extent = new DefaultExtent(e1);
+ extent.intersect(e2);
+ if (extent.equals(e1, ComparisonMode.BY_CONTRACT)) return e1;
+ if (extent.equals(e2, ComparisonMode.BY_CONTRACT)) return e2;
+ return extent;
+ }
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/NameMeaningTest.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/NameMeaningTest.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/NameMeaningTest.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/NameMeaningTest.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -16,10 +16,14 @@
*/
package org.apache.sis.internal.metadata;
+import javax.measure.Unit;
import org.opengis.referencing.cs.*;
import org.opengis.referencing.crs.*;
import org.opengis.referencing.datum.*;
import org.opengis.referencing.ReferenceSystem;
+import org.opengis.referencing.operation.OperationMethod;
+import org.opengis.referencing.operation.CoordinateOperation;
+import org.opengis.parameter.ParameterDescriptor;
import org.apache.sis.test.DependsOnMethod;
import org.apache.sis.test.TestCase;
import org.junit.Test;
@@ -41,19 +45,23 @@ public final strictfp class NameMeaningT
*/
@Test
public void testToObjectType() {
- assertEquals("crs", NameMeaning.toObjectType(GeographicCRS
.class));
- assertEquals("crs", NameMeaning.toObjectType(ProjectedCRS
.class));
- assertEquals("crs", NameMeaning.toObjectType(VerticalCRS
.class));
- assertEquals("crs", NameMeaning.toObjectType(TemporalCRS
.class));
- assertEquals("datum", NameMeaning.toObjectType(GeodeticDatum
.class));
- assertEquals("datum", NameMeaning.toObjectType(VerticalDatum
.class));
- assertEquals("datum", NameMeaning.toObjectType(TemporalDatum
.class));
- assertEquals("ellipsoid", NameMeaning.toObjectType(Ellipsoid
.class));
- assertEquals("meridian", NameMeaning.toObjectType(PrimeMeridian
.class));
- assertEquals("cs", NameMeaning.toObjectType(EllipsoidalCS
.class));
- assertEquals("cs", NameMeaning.toObjectType(CartesianCS
.class));
- assertEquals("axis",
NameMeaning.toObjectType(CoordinateSystemAxis.class));
- assertEquals("referenceSystem",
NameMeaning.toObjectType(ReferenceSystem .class));
+ assertEquals("crs",
NameMeaning.toObjectType(GeographicCRS .class));
+ assertEquals("crs",
NameMeaning.toObjectType(ProjectedCRS .class));
+ assertEquals("crs",
NameMeaning.toObjectType(VerticalCRS .class));
+ assertEquals("crs",
NameMeaning.toObjectType(TemporalCRS .class));
+ assertEquals("datum",
NameMeaning.toObjectType(GeodeticDatum .class));
+ assertEquals("datum",
NameMeaning.toObjectType(VerticalDatum .class));
+ assertEquals("datum",
NameMeaning.toObjectType(TemporalDatum .class));
+ assertEquals("ellipsoid", NameMeaning.toObjectType(Ellipsoid
.class));
+ assertEquals("meridian",
NameMeaning.toObjectType(PrimeMeridian .class));
+ assertEquals("cs",
NameMeaning.toObjectType(EllipsoidalCS .class));
+ assertEquals("cs",
NameMeaning.toObjectType(CartesianCS .class));
+ assertEquals("axis",
NameMeaning.toObjectType(CoordinateSystemAxis.class));
+ assertEquals("referenceSystem",
NameMeaning.toObjectType(ReferenceSystem .class));
+ assertEquals("coordinateOperation",
NameMeaning.toObjectType(CoordinateOperation .class));
+ assertEquals("method",
NameMeaning.toObjectType(OperationMethod .class));
+ assertEquals("parameter",
NameMeaning.toObjectType(ParameterDescriptor .class));
+ assertEquals("uom", NameMeaning.toObjectType(Unit
.class));
}
/**
@@ -64,7 +72,9 @@ public final strictfp class NameMeaningT
@Test
@DependsOnMethod("testToObjectType")
public void testToURN() {
+ assertEquals("urn:ogc:def:crs:EPSG::4326",
NameMeaning.toURN(GeodeticCRS.class, "EPSG", null, "4326"));
assertEquals("urn:ogc:def:crs:OGC:1.3:CRS84",
NameMeaning.toURN(GeographicCRS.class, "CRS", null, "84"));
assertEquals("urn:ogc:def:datum:EPSG::6326",
NameMeaning.toURN(GeodeticDatum.class, "EPSG", null, "6326"));
+ assertNull ("Authority is not optional.",
NameMeaning.toURN(GeographicCRS.class, null, null, "4326"));
}
}
Modified:
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/sql/TestDatabase.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/sql/TestDatabase.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/sql/TestDatabase.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/sql/TestDatabase.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -16,12 +16,9 @@
*/
package org.apache.sis.internal.metadata.sql;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.sis.util.Debug;
-import org.apache.sis.internal.system.DataDirectory;
import static org.junit.Assume.*;
@@ -77,21 +74,6 @@ public final strictfp class TestDatabase
}
/**
- * Returns the path to the directory of the given name in {@code
$SIS_DATA/Databases}.
- * If the directory is not found, then the test will be interrupted by an
{@code org.junit.Assume} statement.
- *
- * @param name the name of the sub-directory.
- * @return the path to the given sub-directory.
- */
- public static Path directory(final String name) {
- Path dir = DataDirectory.DATABASES.getDirectory();
- assumeNotNull("$SIS_DATA/Databases directory not found.", dir);
- dir = dir.resolve(name);
- assumeTrue("Specified directory not found.", Files.isDirectory(dir));
- return dir;
- }
-
- /**
* Creates a Derby database in memory. If no Derby or JavaDB driver is not
found,
* then the test will be interrupted by an {@code org.junit.Assume}
statement.
*
Modified:
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -17,12 +17,16 @@
package org.apache.sis.metadata.iso.extent;
import java.net.URL;
+import java.util.Arrays;
import java.io.IOException;
import javax.xml.bind.JAXBException;
+import org.opengis.metadata.extent.Extent;
+import org.apache.sis.util.iso.SimpleInternationalString;
import org.apache.sis.xml.IdentifierSpace;
+import org.apache.sis.xml.Namespaces;
+import org.apache.sis.xml.NilObject;
import org.apache.sis.test.XMLTestCase;
import org.apache.sis.test.DependsOn;
-import org.apache.sis.xml.Namespaces;
import org.junit.Test;
import static org.apache.sis.test.Assert.*;
@@ -34,7 +38,7 @@ import static org.apache.sis.test.TestUt
*
* @author Cédric Briançon (Geomatys)
* @author Martin Desruisseaux (Geomatys)
- * @version 0.6
+ * @version 0.8
* @since 0.3
* @module
*/
@@ -58,6 +62,40 @@ public final strictfp class DefaultExten
}
/**
+ * Tests {@link DefaultExtent#intersect(Extent)}.
+ */
+ @Test
+ public void testIntersect() {
+ final DefaultGeographicBoundingBox bounds1 = new
DefaultGeographicBoundingBox(10, 20, 30, 40);
+ final DefaultGeographicBoundingBox bounds2 = new
DefaultGeographicBoundingBox(16, 18, 31, 42);
+ final DefaultGeographicBoundingBox clip = new
DefaultGeographicBoundingBox(15, 25, 26, 32);
+ final DefaultGeographicBoundingBox expected1 = new
DefaultGeographicBoundingBox(15, 20, 30, 32);
+ final DefaultGeographicBoundingBox expected2 = new
DefaultGeographicBoundingBox(16, 18, 31, 32);
+ final DefaultExtent e1 = new DefaultExtent("Somewhere", bounds1, null,
null);
+ final DefaultExtent e2 = new DefaultExtent("Somewhere", clip, null,
null);
+ e1.getGeographicElements().add(bounds2);
+ e1.intersect(e2);
+ assertEquals("description", "Somewhere",
e1.getDescription().toString());
+ assertFalse("isNil(description)", e1.getDescription() instanceof
NilObject);
+ assertArrayEquals("geographicElements", new
DefaultGeographicBoundingBox[] {
+ expected1, expected2
+ }, e1.getGeographicElements().toArray());
+ /*
+ * Change the description and test again. That description should be
considered missing
+ * because we have a mismatch. Also change abounding box in such a way
that there is no
+ * intersection. That bounding box should be omitted.
+ */
+ bounds2.setBounds(8, 12, 33, 35);
+ e1.setGeographicElements(Arrays.asList(bounds1, bounds2));
+ e2.setDescription(new SimpleInternationalString("Somewhere else"));
+ e1.intersect(e2);
+ assertTrue("isNil(description)", e1.getDescription() instanceof
NilObject);
+ assertArrayEquals("geographicElements", new
DefaultGeographicBoundingBox[] {
+ expected1
+ }, e1.getGeographicElements().toArray());
+ }
+
+ /**
* Tests the (un)marshalling of a {@code <gmd:EX_Extent>} object.
* This test opportunistically tests setting {@code "gml:id"} value.
*
Modified:
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/ExtentsTest.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/ExtentsTest.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/ExtentsTest.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/ExtentsTest.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -23,7 +23,10 @@ import javax.measure.Unit;
import javax.measure.UnitConverter;
import javax.measure.IncommensurableException;
import org.opengis.geometry.DirectPosition;
+import org.opengis.metadata.extent.Extent;
+import org.opengis.metadata.extent.VerticalExtent;
import org.opengis.metadata.extent.GeographicBoundingBox;
+import org.opengis.referencing.operation.TransformException;
import org.apache.sis.measure.Units;
import org.apache.sis.measure.MeasurementRange;
import org.apache.sis.test.mock.VerticalCRSMock;
@@ -47,7 +50,7 @@ import static org.junit.Assert.*;
* @since 0.4
* @module
*/
-@DependsOn(DefaultGeographicBoundingBoxTest.class)
+@DependsOn({DefaultGeographicBoundingBoxTest.class, DefaultExtentTest.class})
public final strictfp class ExtentsTest extends TestCase {
/**
* One minute of angle, in degrees.
@@ -97,13 +100,45 @@ public final strictfp class ExtentsTest
* Tests {@link Extents#intersection(GeographicBoundingBox,
GeographicBoundingBox)}.
*/
@Test
- public void testIntersection() {
+ public void testGeographicIntersection() {
final GeographicBoundingBox b1 = new DefaultGeographicBoundingBox(10,
20, 30, 40);
final GeographicBoundingBox b2 = new DefaultGeographicBoundingBox(15,
25, 26, 32);
- assertEquals(new DefaultGeographicBoundingBox(15, 20, 30, 32),
Extents.intersection(b1, b2));
- assertSame(b1, Extents.intersection(b1, null));
+ assertEquals("intersect", new DefaultGeographicBoundingBox(15,
20, 30, 32), Extents.intersection(b1, b2));
+ assertSame(b1, Extents.intersection(b1, null));
assertSame(b2, Extents.intersection(null, b2));
- assertNull( Extents.intersection(null, null));
+ assertNull( Extents.intersection((GeographicBoundingBox) null,
(GeographicBoundingBox) null));
+ }
+
+ /**
+ * Tests {@link Extents#intersection(VerticalExtent, VerticalExtent)}.
+ * This test does not perform any unit conversion, because it would
require the use of different CRS.
+ * For a test with unit conversion, see {@code
ServicesForMetadataTest.testVerticalIntersection()} in
+ * {@code sis-referencing} module.
+ *
+ * @throws TransformException should never happen since we do not test
transformation in this class.
+ */
+ @Test
+ public void testVerticalIntersection() throws TransformException {
+ final VerticalExtent e1 = new DefaultVerticalExtent(10, 20, null);
+ final VerticalExtent e2 = new DefaultVerticalExtent(15, 25, null);
+ assertEquals("intersect", new DefaultVerticalExtent(15, 20, null),
Extents.intersection(e1, e2));
+ assertSame(e1, Extents.intersection(e1, null));
+ assertSame(e2, Extents.intersection(null, e2));
+ assertNull( Extents.intersection((VerticalExtent) null,
(VerticalExtent) null));
+ }
+
+ /**
+ * Tests {@link Extents#intersection(Extent, Extent)}.
+ * This test is subject to the same limitation than {@link
#testVerticalIntersection()}.
+ */
+ @Test
+ public void testExtentIntersection() {
+ final Extent e1 = new DefaultExtent(null, new
DefaultGeographicBoundingBox(10, 20, 30, 40), new DefaultVerticalExtent(10, 20,
null), null);
+ final Extent e2 = new DefaultExtent(null, new
DefaultGeographicBoundingBox(15, 25, 26, 32), new DefaultVerticalExtent(15, 25,
null), null);
+ assertEquals( new DefaultExtent(null, new
DefaultGeographicBoundingBox(15, 20, 30, 32), new DefaultVerticalExtent(15, 20,
null), null), Extents.intersection(e1, e2));
+ assertSame(e1, Extents.intersection(e1, null));
+ assertSame(e2, Extents.intersection(null, e2));
+ assertNull( Extents.intersection((Extent) null, (Extent) null));
}
/**
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -170,7 +170,7 @@ public final class Code {
Identifier fallback = null;
for (final Identifier identifier : identifiers) {
final String code = identifier.getCode();
- if (code == null) continue; // Paranoiac check.
+ if (code == null) continue;
// Paranoiac check.
if (code.regionMatches(true, 0, "urn:", 0, 4)) {
return new Code(identifier);
}
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -297,15 +297,14 @@ public final class ReferencingUtilities
* </ul></div>
*
* @param object the identified object to view as a properties map.
- * @param excludes the keys of properties to exclude from the map.
* @return a view of the identified object properties.
*
* @see IdentifiedObjects#getProperties(IdentifiedObject, String...)
*
* @since 0.7
*/
- public static Map<String,?> getPropertiesForModifiedCRS(final
IdentifiedObject object, final String... excludes) {
- final Map<String,?> properties =
IdentifiedObjects.getProperties(object, excludes);
+ public static Map<String,?> getPropertiesForModifiedCRS(final
IdentifiedObject object) {
+ final Map<String,?> properties =
IdentifiedObjects.getProperties(object, IdentifiedObject.IDENTIFIERS_KEY);
final Identifier id = (Identifier)
properties.get(IdentifiedObject.NAME_KEY);
if (id != null) {
String name = id.getCode();
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -68,6 +68,11 @@ public final class Resources extends Ind
public static final short AmbiguousEllipsoid_1 = 1;
/**
+ * Can not create objects of type ‘{0}’ from combined URI.
+ */
+ public static final short CanNotCombineUriAsType_1 = 79;
+
+ /**
* Can not compute the coordinate operation derivative.
*/
public static final short CanNotComputeDerivative = 2;
@@ -78,7 +83,7 @@ public final class Resources extends Ind
public static final short CanNotConcatenateTransforms_2 = 3;
/**
- * Can not create an object of group “{1}” as an instance of class
‘{0}’.
+ * Can not create an object of type “{1}” as an instance of class
‘{0}’.
*/
public static final short CanNotCreateObjectAsInstanceOf_2 = 4;
@@ -98,6 +103,11 @@ public final class Resources extends Ind
public static final short CanNotMapAxisToDirection_1 = 6;
/**
+ * Can not parse component {1} in the combined {0,choice,0#URN|1#URL}.
+ */
+ public static final short CanNotParseCombinedReference_2 = 78;
+
+ /**
* Target dimension {0} depends on excluded source dimensions.
*/
public static final short CanNotSeparateTargetDimension_1 = 7;
@@ -427,6 +437,11 @@ public final class Resources extends Ind
public static final short SingularMatrix = 63;
/**
+ * Combined URI contains unexpected components.
+ */
+ public static final short UnexpectedComponentInURI = 80;
+
+ /**
* Unexpected dimension for a coordinate system of type ‘{0}’.
*/
public static final short UnexpectedDimensionForCS_1 = 64;
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
[ISO-8859-1] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
[ISO-8859-1] Mon Oct 16 10:01:46 2017
@@ -42,12 +42,14 @@ NonConformCRS_3 = The
#
# Error messages (to be used in exceptions)
#
-CanNotConcatenateTransforms_2 = Can not concatenate transforms
\u201c{0}\u201d and \u201c{1}\u201d.
+CanNotCombineUriAsType_1 = Can not create objects of type
\u2018{0}\u2019 from combined URI.
CanNotComputeDerivative = Can not compute the coordinate operation
derivative.
-CanNotCreateObjectAsInstanceOf_2 = Can not create an object of group
\u201c{1}\u201d as an instance of class \u2018{0}\u2019.
+CanNotConcatenateTransforms_2 = Can not concatenate transforms
\u201c{0}\u201d and \u201c{1}\u201d.
+CanNotCreateObjectAsInstanceOf_2 = Can not create an object of type
\u201c{1}\u201d as an instance of class \u2018{0}\u2019.
CanNotInferGridSizeFromValues_1 = Can not infer a grid size from the given
values in {0} range.
CanNotInstantiateGeodeticObject_1 = Can not instantiate geodetic object for
\u201c{0}\u201d.
CanNotMapAxisToDirection_1 = Can not map an axis from the specified
coordinate system to the \u201c{0}\u201d direction.
+CanNotParseCombinedReference_2 = Can not parse component {1} in the
combined {0,choice,0#URN|1#URL}.
CanNotSeparateTargetDimension_1 = Target dimension {0} depends on excluded
source dimensions.
CanNotTransformEnvelopeToGeodetic = Can not transform envelope to a geodetic
reference system.
CanNotUseGeodeticParameters_2 = Can not use the {0} geodetic parameters:
{1}
@@ -96,6 +98,7 @@ NoSuchOperationMethod_1 = No o
ParameterNotFound_2 = No parameter named \u201c{1}\u201d has
been found in \u201c{0}\u201d.
RecursiveCreateCallForCode_2 = Recursive call while creating an object of
type \u2018{0}\u2019 for code \u201c{1}\u201d.
SingularMatrix = Matrix is singular.
+UnexpectedComponentInURI = Combined URI contains unexpected
components.
UnexpectedDimensionForCS_1 = Unexpected dimension for a coordinate
system of type \u2018{0}\u2019.
UnitlessParameter_1 = Parameter \u201c{0}\u201d does not expect
unit.
UnknownAuthority_1 = Authority \u201c{0}\u201d is unknown.
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
[ISO-8859-1] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
[ISO-8859-1] Mon Oct 16 10:01:46 2017
@@ -47,13 +47,15 @@ NonConformCRS_3 = La d
#
# Error messages (to be used in exceptions)
#
-CanNotConcatenateTransforms_2 = Les transformations
\u00ab\u202f{0}\u202f\u00bb et \u00ab\u202f{1}\u202f\u00bb ne peuvent pas
\u00eatre combin\u00e9es.
+CanNotCombineUriAsType_1 = Ne peut pas cr\u00e9er d\u2019objets de
type \u2018{0}\u2019 \u00e0 partir d\u2019un URI combin\u00e9.
CanNotComputeDerivative = La d\u00e9riv\u00e9 de
l\u2019op\u00e9ration sur les coordonn\u00e9es ne peut pas \u00eatre
calcul\u00e9e.
-CanNotCreateObjectAsInstanceOf_2 = Ne peut pas cr\u00e9er un objet du groupe
\u00ab\u202f{1}\u202f\u00bb comme une instance de la classe \u2018{0}\u2019.
+CanNotConcatenateTransforms_2 = Les transformations
\u00ab\u202f{0}\u202f\u00bb et \u00ab\u202f{1}\u202f\u00bb ne peuvent pas
\u00eatre combin\u00e9es.
+CanNotCreateObjectAsInstanceOf_2 = Ne peut pas cr\u00e9er un objet du type
\u00ab\u202f{1}\u202f\u00bb comme une instance de la classe \u2018{0}\u2019.
CanNotInferGridSizeFromValues_1 = Ne peut pas inf\u00e9rer une taille de
grille \u00e0 partir des valeurs donn\u00e9es dans la plage {0}.
CanNotInstantiateGeodeticObject_1 = Ne peut pas cr\u00e9er l\u2019objet
g\u00e9od\u00e9tique pour \u00ab\u202f{0}\u202f\u00bb.
CanNotMapAxisToDirection_1 = Aucun axe du syst\u00e8me de
coordonn\u00e9es sp\u00e9cifi\u00e9 n\u2019a pu \u00eatre associ\u00e9 \u00e0
la direction \u00ab\u202f{0}\u202f\u00bb.
CanNotSeparateTargetDimension_1 = La dimension de destination {0}
d\u00e9pend de dimensions sources qui ont \u00e9t\u00e9 exclues.
+CanNotParseCombinedReference_2 = Ne peut pas d\u00e9coder la composante {1}
dans l\u2019{0,choice,0#URN|1#URL} combin\u00e9.
CanNotTransformEnvelopeToGeodetic = Ne peut pas transformer l\u2019enveloppe
vers un r\u00e9f\u00e9rentiel g\u00e9od\u00e9sique.
CanNotUseGeodeticParameters_2 = Ne peut pas utiliser les param\u00e8tres
g\u00e9od\u00e9siques {0}\u202f: {1}
ColinearAxisDirections_2 = Les directions d\u2019axes {0} et {1} sont
colin\u00e9aires.
@@ -101,6 +103,7 @@ NoSuchOperationMethod_1 = Aucu
ParameterNotFound_2 = Aucun param\u00e8tre nomm\u00e9
\u00ab\u202f{1}\u202f\u00bb n\u2019a \u00e9t\u00e9 trouv\u00e9 dans
\u00ab\u202f{0}\u202f\u00bb.
RecursiveCreateCallForCode_2 = Appels r\u00e9cursifs lors de la
cr\u00e9ation d\u2019un objet de type \u2018{0}\u2019 pour le code
\u00ab\u202f{1}\u202f\u00bb.
SingularMatrix = La matrice est singuli\u00e8re.
+UnexpectedComponentInURI = L\u2019URI combin\u00e9 contient des
composantes qui n\u2019\u00e9taient pas attendues.
UnexpectedDimensionForCS_1 = Dimension inattendue pour un syst\u00e8me
de coordonn\u00e9es de type \u2018{0}\u2019.
UnitlessParameter_1 = Le param\u00e8tre
\u00ab\u202f{0}\u202f\u00bb n\u2019attend pas d\u2019unit\u00e9.
UnknownAuthority_1 = L\u2019autorit\u00e9
\u00ab\u202f{0}\u202f\u00bb n\u2019est pas reconnue.
Modified:
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java?rev=1812269&r1=1812268&r2=1812269&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java
[UTF-8] Mon Oct 16 10:01:46 2017
@@ -664,6 +664,8 @@ public final class ServicesForMetadata e
* If the given properties are empty and the {@code mtFactory} is the
system default, then this method
* returns the system default {@code CoordinateOperationFactory} instead
of creating a new one.
*
+ * <p>It is okay to set all parameters to {@code null} in order to get the
system default factory.</p>
+ *
* @param properties the default properties.
* @param mtFactory the math transform factory to use.
* @param crsFactory the factory to use if the operation factory needs
to create CRS for intermediate steps.