Author: desruisseaux
Date: Sat Oct 14 21:39:11 2017
New Revision: 1812207
URL: http://svn.apache.org/viewvc?rev=1812207&view=rev
Log:
IdentifiedObjects.lookupURN(…) should be able to create combined URI.
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java?rev=1812207&r1=1812206&r2=1812207&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
[UTF-8] Sat Oct 14 21:39:11 2017
@@ -18,6 +18,7 @@ package org.apache.sis.referencing;
import java.util.Map;
import java.util.Set;
+import java.util.List;
import java.util.LinkedHashSet;
import java.util.Iterator;
import java.util.Collection;
@@ -28,7 +29,9 @@ import org.opengis.util.FactoryException
import org.opengis.metadata.Identifier;
import org.opengis.metadata.citation.Citation;
import org.opengis.referencing.IdentifiedObject;
+import org.opengis.referencing.crs.CompoundCRS;
import org.opengis.referencing.operation.CoordinateOperation;
+import org.opengis.referencing.operation.ConcatenatedOperation;
import org.apache.sis.util.Static;
import org.apache.sis.util.CharSequences;
@@ -36,6 +39,7 @@ import org.apache.sis.util.ArgumentCheck
import org.apache.sis.util.logging.Logging;
import org.apache.sis.util.iso.DefaultNameSpace;
import org.apache.sis.internal.util.Constants;
+import org.apache.sis.internal.util.DefinitionURI;
import org.apache.sis.internal.system.Modules;
import org.apache.sis.internal.metadata.NameMeaning;
import org.apache.sis.internal.metadata.NameToIdentifier;
@@ -53,7 +57,7 @@ import static org.apache.sis.internal.ut
*
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Guilhem Legal (Geomatys)
- * @version 0.7
+ * @version 0.8
*
* @see CRS
* @see org.apache.sis.geometry.Envelopes
@@ -379,7 +383,7 @@ public final class IdentifiedObjects ext
}
/**
- * Looks up a URN, such as {@code "urn:ogc:def:crs:EPSG:8.2:4326"}, of the
specified object.
+ * Looks up a URN, such as {@code "urn:ogc:def:crs:EPSG:9.1:4326"}, of the
specified object.
* This method searches in all {@linkplain
org.apache.sis.referencing.factory.GeodeticAuthorityFactory geodetic
* authority factories} known to SIS for an object {@linkplain
org.apache.sis.util.ComparisonMode#APPROXIMATIVE
* approximatively equals} to the specified object. If such an object is
found, then the URN for the given
@@ -411,9 +415,59 @@ public final class IdentifiedObjects ext
* @since 0.7
*/
public static String lookupURN(final IdentifiedObject object, final
Citation authority) throws FactoryException {
+ if (object == null) {
+ return null;
+ }
+ IdentifiedObjectFinder finder;
+ try {
+ finder = newFinder(Citations.getCodeSpace(authority));
+ } catch (NoSuchAuthorityFactoryException e) {
+ warning("lookupURN", e);
+ finder = newFinder(null);
+ }
+ String urn = lookupURN(object, authority, finder);
+ if (urn != null) {
+ return urn;
+ }
+ /*
+ * If we didn't found a URN but the given object is made of smaller
components, build a combined URN.
+ * Example: "urn:ogc:def:crs, crs:EPSG::27700, crs:EPSG::5701"
(without spaces actually).
+ */
+ final List<? extends IdentifiedObject> components;
+ if (object instanceof CompoundCRS) {
+ components = CRS.getSingleComponents((CompoundCRS) object);
+ } else if (object instanceof ConcatenatedOperation) {
+ components = ((ConcatenatedOperation) object).getOperations();
+ } else {
+ return null;
+ }
+ StringBuilder buffer = null;
+ for (final IdentifiedObject component : components) {
+ urn = lookupURN(component, authority, finder);
+ if (urn == null) {
+ return null;
+ }
+ assert urn.startsWith(DefinitionURI.PREFIX) : urn;
+ if (buffer == null) {
+ buffer = new
StringBuilder(40).append(DefinitionURI.PREFIX).append(DefinitionURI.SEPARATOR)
+
.append(NameMeaning.toObjectType(object.getClass()));
+ }
+ buffer.append(DefinitionURI.COMPONENT_SEPARATOR)
+ .append(urn, DefinitionURI.PREFIX.length() + 1,
urn.length());
+ }
+ return (buffer != null) ? buffer.toString() : null;
+ }
+
+ /**
+ * Implementation of {@link #lookupURN(IdentifiedObject, Citation)},
possibly invoked many times
+ * if the identified object is a {@link CompoundCRS} or {@link
ConcatenatedOperation}.
+ */
+ private static String lookupURN(final IdentifiedObject object, final
Citation authority,
+ final IdentifiedObjectFinder finder)
throws FactoryException
+ {
String urn = null;
if (object != null) {
- for (final IdentifiedObject candidate :
newFinder(null).find(object)) {
+ for (final IdentifiedObject candidate : finder.find(object)) {
String c = toURN(candidate.getClass(),
getIdentifier(candidate, authority));
if (c == null && authority == null) {
/*
@@ -426,6 +480,9 @@ public final class IdentifiedObjects ext
if (c != null) break;
}
}
+ /*
+ * We should find at most one URN. But if we find many, verify
that all of them are consistent.
+ */
if (c != null) {
if (urn != null && !urn.equals(c)) {
return null;
@@ -477,7 +534,7 @@ public final class IdentifiedObjects ext
return null;
}
} catch (NumberFormatException e) {
-
Logging.recoverableException(Logging.getLogger(Modules.REFERENCING),
IdentifiedObjects.class, "lookupEPSG", e);
+ warning("lookupEPSG", e);
}
}
}
@@ -485,6 +542,13 @@ public final class IdentifiedObjects ext
}
/**
+ * Logs a warning for a non-critical error. The callers should have a
fallback.
+ */
+ private static void warning(final String method, final Exception e) {
+ Logging.recoverableException(Logging.getLogger(Modules.REFERENCING),
IdentifiedObjects.class, method, e);
+ }
+
+ /**
* Creates a finder which can be used for looking up unidentified objects.
* This method is an alternative to {@code lookup(…)} methods when more
control are desired.
*
Modified:
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java?rev=1812207&r1=1812206&r2=1812207&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
[UTF-8] Sat Oct 14 21:39:11 2017
@@ -132,7 +132,7 @@ public final class DefinitionURI {
* in {@code "urn:ogc:def:crs,crs:EPSG:9.1:27700,crs:EPSG:9.1:5701"}, the
components are
* {@code "crs:EPSG:9.1:27700"} and {@code "crs:EPSG:9.1:5701"}.</div>
*/
- private static final char COMPONENT_SEPARATOR = ',';
+ public static final char COMPONENT_SEPARATOR = ',';
/**
* The separator between a URL and its first {@linkplain #components}.