This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 194ed455ba61b6d5596b8bb501719a594dfb0d86
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Thu Apr 4 14:53:45 2024 +0200

    Resolve deprecation warnings about 
`AuthorityFactory.getDescriptionText(String)`.
---
 .../sis/openoffice/ReferencingFunctions.java       |  4 +-
 .../main/org/apache/sis/io/wkt/WKTDictionary.java  | 20 ++++--
 .../org/apache/sis/referencing/DisplayName.java    | 84 ++++++++++++++++++++++
 .../apache/sis/referencing/IdentifiedObjects.java  | 24 ++++++-
 .../referencing/factory/AuthorityFactoryProxy.java | 22 +++---
 .../factory/CommonAuthorityFactory.java            | 30 ++++----
 .../factory/ConcurrentAuthorityFactory.java        | 11 +--
 .../factory/GeodeticAuthorityFactory.java          | 41 ++++++++---
 .../factory/IdentifiedObjectFinder.java            |  4 +-
 .../factory/MultiAuthoritiesFactory.java           | 14 ++--
 .../referencing/factory/sql/AuthorityCodes.java    |  8 +--
 .../referencing/factory/sql/EPSGDataAccess.java    | 37 ++++++----
 .../sis/referencing/factory/sql/package-info.java  |  2 +-
 .../sis/referencing/internal/EPSGFactoryProxy.java |  8 ++-
 .../org/apache/sis/io/wkt/WKTDictionaryTest.java   | 20 ++++--
 .../sis/referencing/AuthorityFactoriesTest.java    | 17 +++--
 .../factory/CommonAuthorityFactoryTest.java        | 18 +++--
 .../factory/MultiAuthoritiesFactoryTest.java       |  2 +-
 .../referencing/factory/sql/EPSGFactoryTest.java   | 12 ++--
 .../report/CoordinateReferenceSystems.java         |  2 +-
 .../org/apache/sis/storage/netcdf/base/Axis.java   |  2 +-
 .../apache/sis/storage/netcdf/base/Linearizer.java |  5 +-
 .../main/org/apache/sis/storage/wkt/Store.java     |  5 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |  3 +-
 24 files changed, 293 insertions(+), 102 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
 
b/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
index 5221e076d8..2701a8bf28 100644
--- 
a/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
+++ 
b/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
@@ -173,8 +173,8 @@ public class ReferencingFunctions extends CalcAddins 
implements XReferencing {
             if (object != null) {
                 return object.getName().getCode();
             }
-            // In Apache SIS implementation, 'getDescriptionText' returns the 
name.
-            name = 
CRS.getAuthorityFactory(null).getDescriptionText(codeOrPath);
+            // In Apache SIS implementation, `getDescriptionText(…)` returns 
the identified object name.
+            name = 
CRS.getAuthorityFactory(null).getDescriptionText(IdentifiedObject.class, 
codeOrPath).orElse(null);
         } catch (Exception exception) {
             return getLocalizedMessage(exception);
         }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTDictionary.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTDictionary.java
index d64321c788..fdbf241c8a 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTDictionary.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTDictionary.java
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Stream;
 import java.util.function.Predicate;
 import java.util.function.Consumer;
@@ -38,6 +39,7 @@ import org.opengis.util.InternationalString;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.referencing.IdentifiedObject;
 import org.opengis.referencing.NoSuchAuthorityCodeException;
+import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.factory.GeodeticAuthorityFactory;
 import org.apache.sis.referencing.factory.FactoryDataException;
 import org.apache.sis.referencing.privy.ReferencingUtilities;
@@ -128,7 +130,7 @@ import org.opengis.metadata.Identifier;
  * {@link org.apache.sis.referencing.factory.sql.EPSGFactory}.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.5
  * @since   1.1
  */
 public class WKTDictionary extends GeodeticAuthorityFactory {
@@ -957,25 +959,31 @@ public class WKTDictionary extends 
GeodeticAuthorityFactory {
     /**
      * Gets a description of the object corresponding to a code.
      *
+     * @param  type  the type of object for which to get a description.
      * @param  code  value allocated by authority.
      * @return a description of the object, or {@code null} if {@code null} if 
none.
      * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
      * @throws FactoryException if the query failed for some other reason.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code) throws 
FactoryException {
-        final String text;
+    public Optional<InternationalString> getDescriptionText(Class<? extends 
IdentifiedObject> type, final String code)
+            throws FactoryException
+    {
+        final InternationalString name;
         final Object value = getOrCreate(code, false);
         if (value instanceof IdentifiedObject) {
-            text = ((IdentifiedObject) value).getName().getCode();
+            name = IdentifiedObjects.getDisplayName((IdentifiedObject) value);
         } else {
-            text = String.valueOf(value);
+            final String text = String.valueOf(value);
             if (!(value instanceof StoredTree)) {
                 // Exception message saved in a previous invocation of 
`getOrCreate(…)`.
                 throw new FactoryException(text);
             }
+            name = new SimpleInternationalString(text);
         }
-        return new SimpleInternationalString(text);
+        return Optional.ofNullable(name);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/DisplayName.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/DisplayName.java
new file mode 100644
index 0000000000..7c2df264c4
--- /dev/null
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/DisplayName.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.referencing;
+
+import java.util.Locale;
+import java.io.Serializable;
+import org.opengis.referencing.IdentifiedObject;
+import org.apache.sis.util.AbstractInternationalString;
+
+
+/**
+ * Name of an identified object in specified locale.
+ * This class is serializable if the identified object is serializable.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @version 1.5
+ * @since   1.5
+ */
+final class DisplayName extends AbstractInternationalString implements 
Serializable {
+    /**
+     * For cross-version compatibility.
+     */
+    private static final long serialVersionUID = 8061637252049031838L;
+
+    /**
+     * The object for which to provide a display name.
+     */
+    @SuppressWarnings("serial")             // Most Apache SIS implementations 
are serializable.
+    private final IdentifiedObject object;
+
+    /**
+     * Creates a new display name.
+     *
+     * @param object  the object for which to provide a display name.
+     */
+    DisplayName(final IdentifiedObject object) {
+        this.object = object;
+    }
+
+    /**
+     * Returns the display name in the given locale.
+     *
+     * @param  locale  the desired locale for the string to be returned.
+     * @return the string in the given locale if available, or in an
+     *         implementation-dependent fallback locale otherwise.
+     */
+    @Override
+    public String toString(final Locale locale) {
+        return IdentifiedObjects.getDisplayName(object, locale);
+    }
+
+    /**
+     * Returns a hash code value for this international string.
+     */
+    @Override
+    public int hashCode() {
+        return object.hashCode() ^ (int) serialVersionUID;
+    }
+
+    /**
+     * Compares this international string with the given object for equality.
+     *
+     * @param  obj  the object to compare with this international string.
+     * @return whether the two object are equal.
+     */
+    @Override
+    public boolean equals(final Object obj) {
+        return (obj instanceof DisplayName) && object.equals(((DisplayName) 
obj).object);
+    }
+}
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/IdentifiedObjects.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/IdentifiedObjects.java
index ffe186657b..5a374cdaef 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/IdentifiedObjects.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/IdentifiedObjects.java
@@ -62,7 +62,7 @@ import org.opengis.referencing.ObjectDomain;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 1.4
+ * @version 1.5
  *
  * @see CRS
  * @see org.apache.sis.geometry.Envelopes
@@ -368,7 +368,8 @@ public final class IdentifiedObjects extends Static {
     }
 
     /**
-     * Returns a name that can be used for display purpose. This method checks 
the non-blank
+     * Returns a name that can be used for display purposes.
+     * This method checks the non-blank
      * {@linkplain AbstractIdentifiedObject#getName() name},
      * {@linkplain AbstractIdentifiedObject#getAlias() alias} or
      * {@linkplain AbstractIdentifiedObject#getIdentifiers() identifier}, in 
that order.
@@ -382,9 +383,28 @@ public final class IdentifiedObjects extends Static {
      * its {@link GenericName#toInternationalString() toInternationalString()} 
method will be used.</p>
      *
      * @param  object  the identified object, or {@code null}.
+     * @return a name for human reading, or {@code null} if the given object 
is null.
+     *
+     * @see #getDisplayName(IdentifiedObject, Locale)
+     *
+     * @since 1.5
+     */
+    public static InternationalString getDisplayName(final IdentifiedObject 
object) {
+        return (object == null) ? null : new DisplayName(object);
+    }
+
+    /**
+     * Returns a name that can be used for display purposes in the specified 
locale.
+     * Invoking this method is equivalent to invoking {@code 
getDisplayName(object).toString(locale)},
+     * except that the {@code object} argument can be null and the creation of 
an intermediate
+     * {@link InternationalString} object is avoided.
+     *
+     * @param  object  the identified object, or {@code null}.
      * @param  locale  the locale for the name to return, or {@code null} for 
the default.
      * @return a name for human reading, or {@code null} if none were found.
      *
+     * @see #getDisplayName(IdentifiedObject)
+     *
      * @since 1.1
      */
     public static String getDisplayName(final IdentifiedObject object, final 
Locale locale) {
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
index d1a3b4e3b2..4f7a0b5c3d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
@@ -35,11 +35,11 @@ import org.apache.sis.util.privy.Strings;
 
 /**
  * Delegates object creations to one of the {@code create} methods in a 
backing {@code AuthorityFactory}.
- * It is possible to use the generic {@link 
AuthorityFactory#createObject(String)} method instead of this class,
- * but some factories are more efficient when we use the most specific {@code 
create} method.
+ * It is possible to use the generic {@link 
GeodeticAuthorityFactory#createObject(String)} method instead of this class,
+ * but the former is ambiguous and some factories are more efficient when we 
use the most specific {@code create} method.
  * For example, when using a {@linkplain 
org.apache.sis.referencing.factory.sql.EPSGDataAccess},
  * invoking {@link GeodeticAuthorityFactory#createProjectedCRS(String)} 
instead of
- * {@code AuthorityFactory.createObject(String)} method reduce the number of 
tables to be queried.
+ * {@code createObject(String)} method reduce the number of tables to be 
queried.
  *
  * <p>This class is useful when the same {@code create} method need to be 
invoked often, but is unknown at compile time.
  * It may also be used as a workaround for authority factories that do not 
implement the {@code createObject(String)}
@@ -172,17 +172,20 @@ abstract class AuthorityFactoryProxy<T> {
     abstract T createFromAPI(AuthorityFactory factory, String code) throws 
FactoryException;
 
     /**
-     * The proxy for the {@link 
GeodeticAuthorityFactory#getDescriptionText(String)} method.
+     * The proxy for the {@link 
GeodeticAuthorityFactory#getDescriptionText(Class, String)} method.
+     *
+     * @param  classe  the type of object for which to get a description.
      */
-    static final AuthorityFactoryProxy<InternationalString> DESCRIPTION =
-        new 
AuthorityFactoryProxy<InternationalString>(InternationalString.class, 
AuthorityFactoryIdentifier.ANY) {
+    static final AuthorityFactoryProxy<InternationalString> description(final 
Class<? extends IdentifiedObject> classe) {
+        return new 
AuthorityFactoryProxy<InternationalString>(InternationalString.class, 
AuthorityFactoryIdentifier.ANY) {
             @Override InternationalString createFromAPI(AuthorityFactory 
factory, String code) throws FactoryException {
-                return factory.getDescriptionText(code);
+                return factory.getDescriptionText(classe, code).orElse(null);
             }
             @Override AuthorityFactoryProxy<InternationalString> 
specialize(String typeName) {
                 return this;
             }
-    };
+        };
+    }
 
     /**
      * The proxy for the {@link GeodeticAuthorityFactory#createObject(String)} 
method.
@@ -587,8 +590,7 @@ abstract class AuthorityFactoryProxy<T> {
         PARAMETER,
         UNIT,
         EXTENT,
-        OBJECT,
-        DESCRIPTION
+        OBJECT
     };
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
index f59ba79dc0..76a29a557f 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
@@ -22,13 +22,12 @@ import java.util.List;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Objects;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
 import org.opengis.util.FactoryException;
 import org.opengis.util.InternationalString;
-import org.opengis.util.GenericName;
-import org.opengis.metadata.Identifier;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.referencing.IdentifiedObject;
 import org.opengis.referencing.NoSuchAuthorityCodeException;
@@ -42,16 +41,17 @@ import org.opengis.referencing.crs.TemporalCRS;
 import org.opengis.referencing.crs.SingleCRS;
 import org.opengis.referencing.cs.CartesianCS;
 import org.apache.sis.referencing.CommonCRS;
+import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.referencing.cs.CoordinateSystems;
 import org.apache.sis.referencing.operation.provider.TransverseMercator.Zoner;
 import org.apache.sis.referencing.privy.GeodeticObjectBuilder;
 import org.apache.sis.referencing.internal.Resources;
 import org.apache.sis.metadata.iso.citation.Citations;
 import org.apache.sis.util.SimpleInternationalString;
 import org.apache.sis.util.privy.Constants;
-import org.apache.sis.measure.Units;
-import org.apache.sis.referencing.cs.CoordinateSystems;
 import org.apache.sis.util.logging.Logging;
 import org.apache.sis.util.resources.Errors;
+import org.apache.sis.measure.Units;
 
 
 /**
@@ -206,7 +206,7 @@ import org.apache.sis.util.resources.Errors;
  * switching to polar stereographic projections for high latitudes.</p>
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.3
+ * @version 1.5
  *
  * @see CommonCRS
  *
@@ -237,7 +237,7 @@ public class CommonAuthorityFactory extends 
GeodeticAuthorityFactory implements
      * Names of objects in the AUTO(2) namespace for codes from 42001 to 42005 
inclusive.
      * Those names are defined in annexes B.7 to B.11 of WMS 1.3 specification.
      *
-     * @see #getDescriptionText(String)
+     * @see #getDescriptionText(Class, String)
      */
     private static final String[] PROJECTION_NAMES = {
         "WGS 84 / Auto UTM",
@@ -409,19 +409,24 @@ public class CommonAuthorityFactory extends 
GeodeticAuthorityFactory implements
      *   <tr><td>{@code AUTO2:42001,1,-100,45}</td> <td>WGS 84 / UTM zone 
47N</td></tr>
      * </table>
      *
+     * @param  type  the type of object for which to get a description.
      * @param  code  value in the CRS or AUTO(2) code space.
      * @return a description of the object.
      * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
      * @throws FactoryException if an error occurred while fetching the 
description.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code) throws 
FactoryException {
+    public Optional<InternationalString> getDescriptionText(final Class<? 
extends IdentifiedObject> type, final String code)
+            throws FactoryException
+    {
         final CommonAuthorityCode parsed = new CommonAuthorityCode(code);
         if (parsed.isNumeric && parsed.isParameterless()) {
             /*
              * For codes in the "AUTO(2)" namespace without parameters, we 
cannot rely on the default implementation
              * because it would fail to create the ProjectedCRS instance. 
Instead, we return a generic description.
-             * Note that we do not execute this block if parametes were 
specified. If there are parameters,
+             * Note that we do not execute this block if parameters were 
specified. If there are parameters,
              * then we instead rely on the default implementation for a more 
accurate description text.
              * Note also that we do not restrict to "AUTOx" namespaces because 
erroneous namespaces exist
              * in practice and the numerical codes are non-ambiguous (at least 
in current version).
@@ -434,19 +439,14 @@ public class CommonAuthorityFactory extends 
GeodeticAuthorityFactory implements
             }
             final int i = codeValue - FIRST_PROJECTION_CODE;
             if (i >= 0 && i < PROJECTION_NAMES.length) {
-                return new SimpleInternationalString(PROJECTION_NAMES[i]);
+                return Optional.of(new 
SimpleInternationalString(PROJECTION_NAMES[i]));
             }
         }
         /*
          * Fallback on fetching the full CRS, then request its name.
          * It will include the parsing of parameters if any.
          */
-        final Identifier name = createCoordinateReferenceSystem(code, 
parsed).getName();
-        if (name instanceof GenericName) {
-            return ((GenericName) name).tip().toInternationalString();
-        } else {
-            return new SimpleInternationalString(name.getCode());
-        }
+        return 
Optional.ofNullable(IdentifiedObjects.getDisplayName(createCoordinateReferenceSystem(code,
 parsed)));
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
index 739f775e5e..f32cffccf1 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
@@ -20,6 +20,7 @@ import java.util.Set;
 import java.util.Map;
 import java.util.List;
 import java.util.Deque;
+import java.util.Optional;
 import java.util.Iterator;
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -96,7 +97,7 @@ import org.apache.sis.system.Shutdown;
  * Subclasses should select the interfaces that they choose to implement.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.4
+ * @version 1.5
  *
  * @param <DAO>  the type of factory used as Data Access Object (DAO).
  *
@@ -794,7 +795,7 @@ public abstract class ConcurrentAuthorityFactory<DAO 
extends GeodeticAuthorityFa
      * The default implementation performs the following steps:
      * <ol>
      *   <li>get an instance of the Data Access Object,</li>
-     *   <li>delegate to its {@link 
GeodeticAuthorityFactory#getDescriptionText(String)} method,</li>
+     *   <li>delegate to its {@link 
GeodeticAuthorityFactory#getDescriptionText(Class, String)} method,</li>
      *   <li>release the Data Access Object.</li>
      * </ol>
      *
@@ -803,14 +804,16 @@ public abstract class ConcurrentAuthorityFactory<DAO 
extends GeodeticAuthorityFa
      *         corresponding to the specified {@code code} has no description.
      * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
      * @throws FactoryException if the query failed for some other reason.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code)
+    public Optional<InternationalString> getDescriptionText(Class<? extends 
IdentifiedObject> type, String code)
             throws NoSuchAuthorityCodeException, FactoryException
     {
         final DAO factory = getDataAccess();
         try {
-            return factory.getDescriptionText(code);
+            return factory.getDescriptionText(type, code);
         } finally {
             release("getDescriptionText", InternationalString.class, code);
         }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
index b6a2d18e12..981f93e539 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
@@ -17,6 +17,7 @@
 package org.apache.sis.referencing.factory;
 
 import java.util.Set;
+import java.util.Optional;
 import java.util.logging.Logger;
 import javax.measure.Unit;
 import org.opengis.referencing.*;
@@ -32,10 +33,10 @@ import org.opengis.util.FactoryException;
 import org.opengis.util.InternationalString;
 import org.apache.sis.metadata.iso.citation.Citations;
 import org.apache.sis.system.Loggers;
-import org.apache.sis.util.SimpleInternationalString;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.Classes;
 import org.apache.sis.util.privy.Constants;
+import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.AbstractIdentifiedObject;
 import org.apache.sis.referencing.privy.ReferencingUtilities;
 import org.apache.sis.util.iso.AbstractFactory;
@@ -151,20 +152,43 @@ public abstract class GeodeticAuthorityFactory extends 
AbstractFactory implement
      * The description can be used for example in a combo box in a graphical 
user interface.
      *
      * <h4>Default implementation</h4>
-     * The default implementation invokes {@link #createObject(String)} for 
the given code
-     * and returns the {@linkplain AbstractIdentifiedObject#getName() object 
name}.
-     * This may be costly since it involves a full object creation.
+     * The default implementation invokes {@link #createObject(Class, String)} 
for the given class and code,
+     * then returns the {@linkplain 
IdentifiedObjects#getDisplayName(IdentifiedObject) display name} of the object.
+     * This implementation may be costly because it involves a full object 
creation.
      * Subclasses are encouraged to provide a more efficient implementation if 
they can.
      *
+     * @param  type  the type of object for which to get a description.
      * @param  code  value allocated by authority.
-     * @return a description of the object, or {@code null} if the object
-     *         corresponding to the specified {@code code} has no description.
+     * @return a description of the object, or empty if the object exists but 
has no description.
      * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
      * @throws FactoryException if an error occurred while fetching the 
description.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code) throws 
FactoryException {
-        return new 
SimpleInternationalString(createObject(code).getName().getCode());
+    public Optional<InternationalString> getDescriptionText(Class<? extends 
IdentifiedObject> type, String code)
+            throws FactoryException
+    {
+        return 
Optional.ofNullable(IdentifiedObjects.getDisplayName(createObject(type, code)));
+    }
+
+    /**
+     * Returns an object of the specified type from a code. This 
implementation forwards
+     * the method call to the most specialized methods determined by the given 
type.
+     *
+     * @param  <T>   the compile-time value of the {@code type} argument.
+     * @param  type  the type of object to create.
+     * @param  code  value allocated by authority.
+     * @return the object for the given code.
+     * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
+     * @throws FactoryException if the object creation failed for some other 
reason.
+     *
+     * @since 1.5
+     */
+    public final <T extends IdentifiedObject> T createObject(final Class<T> 
type, final String code)
+            throws NoSuchAuthorityCodeException, FactoryException
+    {
+        return cast(type, (IdentifiedObject) 
AuthorityFactoryProxy.getInstance(type).create(this, code), code);
     }
 
     /**
@@ -188,6 +212,7 @@ public abstract class GeodeticAuthorityFactory extends 
AbstractFactory implement
      * @see org.apache.sis.referencing.AbstractIdentifiedObject
      */
     @Override
+    @SuppressWarnings("deprecation")
     public abstract IdentifiedObject createObject(String code) throws 
NoSuchAuthorityCodeException, FactoryException;
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
index 7ca72b494f..280e655457 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
@@ -292,8 +292,8 @@ public class IdentifiedObjectFinder {
      *
      * <ul>
      *   <li>If the specified object contains {@linkplain 
AbstractIdentifiedObject#getIdentifiers() identifiers}
-     *       associated to the same authority as the factory, then those 
identifiers are used for
-     *       {@linkplain GeodeticAuthorityFactory#createObject(String) 
creating objects} to be tested.</li>
+     *       associated to the same authority as the factory, then those 
identifiers are used for creating the
+     *       objects to be compared by calls to a {@code create<Type>(String)} 
method.</li>
      *   <li>If the authority factory can create objects from their 
{@linkplain AbstractIdentifiedObject#getName() name}
      *       in addition of identifiers, then the name and {@linkplain 
AbstractIdentifiedObject#getAlias() aliases} are
      *       used for creating objects to be tested.</li>
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
index 86b7a4eec9..ca2bcea3de 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.factory;
 
+import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.Collections;
 import java.util.Collection;
@@ -868,13 +869,18 @@ public class MultiAuthoritiesFactory extends 
GeodeticAuthorityFactory implements
      *   <li>{@code http://www.opengis.net/gml/srs/}<var>authority</var>{@code 
.xml#}<var>code</var></li>
      * </ul>
      *
-     * @return a description of the object, or {@code null} if the object
-     *         corresponding to the specified {@code code} has no description.
+     * @param  type  the type of object for which to get a description.
+     * @param  code  value allocated by authority.
+     * @return a description of the object, or empty if the object 
corresponding to the specified code has no description.
      * @throws FactoryException if an error occurred while fetching the 
description.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code) throws 
FactoryException {
-        return create(AuthorityFactoryProxy.DESCRIPTION, code);
+    public Optional<InternationalString> getDescriptionText(Class<? extends 
IdentifiedObject> type, String code)
+            throws FactoryException
+    {
+        return 
Optional.ofNullable(create(AuthorityFactoryProxy.description(type), code));
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
index 69cb4dd813..a226b0cad9 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/AuthorityCodes.java
@@ -254,7 +254,7 @@ final class AuthorityCodes extends 
AbstractMap<String,String> implements Seriali
     /**
      * Returns the object name associated to the given authority code, or 
{@code null} if none.
      * If there is no name for the {@linkplain #type} of object being queried, 
then this method
-     * returns the code itself.
+     * returns {@code null}.
      *
      * @param  code  the code for which to get the description. May be a 
string or an integer.
      * @return the description for the given code, or {@code null} if none.
@@ -279,9 +279,9 @@ final class AuthorityCodes extends 
AbstractMap<String,String> implements Seriali
                             sql[ONE] = null;    // Not needed anymore.
                         }
                         statement.setInt(1, n);
-                        try (ResultSet results = statement.executeQuery()) {
-                            while (results.next()) {
-                                String name = results.getString(1);
+                        try (ResultSet r = statement.executeQuery()) {
+                            while (r.next()) {
+                                String name = r.getString(1);
                                 if (name != null) {
                                     return name;
                                 }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index c8dfceab68..8f17efbc4d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@ -30,6 +30,7 @@ import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.LogRecord;
@@ -159,7 +160,7 @@ import org.opengis.metadata.Identifier;
  * @author  Matthias Basler
  * @author  Andrea Aime (TOPP)
  * @author  Johann Sorel (Geomatys)
- * @version 1.4
+ * @version 1.5
  *
  * @see <a 
href="https://sis.apache.org/tables/CoordinateReferenceSystems.html";>List of 
authority codes</a>
  *
@@ -541,12 +542,12 @@ addURIs:    for (int i=0; ; i++) {
      * Returns a map of EPSG authority codes as keys and object names as 
values.
      * The cautions documented in {@link #getAuthorityCodes(Class)} apply also 
to this map.
      *
-     * @todo We may need to give some public access to this map if callers 
need descriptions
-     *       for other kinds of object than CRS. Current {@link 
#getDescriptionText(String)}
-     *       implementation selects CRS if the same code is used by many kinds 
of objects.
+     * @param  type  the spatial reference objects type (may be {@code 
Object.class}).
+     * @return the map of authority codes associated to their names. May be an 
empty map.
+     * @throws FactoryException if access to the underlying database failed.
      *
      * @see #getAuthorityCodes(Class)
-     * @see #getDescriptionText(String)
+     * @see #getDescriptionText(Class, String)
      */
     private synchronized Map<String,String> getCodeMap(final Class<?> type) 
throws SQLException {
         CloseableReference reference = authorityCodes.get(type);
@@ -627,18 +628,24 @@ addURIs:    for (int i=0; ; i++) {
      * Gets a description of the object corresponding to a code.
      * This method returns the object name in a lightweight manner, without 
creating the full {@link IdentifiedObject}.
      *
+     * @param  type  the type of object for which to get a description.
      * @param  code  value allocated by authority.
-     * @return the object name, or {@code null} if the object corresponding to 
the specified {@code code} has no name.
-     * @throws NoSuchAuthorityCodeException if the specified {@code code} was 
not found.
+     * @return the object name, or empty if none.
      * @throws FactoryException if the query failed for some other reason.
+     *
+     * @since 1.5
      */
     @Override
-    public InternationalString getDescriptionText(final String code) throws 
NoSuchAuthorityCodeException, FactoryException {
+    public Optional<InternationalString> getDescriptionText(final Class<? 
extends IdentifiedObject> type, final String code)
+            throws FactoryException
+    {
         try {
             for (final TableInfo table : TableInfo.EPSG) {
-                final String text = getCodeMap(table.type).get(code);
-                if (text != null) {
-                    return (table.nameColumn != null) ? new 
SimpleInternationalString(text) : null;
+                if (table.nameColumn != null && 
type.isAssignableFrom(table.type)) {
+                    final String text = getCodeMap(table.type).get(code);
+                    if (text != null) {
+                        return Optional.of(new 
SimpleInternationalString(text));
+                    }
                 }
             }
         } catch (SQLException exception) {
@@ -646,7 +653,7 @@ addURIs:    for (int i=0; ; i++) {
         } catch (BackingStoreException exception) {       // Cause is 
SQLException.
             throw new FactoryException(exception.getLocalizedMessage(), 
exception.getCause());
         }
-        throw noSuchAuthorityCode(IdentifiedObject.class, code);
+        return Optional.empty();
     }
 
     /**
@@ -686,7 +693,7 @@ addURIs:    for (int i=0; ; i++) {
 
     /**
      * Converts EPSG codes or EPSG names to the numerical identifiers (the 
primary keys).
-     * This method could be seen as the converse of above {@link 
#getDescriptionText(String)} method.
+     * This method can be seen as the converse of above {@link 
#getDescriptionText(Class, String)} method.
      *
      * @param  table       the table where the code should appears, or {@code 
null} if {@code codeColumn} is null.
      * @param  codeColumn  the column name for the codes, or {@code null} if 
none.
@@ -1233,8 +1240,8 @@ codes:  for (int i=0; i<codes.length; i++) {
      * for example {@link #createCoordinateReferenceSystem(String)}, {@link 
#createDatum(String)}, <i>etc.</i>
      * until a successful one is found.
      *
-     * <p><strong>Note that this method may be ambiguous</strong> since the 
same EPSG code can be used for different
-     * kinds of objects. This method throws an exception if it detects an 
ambiguity on a <em>best-effort</em> basis.
+     * <p><strong>Note that this method may be ambiguous</strong> because the 
same EPSG code can be used for different
+     * kinds of objects. This method throws an exception on a 
<em>best-effort</em> basis if it detects an ambiguity.
      * It is recommended to invoke the most specific {@code createFoo(String)} 
method when the desired type is known,
      * both for performance reason and for avoiding ambiguity.</p>
      *
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/package-info.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/package-info.java
index 31db366080..5bf31094cb 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/package-info.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/package-info.java
@@ -83,7 +83,7 @@
  * @author  Jody Garnett (Refractions)
  * @author  Didier Richard (IGN)
  * @author  John Grange
- * @version 1.4
+ * @version 1.5
  *
  * @see org.apache.sis.metadata.sql
  *
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
index b4419ca81a..d6eaeb701f 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
@@ -17,6 +17,7 @@
 package org.apache.sis.referencing.internal;
 
 import java.util.Set;
+import java.util.Optional;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.referencing.AuthorityFactory;
 import org.opengis.referencing.IdentifiedObject;
@@ -58,11 +59,14 @@ public abstract class EPSGFactoryProxy implements 
AuthorityFactory {
     }
 
     @Override
-    public final InternationalString getDescriptionText(String code) throws 
FactoryException {
-        return factory().getDescriptionText(code);
+    public final Optional<InternationalString> getDescriptionText(Class<? 
extends IdentifiedObject> type, String code)
+            throws FactoryException
+    {
+        return factory().getDescriptionText(type, code);
     }
 
     @Override
+    @SuppressWarnings("deprecation")
     public final IdentifiedObject createObject(String code) throws 
FactoryException {
         return factory().createObject(code);
     }
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTDictionaryTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTDictionaryTest.java
index e46ccd6f0b..d937e32a3d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTDictionaryTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTDictionaryTest.java
@@ -150,8 +150,8 @@ public final class WKTDictionaryTest extends TestCase {
          * Test descriptions before CRS creation.
          * Implementation fetches them from `StoredTree` instances.
          */
-        assertEquals("North_Pole_Stereographic", 
factory.getDescriptionText("ESRI::102018").toString());
-        assertEquals("South_Pole_Stereographic", 
factory.getDescriptionText("ESRI::102021").toString());
+        assertDescriptionEquals("North_Pole_Stereographic", factory, 
"ESRI::102018");
+        assertDescriptionEquals("South_Pole_Stereographic", factory, 
"ESRI::102021");
         /*
          * Tests CRS creation.
          */
@@ -163,8 +163,8 @@ public final class WKTDictionaryTest extends TestCase {
          * Test descriptions after CRS creation.
          * Implementation fetches them from `IdentifiedObject` instances.
          */
-        assertEquals("North_Pole_Stereographic", 
factory.getDescriptionText("ESRI::102018").toString());
-        assertEquals("South_Pole_Stereographic", 
factory.getDescriptionText("ESRI::102021").toString());
+        assertDescriptionEquals("North_Pole_Stereographic", factory, 
"ESRI::102018");
+        assertDescriptionEquals("South_Pole_Stereographic", factory, 
"ESRI::102021");
         /*
          * Test creation of CRS having errors.
          *   - Verify error index.
@@ -173,11 +173,23 @@ public final class WKTDictionaryTest extends TestCase {
         verifyErroneousCRS(factory, "E2", 42);
     }
 
+    /**
+     * Asserts that the description is equal to the expected value.
+     *
+     * @param expected  the expected description.
+     * @param factory   the factory to use for fetching the description.
+     * @param code      the code of the object for which to fetch the 
description.
+     */
+    private static void assertDescriptionEquals(String expected, WKTDictionary 
factory, String code) throws FactoryException {
+        assertEquals(expected, 
factory.getDescriptionText(IdentifiedObject.class, 
code).orElseThrow().toString());
+    }
+
     /**
      * Verifies that there is no duplicated nodes in the {@link StoredTree}s.
      * When a WKT element is repeated often (e.g. "AngleUnit["Degree", 
0.0174532925199433]]"),
      * only one {@link org.apache.sis.io.wkt.StoredTree.Node} instance should 
be created and shared by all trees.
      */
+    @SuppressWarnings("overloads")      // Ambiguous `andThen(…)` method is 
not used by this test.
     private static final class SharedValuesCheck implements Consumer<Object>, 
BiFunction<Integer,Integer,Integer> {
         /**
          * Counter of number of occurrences of each instance. Keys may be 
{@link String},
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
index 501b05bf8c..7b24a3965d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
@@ -77,18 +77,27 @@ public final class AuthorityFactoriesTest extends 
TestCaseWithLogs {
     }
 
     /**
-     * Tests {@link CRSAuthorityFactory#getDescriptionText(String)}.
+     * Tests {@link CRSAuthorityFactory#getDescriptionText(Class, String)}.
      *
      * @throws FactoryException if the EPSG:4326 name cannot be obtained.
      */
     @Test
     public void testGetDescriptionText() throws FactoryException {
-        final CRSAuthorityFactory factory = AuthorityFactories.ALL;
-        assertEquals("WGS 84", 
factory.getDescriptionText("EPSG:4326").toString());
-        assertEquals("WGS 84", 
factory.getDescriptionText("urn:ogc:def:crs:epsg::4326").toString());
+        assertDescriptionEquals("WGS 84", "EPSG:4326");
+        assertDescriptionEquals("WGS 84", "urn:ogc:def:crs:epsg::4326");
         loggings.assertNoUnexpectedLog();
     }
 
+    /**
+     * Asserts that the description is equal to the expected value.
+     *
+     * @param expected  the expected description.
+     * @param code      the code of the object for which to fetch the 
description.
+     */
+    private void assertDescriptionEquals(String expected, String code) throws 
FactoryException {
+        assertEquals(expected, 
AuthorityFactories.ALL.getDescriptionText(IdentifiedObject.class, 
code).orElseThrow().toString());
+    }
+
     /**
      * Tests creation of {@code CRS:84} from various codes.
      *
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
index e21daa6b2b..08182cb292 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
@@ -130,15 +130,25 @@ public final class CommonAuthorityFactoryTest extends 
TestCase {
     }
 
     /**
-     * Tests {@link CommonAuthorityFactory#getDescriptionText(String)}.
+     * Tests {@link CommonAuthorityFactory#getDescriptionText(Class, String)}.
      *
      * @throws FactoryException if an error occurred while creating a CRS.
      */
     @Test
     public void testDescription() throws FactoryException {
-        assertEquals("WGS 84",                
factory.getDescriptionText("CRS:84").toString());
-        assertEquals("WGS 84 / Auto UTM",     
factory.getDescriptionText("AUTO:42001").toString());
-        assertEquals("WGS 84 / UTM zone 10S", 
factory.getDescriptionText("AUTO:42001,-124,-10").toString());
+        assertDescriptionEquals("WGS 84",                "CRS:84");
+        assertDescriptionEquals("WGS 84 / Auto UTM",     "AUTO:42001");
+        assertDescriptionEquals("WGS 84 / UTM zone 10S", 
"AUTO:42001,-124,-10");
+    }
+
+    /**
+     * Asserts that the description is equal to the expected value.
+     *
+     * @param expected  the expected description.
+     * @param code      the code of the object for which to fetch the 
description.
+     */
+    private void assertDescriptionEquals(String expected, String code) throws 
FactoryException {
+        assertEquals(expected, 
factory.getDescriptionText(CoordinateReferenceSystem.class, 
code).orElseThrow().toString());
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
index f1576ffbcb..e57be20fd2 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
@@ -192,7 +192,7 @@ public final class MultiAuthoritiesFactoryTest extends 
TestCaseWithLogs {
         assertSame(HardCodedDatum.SPHERE,               
factory.createGeodeticDatum("MOCK: 0:6047"));
         assertSame(Extents       .WORLD,                factory.createExtent   
    ("MOCK: 2.3 : 1262"));
         assertSame(Units         .METRE,                factory.createUnit     
    (" MoCK : : 9001 "));
-        assertEquals("Greenwich", 
factory.getDescriptionText("MOCK:8901").toString());
+        assertEquals("Greenwich", 
factory.getDescriptionText(IdentifiedObject.class, 
"MOCK:8901").get().toString());
 
         var e = assertThrows(NoSuchAuthorityFactoryException.class,
                 () -> factory.createGeodeticDatum("MOCK2:4326"),
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/sql/EPSGFactoryTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/sql/EPSGFactoryTest.java
index 2350ce52b4..3cc0a49e78 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/sql/EPSGFactoryTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/sql/EPSGFactoryTest.java
@@ -710,18 +710,18 @@ public final class EPSGFactoryTest extends 
TestCaseWithLogs {
     }
 
     /**
-     * Tests the {@link EPSGDataAccess#getDescriptionText(String)} method.
+     * Tests the {@link EPSGDataAccess#getDescriptionText(class, String)} 
method.
      *
      * @throws FactoryException if an error occurred while querying the 
factory.
      */
     @Test
     public void testDescriptionText() throws FactoryException {
         final EPSGFactory factory = dataEPSG.factory();
-        assertEquals("World Geodetic System 1984", factory.getDescriptionText( 
"6326").toString(Locale.US));
-        assertEquals("Mean Sea Level",             factory.getDescriptionText( 
"5100").toString(Locale.US));
-        assertEquals("NTF (Paris) / Nord France",  
factory.getDescriptionText("27591").toString(Locale.US));
-        assertEquals("NTF (Paris) / France II",    
factory.getDescriptionText("27582").toString(Locale.US));
-        assertEquals("Ellipsoidal height",         factory.getDescriptionText( 
  "84").toString(Locale.US));
+        assertEquals("World Geodetic System 1984", 
factory.getDescriptionText(IdentifiedObject.class,  
"6326").get().toString(Locale.US));
+        assertEquals("Mean Sea Level",             
factory.getDescriptionText(IdentifiedObject.class,  
"5100").get().toString(Locale.US));
+        assertEquals("NTF (Paris) / Nord France",  
factory.getDescriptionText(IdentifiedObject.class, 
"27591").get().toString(Locale.US));
+        assertEquals("NTF (Paris) / France II",    
factory.getDescriptionText(IdentifiedObject.class, 
"27582").get().toString(Locale.US));
+        assertEquals("Ellipsoidal height",         
factory.getDescriptionText(IdentifiedObject.class,    
"84").get().toString(Locale.US));
         loggings.assertNoUnexpectedLog();
     }
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
index 14fbad016d..05bcffd341 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
@@ -584,7 +584,7 @@ public final class CoordinateReferenceSystems extends 
AuthorityCodesReport {
         }
         final Row row = super.createRow(code, exception);
         try {
-            row.name = factory.getDescriptionText(code).toString(getLocale());
+            row.name = 
factory.getDescriptionText(CoordinateReferenceSystem.class, 
code).get().toString(getLocale());
         } catch (FactoryException e) {
             Logging.unexpectedException(null, 
CoordinateReferenceSystems.class, "createRow", e);
         }
diff --git 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
index 0f1799a1e0..c0ccbf3514 100644
--- 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
+++ 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
@@ -870,7 +870,7 @@ public final class Axis extends NamedElement {
              * at `LocalizationGridException` construction time.
              */
             for (final Linearizer linearizer : linearizers) {
-                final CharSequence reason = 
linearizer.getPotentialCause(coordinates);
+                final CharSequence reason = linearizer.getPotentialCause();
                 if (reason != null) {
                     ex.setPotentialCause(reason);
                     break;          // Take the cause of the linearizer that 
had the highest priority.
diff --git 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Linearizer.java
 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Linearizer.java
index cccd73b7b9..95f1ca3c54 100644
--- 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Linearizer.java
+++ 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Linearizer.java
@@ -178,12 +178,11 @@ public final class Linearizer {
      * If this linearizer can give a probable reason why it failed to compute 
the localization grid, returns that reason.
      * Otherwise returns {@code null}.
      *
-     * @param  owner  for fetching localized resources.
      * @return potential error cause, or {@code null} if unknown.
      */
-    final InternationalString getPotentialCause(final Node owner) {
+    final InternationalString getPotentialCause() {
         if (longitudeSpan >= 180 - 6) {         // 180° of longitude minus a 
UTM zone width.
-            final String name = IdentifiedObjects.getDisplayName(targetCRS, 
owner.getLocale());
+            final InternationalString name = 
IdentifiedObjects.getDisplayName(targetCRS);
             return 
Resources.formatInternational(Resources.Keys.GridLongitudeSpanTooWide_2,
                                                  longitudeSpan, (name != null) 
? name : type);
         }
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/Store.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/Store.java
index 7ecb16f8b1..afed1b8705 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/Store.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/Store.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.text.ParsePosition;
 import java.text.ParseException;
 import org.opengis.metadata.Metadata;
+import org.opengis.util.InternationalString;
 import org.opengis.referencing.ReferenceSystem;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataStoreException;
@@ -152,13 +153,13 @@ final class Store extends URIDataStore {
         if (metadata == null) {
             parse();
             final MetadataBuilder builder = new MetadataBuilder();
-            String name = null;
+            InternationalString name = null;
             int count = 0;
             for (final Object object : objects) {
                 if (object instanceof ReferenceSystem) {
                     final ReferenceSystem rs = (ReferenceSystem) object;
                     builder.addReferenceSystem(rs);
-                    name = IdentifiedObjects.getDisplayName(rs, getLocale());
+                    name = IdentifiedObjects.getDisplayName(rs);
                     count++;
                     builder.addIdentifier(IdentifiedObjects.getIdentifier(rs, 
null), MetadataBuilder.Scope.RESOURCE);
                 }
diff --git 
a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/AuthorityCodes.java
 
b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/AuthorityCodes.java
index bdbd05dce4..92e0c60078 100644
--- 
a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/AuthorityCodes.java
+++ 
b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/AuthorityCodes.java
@@ -392,7 +392,8 @@ final class AuthorityCodes extends ObservableListBase<Code>
             for (final Code code : snapshot) {
                 String text;
                 try {
-                    text = 
Strings.trimOrNull(Types.toString(factory.getDescriptionText(code.code), 
locale));
+                    var i18n = 
factory.getDescriptionText(CoordinateReferenceSystem.class, 
code.code).orElse(null);
+                    text = Strings.trimOrNull(Types.toString(i18n, locale));
                     if (text == null) {
                         text = 
Vocabulary.forLocale(locale).getString(Vocabulary.Keys.Unnamed);
                     }

Reply via email to