Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/ReferencingAssert.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/ReferencingAssert.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/ReferencingAssert.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/ReferencingAssert.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -16,21 +16,29 @@ */ package org.apache.sis.test; +import java.util.Collection; +import java.util.Set; import java.awt.geom.Rectangle2D; import java.awt.geom.RectangularShape; import java.awt.geom.AffineTransform; import javax.measure.unit.Unit; import org.opengis.geometry.Envelope; +import org.opengis.metadata.Identifier; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterDescriptor; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; +import org.opengis.referencing.IdentifiedObject; import org.opengis.referencing.operation.Matrix; import org.opengis.referencing.cs.AxisDirection; import org.opengis.referencing.cs.CoordinateSystemAxis; import org.opengis.referencing.cs.RangeMeaning; +import org.opengis.util.GenericName; +import org.apache.sis.internal.util.Constants; import org.apache.sis.geometry.AbstractEnvelope; import org.apache.sis.geometry.GeneralDirectPosition; +import org.apache.sis.referencing.IdentifiedObjects; +import org.apache.sis.util.iso.DefaultNameSpace; import static java.lang.StrictMath.*; @@ -41,7 +49,7 @@ import static java.lang.StrictMath.*; * * @author Martin Desruisseaux (Geomatys) * @since 0.3 - * @version 0.4 + * @version 0.6 * @module */ public strictfp class ReferencingAssert extends MetadataAssert { @@ -57,6 +65,40 @@ public strictfp class ReferencingAssert } /** + * Asserts that the string representation of the unique identifier of the given object is equals to the given + * EPSG code. As a special case if the given code is 0, then this method verifies that the given object has no + * identifier. + * + * @param code The expected EPSG code, or {@code 0} if we expect no EPSG code. + * @param object The object for which to test the EPSG code. + */ + public static void assertIdentifierEqualsEPSG(final int code, final IdentifiedObject object) { + final Set<Identifier> identifiers = object.getIdentifiers(); + if (code == 0) { + assertTrue("identifiers.isEmpty()", identifiers.isEmpty()); + } else { + assertEquals("identifier", Constants.EPSG + DefaultNameSpace.DEFAULT_SEPARATOR + code, + IdentifiedObjects.toString(TestUtilities.getSingleton(identifiers))); + } + } + + /** + * Asserts that the tip of the unique alias of the given object is equals to the expected value. + * As a special case if the expected value is null, then this method verifies that the given object has no alias. + * + * @param expected The expected alias, or {@code null} if we expect no alias. + * @param object The object for which to test the alias. + */ + public static void assertAliasTipEquals(final String expected, final IdentifiedObject object) { + final Collection<GenericName> aliases = object.getAlias(); + if (expected == null) { + assertTrue("aliases.isEmpty()", aliases.isEmpty()); + } else { + assertEquals("alias", expected, TestUtilities.getSingleton(aliases).tip().toString()); + } + } + + /** * Compares the given coordinate system axis against the expected values. * * @param name The expected axis name code.
Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -26,7 +26,7 @@ import org.junit.BeforeClass; * * @author Martin Desruisseaux (Geomatys) * @since 0.3 - * @version 0.5 + * @version 0.6 * @module */ @Suite.SuiteClasses({ @@ -75,11 +75,16 @@ import org.junit.BeforeClass; org.apache.sis.parameter.ParameterBuilderTest.class, org.apache.sis.parameter.ParameterFormatTest.class, org.apache.sis.parameter.TensorParametersTest.class, + org.apache.sis.parameter.MatrixParametersTest.class, + org.apache.sis.parameter.MatrixParametersAlphaNumTest.class, org.apache.sis.parameter.TensorValuesTest.class, org.apache.sis.referencing.operation.DefaultFormulaTest.class, org.apache.sis.referencing.operation.DefaultOperationMethodTest.class, + org.apache.sis.referencing.operation.transform.OperationMethodSetTest.class, + org.apache.sis.referencing.operation.transform.DefaultMathTransformFactoryTest.class, org.apache.sis.internal.referencing.OperationMethodsTest.class, + org.apache.sis.internal.referencing.provider.AffineTest.class, org.apache.sis.referencing.datum.BursaWolfParametersTest.class, org.apache.sis.referencing.datum.TimeDependentBWPTest.class, Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapEntry.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapEntry.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapEntry.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapEntry.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -73,7 +73,7 @@ final class IdentifierMapEntry extends A */ @Override public String getCodeSpace() { - return Citations.getIdentifier(getAuthority()); + return Citations.getUnicodeIdentifier(getAuthority()); } /** @@ -110,7 +110,7 @@ final class IdentifierMapEntry extends A Immutable(Citation authority, String code) {super(authority, code);} @Override public Citation getAuthority() {return getKey();} @Override public String getCode() {return getValue();} - @Override public String getCodeSpace() {return Citations.getIdentifier(getAuthority());} + @Override public String getCodeSpace() {return Citations.getUnicodeIdentifier(getAuthority());} @Override public String getVersion() {return null;} @Override public InternationalString getDescription() {return null;} } Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/SpecializedIdentifier.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -196,7 +196,7 @@ public final class SpecializedIdentifier */ @Override public String getCodeSpace() { - return Citations.getIdentifier(authority); + return Citations.getUnicodeIdentifier(authority); } /** @@ -264,7 +264,7 @@ public final class SpecializedIdentifier * Formats the given (authority, code) par value in the given buffer. */ static void format(final StringBuilder buffer, final Citation authority, final String code) { - buffer.append(Citations.getIdentifier(authority)).append('='); + buffer.append(Citations.getIdentifier(authority, false)).append('='); final boolean quote = (code != null) && (code.indexOf('[') < 0); if (quote) buffer.append('“'); buffer.append(code); Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jdk8/JDK8.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jdk8/JDK8.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jdk8/JDK8.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jdk8/JDK8.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -16,6 +16,7 @@ */ package org.apache.sis.internal.jdk8; +import java.util.Map; import java.util.Date; import java.util.Calendar; import java.util.GregorianCalendar; @@ -32,7 +33,7 @@ import javax.xml.bind.DatatypeConverter; * * @author Martin Desruisseaux (Geomatys) * @since 0.3 - * @version 0.5 + * @version 0.6 * @module */ public final class JDK8 { @@ -62,6 +63,26 @@ public final class JDK8 { } /** + * Stores the value in the given map, provided that no value were set. + * This implementation presumes that the map can not contain null values. + * + * @param <K> The type of keys. + * @param <V> The type of values. + * @param map The map where to store the value. + * @param key The key for the value to store. + * @param value The value to store. + * @return The previous value, or {@code null} if none. + */ + public static <K,V> V putIfAbsent(final Map<K,V> map, final K key, final V value) { + final V previous = map.put(key, value); + if (previous != null) { + // Restore previous value. + map.put(key, previous); + } + return previous; + } + + /** * Atomically computes and stores the value for the given key. This is a substitute for * {@link ConcurrentMap#compute(java.lang.Object, java.util.function.BiFunction)} * on pre-JDK8 branches. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifiedObject.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -249,8 +249,9 @@ public class SimpleIdentifiedObject impl buffer.append(codespace).append(DefaultNameSpace.DEFAULT_SEPARATOR); } buffer.append(code).append('"'); - if (authority != null) { - buffer.append(", ID[\"").append(Citations.getIdentifier(authority)).append("\"]"); + final String identifier = Citations.getIdentifier(authority, true); + if (identifier != null) { + buffer.append(", ID[\"").append(identifier).append("\"]"); } return buffer.append(']').toString(); } Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifier.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifier.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifier.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/simple/SimpleIdentifier.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -102,7 +102,7 @@ public class SimpleIdentifier implements */ @Override public String getCodeSpace() { - return Citations.getIdentifier(authority); + return Citations.getUnicodeIdentifier(authority); } /** @@ -220,7 +220,7 @@ public class SimpleIdentifier implements */ public String toWKT() { final StringBuilder buffer = new StringBuilder(40).append("ID["); - append(buffer, Citations.getIdentifier(authority)); // Do not invoke getCodeSpace(). + append(buffer, Citations.getIdentifier(authority, true)); // Do not invoke getCodeSpace(). append(buffer.append(", "), code); return buffer.append(']').toString(); } Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -190,6 +190,8 @@ public final class DelayedExecutor exten * Returns {@code true} if this thread seems to be stalled. This method checks the head * of the queue. If the delay for that head has expired and the head is not removed in * the next 5 seconds, then we will presume that the thread is stalled or dead. + * + * @return {@inheritDoc} */ @Override protected boolean isStalled() { Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/LocalizedStaticObject.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/LocalizedStaticObject.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/LocalizedStaticObject.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/system/LocalizedStaticObject.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -29,7 +29,7 @@ import java.lang.annotation.RetentionPol * * If JDK provided listeners allowing SIS to be notified about locale and timezone changes, we would * reset the annotated object to {@code null}. However since those listeners do not exist as of JDK7, - * we use this annotation in the main time for identifying the code which would need to be revisited + * we use this annotation in the meantime for identifying the code which would need to be revisited * if we want to take in account default locale/timezone changes in a future SIS version. * * @author Martin Desruisseaux (Geomatys) Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Citations.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Citations.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Citations.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/Citations.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -38,23 +38,13 @@ import org.apache.sis.internal.jdk7.Obje * defined in the {@link org.apache.sis.metadata.iso.citation.Citations} class, but the actual * implementation is defined here since it is needed by some utility methods. * - * {@section Argument checks} - * Every methods in this class accept {@code null} argument. This is different from the methods - * in the {@link org.apache.sis.metadata.iso.citation.Citations} facade, which perform checks - * against null argument for trapping user errors. - * * @author Martin Desruisseaux (Geomatys) * @since 0.3 - * @version 0.5 + * @version 0.6 * @module */ public final class Citations extends Static { /** - * The {@value} code space. - */ - public static final String EPSG = "EPSG"; - - /** * Do not allows instantiation of this class. */ private Citations() { @@ -74,7 +64,7 @@ public final class Citations extends Sta /** * Returns a "unlocalized" string representation of the given international string, - * or {@code null} if none. This method is used by {@link #getIdentifier(Citation)}, + * or {@code null} if none. This method is used by {@link #getIdentifier(Citation, boolean)}, * which is why we don't want the localized string. */ private static String toString(final InternationalString title) { @@ -82,16 +72,14 @@ public final class Citations extends Sta } /** - * Returns {@code true} if at least one {@linkplain Citation#getTitle() title} or - * {@linkplain Citation#getAlternateTitles() alternate title} in {@code c1} is leniently - * equal to a title or alternate title in {@code c2}. The comparison is case-insensitive - * and ignores every character which is not a {@linkplain Character#isLetterOrDigit(int) - * letter or a digit}. The titles ordering is not significant. + * Returns {@code true} if the two citations have at least one title in common, + * ignoring case and non-alphanumeric characters. + * See {@link org.apache.sis.metadata.iso.citation.Citations#titleMatches(Citation, Citation)} + * for the public documentation of this method. * * @param c1 The first citation to compare, or {@code null}. * @param c2 the second citation to compare, or {@code null}. - * @return {@code true} if both arguments are non-null, and at least one title or - * alternate title matches. + * @return {@code true} if both arguments are non-null, and at least one title or alternate title matches. */ public static boolean titleMatches(final Citation c1, final Citation c2) { if (c1 != null && c2 != null) { @@ -125,14 +113,14 @@ public final class Citations extends Sta } /** - * Returns {@code true} if the {@linkplain Citation#getTitle() title} or any - * {@linkplain Citation#getAlternateTitles() alternate title} in the given citation - * matches the given string. The comparison is case-insensitive and ignores every character - * which is not a {@linkplain Character#isLetterOrDigit(int) letter or a digit}. + * Returns {@code true} if the given citation has at least one title equals to the given string, + * ignoring case and non-alphanumeric characters. + * See {@link org.apache.sis.metadata.iso.citation.Citations#titleMatches(Citation, String)} + * for the public documentation of this method. * * @param citation The citation to check for, or {@code null}. * @param title The title or alternate title to compare, or {@code null}. - * @return {@code true} if both arguments are non-null, and the title or alternate + * @return {@code true} if both arguments are non-null, and the title or an alternate * title matches the given string. */ public static boolean titleMatches(final Citation citation, final CharSequence title) { @@ -164,22 +152,15 @@ public final class Citations extends Sta } /** - * Returns {@code true} if at least one {@linkplain Citation#getIdentifiers() identifier} - * {@linkplain Identifier#getCode() code} in {@code c1} is equal to an identifier code in - * {@code c2}. {@linkplain Identifier#getCodeSpace() Code spaces} are compared only if - * provided in the two identifiers being compared. Comparisons are case-insensitive and ignores - * every character which is not a {@linkplain Character#isLetterOrDigit(int) letter or a digit}. - * The identifier ordering is not significant. - * - * <p>If (and <em>only</em> if) the citations do not contains any identifier, then this method - * fallback on titles comparison using the {@link #titleMatches(Citation,Citation) titleMatches} - * method. This fallback exists for compatibility with client codes using the citation - * {@linkplain Citation#getTitle() titles} without identifiers.</p> + * Returns {@code true} if the two citations have at least one identifier in common, + * ignoring case and non-alphanumeric characters. If and <em>only</em> if the citations + * do not contain any identifier, then this method fallback on titles comparison. + * See {@link org.apache.sis.metadata.iso.citation.Citations#identifierMatches(Citation, Citation)} + * for the public documentation of this method. * * @param c1 The first citation to compare, or {@code null}. * @param c2 the second citation to compare, or {@code null}. - * @return {@code true} if both arguments are non-null, and at least one identifier, - * title or alternate title matches. + * @return {@code true} if both arguments are non-null, and at least one identifier matches. */ public static boolean identifierMatches(Citation c1, Citation c2) { if (c1 != null && c2 != null) { @@ -211,24 +192,16 @@ public final class Citations extends Sta } /** - * Returns {@code true} if at least one {@linkplain Citation#getIdentifiers() identifier} - * in the given citation have a {@linkplain Identifier#getCode() code} matching the given - * one. The comparison is case-insensitive and ignores every character which is not a - * {@linkplain Character#isLetterOrDigit(int) letter or a digit}. - * - * <p>If a match is found, if the given {@code identifier} is non-null and if the code space - * of both objects is non-null, then the code space is also compared.</p> - * - * <p>If (and <em>only</em> if) the citation does not contain any identifier, then this method - * fallback on titles comparison using the {@link #titleMatches(Citation, CharSequence) titleMatches} - * method. This fallback exists for compatibility with client codes using citation - * {@linkplain Citation#getTitle() title} without identifiers.</p> + * Returns {@code true} if the given citation has at least one identifier equals to the given string, + * ignoring case and non-alphanumeric characters. If and <em>only</em> if the citations do not contain + * any identifier, then this method fallback on titles comparison. + * See {@link org.apache.sis.metadata.iso.citation.Citations#identifierMatches(Citation, String)} + * for the public documentation of this method. * * @param citation The citation to check for, or {@code null}. * @param identifier The identifier to compare, or {@code null} to unknown. * @param code The identifier code to compare, or {@code null}. - * @return {@code true} if both arguments are non-null, and the title or alternate title - * matches the given string. + * @return {@code true} if both arguments are non-null, and an identifier matches the given string. */ public static boolean identifierMatches(final Citation citation, final Identifier identifier, final CharSequence code) { if (citation != null && code != null) { @@ -257,39 +230,23 @@ public final class Citations extends Sta /** * Infers an identifier from the given citation, or returns {@code null} if no identifier has been found. - * This method is useful for extracting the namespace from an authority, for example {@code "EPSG"}. - * The implementation performs the following choices: + * This method removes leading and trailing {@linkplain Character#isWhitespace(int) whitespaces}. + * See {@link org.apache.sis.metadata.iso.citation.Citations#getIdentifier(Citation)} + * for the public documentation of this method. * + * <p><b>Which method to use:</b></p> * <ul> - * <li>If the given citation is {@code null}, then this method returns {@code null}.</li> - * <li>Otherwise if the citation contains at least one {@linkplain Citation#getIdentifiers() identifier}, then: - * <ul> - * <li>If at least one identifier is a {@linkplain org.apache.sis.util.CharSequences#isUnicodeIdentifier - * unicode identifier}, then the shortest of those identifiers is returned.</li> - * <li>Otherwise the shortest identifier is returned, despite not being a Unicode identifier.</li> - * </ul></li> - * <li>Otherwise if the citation contains at least one {@linkplain Citation#getTitle() title} or - * {@linkplain Citation#getAlternateTitles() alternate title}, then: - * <ul> - * <li>If at least one title is a {@linkplain org.apache.sis.util.CharSequences#isUnicodeIdentifier - * unicode identifier}, then the shortest of those titles is returned.</li> - * <li>Otherwise the shortest title is returned, despite not being a Unicode identifier.</li> - * </ul></li> - * <li>Otherwise this method returns {@code null}.</li> + * <li>For information purpose (e.g. some {@code toString()} methods), use {@code getIdentifier(…, false)}.</li> + * <li>For WKT formatting, use {@code getIdentifier(…, true)} in order to preserve formatting characters.</li> + * <li>For assigning a value to a {@code codeSpace} field, use {@link #getUnicodeIdentifier(Citation)}.</li> * </ul> * - * <div class="note"><b>Note:</b> - * This method searches in alternate titles as a fallback because ISO specification said - * that those titles are often used for abbreviations.</div> - * - * This method ignores leading and trailing whitespaces of every character sequences. - * Null references, empty character sequences and sequences of whitespaces only are ignored. - * * @param citation The citation for which to get the identifier, or {@code null}. + * @param strict {@code true} for returning a non-null value only if the identifier is a valid Unicode identifier. * @return A non-empty identifier for the given citation without leading or trailing whitespaces, * or {@code null} if the given citation is null or does not declare any identifier or title. */ - public static String getIdentifier(final Citation citation) { + public static String getIdentifier(final Citation citation, final boolean strict) { boolean isUnicode = false; // Whether 'identifier' is a Unicode identifier. String identifier = null; if (citation != null) { @@ -340,6 +297,66 @@ public final class Citations extends Sta } } } + return (isUnicode || !strict) ? identifier : null; + } + + /** + * Infers a valid Unicode identifier from the given citation, or returns {@code null} if none. + * This method removes {@linkplain Character#isIdentifierIgnorable(int) ignorable characters}. + * See {@link org.apache.sis.metadata.iso.citation.Citations#getUnicodeIdentifier(Citation)} + * for the public documentation of this method. + * + * {@section When to use} + * Use this method when assigning values to be returned by methods like {@link Identifier#getCodeSpace()}, + * since those values are likely to be compared without special care about ignorable identifier characters. + * But if the intend is to format a more complex string like WKT or {@code toString()}, then we suggest to + * use {@code getIdentifier(citation, true)} instead, which will produce the same result but preserving the + * ignorable characters, which can be useful for formatting purpose. + * + * @param citation The citation for which to get the Unicode identifier, or {@code null}. + * @return A non-empty Unicode identifier for the given citation without leading or trailing whitespaces, + * or {@code null} if the given citation is null or does not have any Unicode identifier or title. + * + * @since 0.6 + */ + public static String getUnicodeIdentifier(final Citation citation) { + final String identifier = getIdentifier(citation, true); + if (identifier != null) { + /* + * First perform a quick check to see if there is any ignorable characters. + * We make this check because those characters are valid according Unicode + * but not according XML. However there is usually no such characters, so + * we will avoid the StringBuilder creation in the vast majority of times. + * + * Note that 'µ' and its friends are not ignorable, so we do not remove them. + * This method is "getUnicodeIdentifier", not "getXmlIdentifier". + */ + final int length = identifier.length(); + for (int i=0; i<length;) { + int c = identifier.codePointAt(i); + int n = Character.charCount(c); + if (Character.isIdentifierIgnorable(c)) { + /* + * Found an ignorable character. Create the buffer and copy non-ignorable characters. + * Following algorithm is inefficient, since we fill the buffer character-by-character + * (a more efficient approach would be to perform bulk appends). However we presume + * that this block will be rarely executed, so it is not worth to optimize it. + */ + final StringBuilder buffer = new StringBuilder(length - n).append(identifier, 0, i); + while ((i += n) < length) { + c = identifier.codePointAt(i); + n = Character.charCount(c); + if (!Character.isIdentifierIgnorable(c)) { + buffer.appendCodePoint(c); + } + } + // No need to verify if the buffer is empty, because ignorable + // characters are not legal Unicode identifier start. + return buffer.toString(); + } + i += n; + } + } return identifier; } } Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -51,7 +51,7 @@ import org.apache.sis.internal.jdk8.Func * * @author Martin Desruisseaux (IRD, Geomatys) * @since 0.3 - * @version 0.5 + * @version 0.6 * @module */ public final class CollectionsExt extends Static { @@ -62,6 +62,24 @@ public final class CollectionsExt extend } /** + * Returns the first element of the given iterable, or {@code null} if none. + * This method is null-safe. Note that the first element may be null. + * + * @param <T> The type of elements contained in the iterable. + * @param collection The iterable from which to get the first element, or {@code null}. + * @return The first element, or {@code null} if the given iterable is null or empty. + */ + public static <T> T first(final Iterable<T> collection) { + if (collection != null) { + final Iterator<T> it = collection.iterator(); + if (it != null && it.hasNext()) { // This check for null is paranoiac. + return it.next(); + } + } + return null; + } + + /** * Returns a {@linkplain Queue queue} which is always empty and accepts no element. * * @param <E> The type of elements in the empty collection. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/io/IdentifiedObjectFormat.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/io/IdentifiedObjectFormat.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/io/IdentifiedObjectFormat.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/io/IdentifiedObjectFormat.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -70,7 +70,7 @@ final class IdentifiedObjectFormat exten final String code = identifier.getCode(); String cs = identifier.getCodeSpace(); if (cs == null || cs.isEmpty()) { - cs = Citations.getIdentifier(identifier.getAuthority()); + cs = Citations.getIdentifier(identifier.getAuthority(), true); } if (cs != null) { toAppendTo.append(cs).append(DefaultNameSpace.DEFAULT_SEPARATOR); Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -32,7 +32,7 @@ import org.apache.sis.util.Exceptions; import org.apache.sis.util.CharSequences; import org.apache.sis.util.resources.Errors; import org.apache.sis.internal.util.DefinitionURI; -import org.apache.sis.internal.util.Citations; +import org.apache.sis.internal.util.Constants; import org.apache.sis.internal.util.XPaths; import static java.lang.Math.PI; @@ -356,7 +356,7 @@ public final class Units extends Static * we want to try to parse as a xpointer before to give up. */ if (isURI(uom)) { - String code = DefinitionURI.codeOf("uom", Citations.EPSG, uom); + String code = DefinitionURI.codeOf("uom", Constants.EPSG, uom); if (code != null && code != uom) try { // Really identity check, see above comment. return valueOfEPSG(Integer.parseInt(code)); } catch (NumberFormatException e) { Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -18,6 +18,8 @@ package org.apache.sis.util; import java.util.Arrays; import java.nio.CharBuffer; +import org.opengis.metadata.citation.Citation; // For javadoc +import org.opengis.referencing.IdentifiedObject; // For javadoc import static java.lang.Character.*; @@ -1548,8 +1550,42 @@ cmp: while (ia < lga) { * Unicode identifier start} and all remaining characters (if any) are * {@linkplain Character#isUnicodeIdentifierPart(int) Unicode identifier parts}. * + * {@section Relationship with legal XML identifiers} + * Most legal Unicode identifiers are also legal XML identifiers, but the converse is not true. + * The most noticeable differences are the ‘{@code :}’, ‘{@code -}’ and ‘{@code .}’ characters, + * which are legal in XML identifiers but not in Unicode. + * + * <table class="sis"> + * <caption>Characters legal in one set but not in the other</caption> + * <tr><th colspan="2">Not legal in Unicode</th> <th class="sep" colspan="2">Not legal in XML</th></tr> + * <tr><td>{@code :}</td><td>(colon)</td> <td class="sep">{@code µ}</td><td>(micro sign)</td></tr> + * <tr><td>{@code -}</td><td>(hyphen or minus)</td> <td class="sep">{@code ª}</td><td>(feminine ordinal indicator)</td></tr> + * <tr><td>{@code .}</td><td>(dot)</td> <td class="sep">{@code º}</td><td>(masculine ordinal indicator)</td></tr> + * <tr><td>{@code ·}</td><td>(middle dot)</td> <td class="sep">{@code ⁔}</td><td>(inverted undertie)</td></tr> + * <tr> + * <td colspan="2">Many punctuation, symbols, <i>etc</i>.</td> + * <td colspan="2" class="sep">{@linkplain Character#isIdentifierIgnorable(int) Identifier ignorable} characters.</td> + * </tr> + * </table> + * + * Note that the ‘{@code _}’ (underscore) character is legal according both Unicode and XML, while spaces, + * ‘{@code !}’, ‘{@code #}’, ‘{@code *}’, ‘{@code /}’, ‘{@code ?}’ and most other punctuation characters are not. + * + * {@section Usage in Apache SIS} + * In its handling of {@linkplain org.apache.sis.metadata.iso.ImmutableIdentifier identifiers}, Apache SIS favors + * Unicode identifiers without {@linkplain Character#isIdentifierIgnorable(int) ignorable} characters since those + * identifiers are legal XML identifiers except for the above-cited rarely used characters. As a side effect, + * this policy excludes ‘{@code :}’, ‘{@code -}’ and ‘{@code .}’ which would normally be legal XML identifiers. + * But since those characters could easily be confused with + * {@linkplain org.apache.sis.util.iso.DefaultNameSpace#DEFAULT_SEPARATOR namespace separators}, + * this exclusion is considered desirable. + * * @param identifier The character sequence to test, or {@code null}. * @return {@code true} if the given character sequence is a legal Unicode identifier. + * + * @see org.apache.sis.metadata.iso.ImmutableIdentifier + * @see org.apache.sis.metadata.iso.citation.Citations#getUnicodeIdentifier(Citation) + * @see org.apache.sis.referencing.IdentifiedObjects#getUnicodeIdentifier(IdentifiedObject) */ public static boolean isUnicodeIdentifier(final CharSequence identifier) { final int length = length(identifier); Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/iso/TypeNames.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/iso/TypeNames.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/iso/TypeNames.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/iso/TypeNames.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -27,6 +27,7 @@ import org.opengis.util.TypeName; import org.opengis.util.NameSpace; import org.opengis.util.NameFactory; import org.opengis.util.InternationalString; +import org.apache.sis.internal.util.Constants; import org.apache.sis.util.resources.Errors; import org.apache.sis.util.Numbers; @@ -53,17 +54,17 @@ final class TypeNames { private static final Map<String,Class<?>> MAPPING = new LinkedHashMap<String,Class<?>>(16); static { final Map<String,Class<?>> m = MAPPING; - m.put("URI", URI.class); - m.put("DateTime", Date.class); - m.put("PT_Locale", Locale.class); - m.put("Boolean", Boolean.class); // Used as a sentinel value for stopping iteration. + m.put("URI", URI.class); + m.put("DateTime", Date.class); + m.put("PT_Locale", Locale.class); + m.put("Boolean", Boolean.class); // Used as a sentinel value for stopping iteration. // Entries below this point are handled in a special way. - m.put("FreeText", InternationalString.class); - m.put("CharacterString", String.class); - m.put("Real", Double.class); - m.put("Decimal", Double.class); - m.put("Integer", Integer.class); + m.put("FreeText", InternationalString.class); + m.put("CharacterString", String.class); + m.put("Real", Double.class); + m.put("Decimal", Double.class); + m.put("Integer", Integer.class); }; /** @@ -80,7 +81,7 @@ final class TypeNames { * Creates a new factory of type names. */ TypeNames(final NameFactory factory) { - ogcNS = factory.createNameSpace(factory.createLocalName(null, "OGC"), null); + ogcNS = factory.createNameSpace(factory.createLocalName(null, Constants.OGC), null); classNS = factory.createNameSpace(factory.createLocalName(null, "class"), null); } @@ -157,7 +158,7 @@ final class TypeNames { */ static Class<?> toClass(final String namespace, final String name) throws ClassNotFoundException { Class<?> c; - if (namespace == null || namespace.equalsIgnoreCase("OGC")) { + if (namespace == null || namespace.equalsIgnoreCase(Constants.OGC)) { c = MAPPING.get(name); if (c == null) { c = Types.forStandardName(name); Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -333,6 +333,11 @@ public final class Errors extends Indexe public static final short IllegalMemberType_2 = 37; /** + * Dimensions of “{0}” operation can not be ({1} → {2}). + */ + public static final short IllegalOperationDimension_3 = 180; + + /** * This operation can not be applied to values of class ‘{0}’. */ public static final short IllegalOperationForValueClass_1 = 141; @@ -585,6 +590,11 @@ public final class Errors extends Indexe public static final short NoSuchAuthorityCode_3 = 137; /** + * No operation method found for name of identifier “{0}”. + */ + public static final short NoSuchOperationMethod_1 = 179; + + /** * No unit of measurement has been specified. */ public static final short NoUnit = 72; Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -76,6 +76,7 @@ IllegalClass_2 = Clas IllegalFormatPatternForClass_2 = The \u201c{1}\u201d pattern can not be applied to formating of objects of type \u2018{0}\u2019. IllegalLanguageCode_1 = The \u201c{0}\u201d language is not recognized. IllegalMemberType_2 = Member \u201c{0}\u201d can not be associated to type \u201c{1}\u201d. +IllegalOperationDimension_3 = Dimensions of \u201c{0}\u201d operation can not be ({1} \u2192 {2}). IllegalOperationForValueClass_1 = This operation can not be applied to values of class \u2018{0}\u2019. IllegalOptionValue_2 = Option \u2018{0}\u2019 can not take the \u201c{1}\u201d value. IllegalOrdinateRange_3 = The [{0} \u2026 {1}] range of ordinate values is not valid for the \u201c{2}\u201d axis. @@ -150,6 +151,7 @@ NotASkewSymmetricMatrix = Matr NotAUnicodeIdentifier_1 = Text \u201c{0}\u201d is not a Unicode identifier. NotComparableClass_1 = Class \u2018{0}\u2019 is not a comparable. NoSuchAuthorityCode_3 = No code \u201c{2}\u201d from authority \u201c{0}\u201d found for object of type \u2018{1}\u2019. +NoSuchOperationMethod_1 = No operation method found for name of identifier \u201c{0}\u201d. NoUnit = No unit of measurement has been specified. NullArgument_1 = Argument \u2018{0}\u2019 shall not be null. NullCollectionElement_1 = \u2018{0}\u2019 collection does not accept null elements. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -66,6 +66,7 @@ IllegalClass_2 = La c IllegalFormatPatternForClass_2 = Le mod\u00e8le \u00ab\u202f{1}\u202f\u00bb ne peut pas \u00eatre appliqu\u00e9 au formatage d\u2019objets de type \u2018{0}\u2019. IllegalLanguageCode_1 = Le code de langue \u00ab\u202f{0}\u202f\u00bb n\u2019est pas reconnu. IllegalMemberType_2 = Le membre \u00ab\u202f{0}\u202f\u00bb ne peut pas \u00eatre associ\u00e9 au type \u00ab\u202f{1}\u202f\u00bb. +IllegalOperationDimension_3 = Les dimensions de l\u2019op\u00e9ration \u00ab\u202f{0}\u202f\u00bb ne peuvent pas \u00eatre ({1} \u2192 {2}). IllegalOperationForValueClass_1 = Cette op\u00e9ration ne peut pas s\u2019appliquer aux valeurs de classe \u2018{0}\u2019. IllegalOptionValue_2 = L\u2019option \u2018{0}\u2019 n\u2019accepte pas la valeur \u00ab\u202f{1}\u202f\u00bb. IllegalOrdinateRange_3 = La plage de valeurs de coordonn\u00e9es [{0} \u2026 {1}] n\u2019est pas valide pour l\u2019axe \u00ab\u202f{2}\u202f\u00bb. @@ -140,6 +141,7 @@ NotASkewSymmetricMatrix = La m NotAUnicodeIdentifier_1 = Le texte \u00ab\u202f{0}\u202f\u00bb n\u2019est pas un identifiant Unicode. NotComparableClass_1 = La classe \u2018{0}\u2019 n\u2019est pas comparable. NoSuchAuthorityCode_3 = Aucun code \u00ab\u202f{2}\u202f\u00bb de l\u2019autorit\u00e9 \u00ab\u202f{0}\u202f\u00bb n\u2019a \u00e9t\u00e9 trouv\u00e9 pour un objet de type \u2018{1}\u2019. +NoSuchOperationMethod_1 = Aucune m\u00e9thode n\u2019a \u00e9t\u00e9 trouv\u00e9e pour le nom ou l\u2019identifiant \u00ab\u202f{0}\u202f\u00bb. NoUnit = Aucune unit\u00e9 de mesure n\u2019a \u00e9t\u00e9 sp\u00e9cifi\u00e9e. NullArgument_1 = L\u2019argument \u2018{0}\u2019 ne doit pas \u00eatre nul. NullCollectionElement_1 = La collection \u2018{0}\u2019 n\u2019accepte pas les valeurs nulles. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -92,6 +92,12 @@ public final class Messages extends Inde public static final short LocalesDiscarded = 3; /** + * The “{1}” parameter could have been omitted. But it has been given a value of {2} which does + * not match the definition of the “{0}” ellipsoid. + */ + public static final short MismatchedEllipsoidAxisLength_3 = 9; + + /** * Property “{0}” is hidden by “{1}”. */ public static final short PropertyHiddenBy_2 = 4; Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -22,4 +22,5 @@ IgnoredPropertiesAfterFirst_1 = Ignore IgnoredPropertyAssociatedTo_1 = Ignored property associated to \u2018{0}\u2019. PropertyHiddenBy_2 = Property \u201c{0}\u201d is hidden by \u201c{1}\u201d. LocalesDiscarded = Text were discarded for some locales. +MismatchedEllipsoidAxisLength_3 = The \u201c{1}\u201d parameter could have been omitted. But it has been given a value of {2} which does not match the definition of the \u201c{0}\u201d ellipsoid. UnparsableValueStoredAsText_2 = Can not parse \u201c{1}\u201d as an instance of \u2018{0}\u2019. The value is stored as plain text instead, but will be ignored by some processing. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Messages_fr.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -22,4 +22,5 @@ IgnoredPropertiesAfterFirst_1 = Des pr IgnoredPropertyAssociatedTo_1 = Une propri\u00e9t\u00e9 associ\u00e9e \u00e0 \u2018{0}\u2019 a \u00e9t\u00e9 ignor\u00e9e. PropertyHiddenBy_2 = La propri\u00e9t\u00e9 \u00ab\u202f{0}\u202f\u00bb est masqu\u00e9e par \u00ab\u202f{1}\u202f\u00bb. LocalesDiscarded = Des textes ont \u00e9t\u00e9 ignor\u00e9s pour certaines langues. +MismatchedEllipsoidAxisLength_3 = Le param\u00e8tre \u00ab\u202f{1}\u202f\u00bb aurait pu \u00eatre omis. Mais il lui a \u00e9t\u00e9 donn\u00e9 la {2} qui ne correspond pas \u00e0 la d\u00e9finition de l'ellipso\u00efde \u00ab\u202f{0}\u202f\u00bb. UnparsableValueStoredAsText_2 = La valeur \u00ab\u202f{1}\u202f\u00bb ne peut pas \u00eatre interpr\u00e9t\u00e9e comme une instance de \u2018{0}\u2019. Elle est donc m\u00e9moris\u00e9e sous sa forme textuelle, mais sera ignor\u00e9e par certains traitements. Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -371,6 +371,11 @@ public final class Vocabulary extends In public static final short StandardDeviation = 51; /** + * Superseded by {0}. + */ + public static final short SupersededBy_1 = 84; + + /** * Temporal */ public static final short Temporal = 66; Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -77,6 +77,7 @@ RootMeanSquare = Root Mean Squa Scale = Scale Source = Source StandardDeviation = Standard deviation +SupersededBy_1 = Superseded by {0}. TemporaryFiles = Temporary files Temporal = Temporal Time = Time Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -77,6 +77,7 @@ RootMeanSquare = Moyenne quadra Scale = \u00c9chelle Source = Source StandardDeviation = \u00c9cart type +SupersededBy_1 = Remplac\u00e9 par {0}. TemporaryFiles = Fichiers temporaires Temporal = Temporel Time = Temps Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -259,7 +259,7 @@ abstract class Pooled { case 0: { // Apply namespace replacements only for older versions than the one supported natively by SIS. if (versionGML != null) { - if (versionGML.compareTo(LegacyNamespaces.VERSION_3_2_1, 2) < 0) { + if (versionGML.compareTo(LegacyNamespaces.VERSION_3_2_1) < 0) { return FilterVersion.GML31; } } Modified: sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/XML.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -183,11 +183,10 @@ public final class XML extends Static { * algorithm by subclassing {@link ReferenceResolver} and configure a unmarshaller as below:</p> * * {@preformat java - * ReferenceResolver myResolver = ...; - * Unmarshaller um = marshallerPool.acquireUnmarshaller(); - * um.setProperty(XML.RESOLVER, myResolver); - * Object obj = um.unmarshal(xml); - * marshallerPool.recycle(um); + * ReferenceResolver myResolver = ...; + * Map<String,Object> properties = new HashMap<>(); + * properties.put(XML.RESOLVER, myResolver); + * Object obj = XML.unmarshal(source, properties); * } * * @see Unmarshaller#setProperty(String, Object) @@ -196,7 +195,7 @@ public final class XML extends Static { public static final String RESOLVER = "org.apache.sis.xml.resolver"; /** - * Control the behaviors of the (un)marshalling process when an element can not be processed, + * Controls the behaviors of the (un)marshalling process when an element can not be processed, * or alter the element values. The value for this property shall be an instance of {@link ValueConverter}. * * <p>If an element in a XML document can not be parsed (for example if a {@linkplain java.net.URL} @@ -231,10 +230,9 @@ public final class XML extends Static { * // Not all errors are trapped - see the ValueConverter * // javadoc for more details. * WarningCollector myWarningList = new WarningCollector(); - * Unmarshaller um = marshallerPool.acquireUnmarshaller(); - * um.setProperty(XML.CONVERTER, myWarningList); - * Object obj = um.unmarshal(xml); - * marshallerPool.recycle(um); + * Map<String,Object> properties = new HashMap<>(); + * properties.put(XML.CONVERTER, myWarningList); + * Object obj = XML.unmarshal(source, properties); * if (!myWarningList.isEmpty()) { * // Report here the warnings to the user. * } Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/simple/SimpleIdentifierTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/simple/SimpleIdentifierTest.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/simple/SimpleIdentifierTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/simple/SimpleIdentifierTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -16,6 +16,7 @@ */ package org.apache.sis.internal.simple; +import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; import org.junit.Test; @@ -30,6 +31,7 @@ import static org.junit.Assert.*; * @version 0.3 * @module */ +@DependsOn(org.apache.sis.internal.util.CitationsTest.class) public final strictfp class SimpleIdentifierTest extends TestCase { /** * Tests {@link SimpleIdentifier#toString()}. Copied: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java (from r1661574, sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java) URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java?p2=sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java&p1=sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java&r1=1661574&r2=1661575&rev=1661575&view=diff ============================================================================== --- sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/internal/util/CitationsTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -23,6 +23,7 @@ import org.apache.sis.test.TestCase; import org.junit.Test; import static org.junit.Assert.*; +import static org.junit.Assume.assumeTrue; /** @@ -60,6 +61,8 @@ public final strictfp class CitationsTes @Test @DependsOnMethod("testGetIdentifier") public void testGetUnicodeIdentifier() { + assumeTrue(Character.isIdentifierIgnorable('\u2060') + && Character.isIdentifierIgnorable('\u200B')); final SimpleCitation citation = new SimpleCitation(" Valid\u2060Id\u200Bentifier "); assertEquals("ValidIdentifier", Citations.getUnicodeIdentifier(citation)); } Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestRunner.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestRunner.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestRunner.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/TestRunner.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -298,8 +298,7 @@ public final class TestRunner extends Bl public void filter(final Filter filter) throws NoTestsRemainException { int count = 0; FrameworkMethod[] children = getFilteredChildren(); - for (int i=0; i<children.length; i++) { - final FrameworkMethod method = children[i]; + for (final FrameworkMethod method : children) { if (filter.shouldRun(describeChild(method))) { try { filter.apply(method); Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -82,6 +82,7 @@ import org.junit.BeforeClass; // GeoAPI most basic types. org.apache.sis.internal.util.DefinitionURITest.class, org.apache.sis.internal.util.XPathsTest.class, + org.apache.sis.internal.util.CitationsTest.class, org.apache.sis.util.iso.TypesTest.class, org.apache.sis.util.iso.SimpleInternationalStringTest.class, org.apache.sis.util.iso.DefaultInternationalStringTest.class, Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/CharSequencesTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/CharSequencesTest.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/CharSequencesTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/CharSequencesTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -34,7 +34,7 @@ import static org.apache.sis.util.CharSe * @author Martin Desruisseaux (Geomatys) * @author Johann Sorel (Geomatys) * @since 0.3 - * @version 0.5 + * @version 0.6 * @module */ @DependsOn({ @@ -394,9 +394,28 @@ public final strictfp class CharSequence */ @Test public void testIsUnicodeIdentifier() { + assertFalse( isUnicodeIdentifier(null)); assertTrue ("A123", isUnicodeIdentifier("A123")); assertFalse("123A", isUnicodeIdentifier("123A")); - assertFalse( isUnicodeIdentifier(null)); + assertTrue ("A_1", isUnicodeIdentifier("A_1")); + assertFalse("A-1", isUnicodeIdentifier("A-1")); + assertFalse("A+1", isUnicodeIdentifier("A+1")); + assertFalse("A/1", isUnicodeIdentifier("A/1")); + assertFalse("A\\1", isUnicodeIdentifier("A\\1")); + assertFalse("A*1", isUnicodeIdentifier("A*1")); + assertFalse("A.1", isUnicodeIdentifier("A.1")); + assertFalse("A,1", isUnicodeIdentifier("A,1")); + assertFalse("A:1", isUnicodeIdentifier("A:1")); + assertFalse("A;1", isUnicodeIdentifier("A;1")); + assertFalse("A#1", isUnicodeIdentifier("A#1")); + assertFalse("A?1", isUnicodeIdentifier("A?1")); + assertFalse("A!1", isUnicodeIdentifier("A!1")); + assertFalse("A°1", isUnicodeIdentifier("A°1")); // Degree + assertTrue ("Aº1", isUnicodeIdentifier("Aº1")); // Masculine ordinal + assertFalse("A 1", isUnicodeIdentifier("A 1")); // Ordinary space + assertFalse("A 1", isUnicodeIdentifier("A" + Characters.NO_BREAK_SPACE + "1")); + assertFalse("A‐1", isUnicodeIdentifier("A" + Characters.HYPHEN + "1")); + assertTrue ("A1", isUnicodeIdentifier("A" + Characters.SOFT_HYPHEN + "1")); } /** Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/VersionTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/VersionTest.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/VersionTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/VersionTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -16,6 +16,7 @@ */ package org.apache.sis.util; +import org.apache.sis.internal.jaxb.LegacyNamespaces; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.TestCase; import org.junit.Test; @@ -28,7 +29,7 @@ import static org.apache.sis.test.Assert * * @author Martin Desruisseaux (IRD, Geomatys) * @since 0.3 - * @version 0.4 + * @version 0.6 * @module */ public final strictfp class VersionTest extends TestCase { @@ -71,6 +72,21 @@ public final strictfp class VersionTest } /** + * Tests {@link Version#compareTo(Version, int)} with version numbers needed by our GML support. + */ + @Test + public void testGML() { + assertTrue(LegacyNamespaces.VERSION_3_2.compareTo(LegacyNamespaces.VERSION_3_2_1, 2) == 0); + assertTrue(LegacyNamespaces.VERSION_3_2.compareTo(LegacyNamespaces.VERSION_3_2_1 ) < 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2_1 ) < 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2_1, 2) < 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2_1, 1) == 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2 ) < 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2, 2) < 0); + assertTrue(LegacyNamespaces.VERSION_3_0.compareTo(LegacyNamespaces.VERSION_3_2, 1) == 0); + } + + /** * Tests the {@link Version#valueOf(int[])} method. */ @Test Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/AbstractNameTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/AbstractNameTest.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/AbstractNameTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/AbstractNameTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -23,7 +23,7 @@ import org.junit.Test; import static org.opengis.test.Validators.*; import static org.apache.sis.test.Assert.*; -import static org.apache.sis.internal.util.Citations.EPSG; +import static org.apache.sis.internal.util.Constants.EPSG; import static org.apache.sis.util.iso.DefaultNameSpace.DEFAULT_SEPARATOR_STRING; Modified: sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/TypeNamesTest.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -29,6 +29,7 @@ import org.apache.sis.test.TestCase; import org.junit.Test; import static org.junit.Assert.*; +import static org.apache.sis.internal.util.Constants.OGC; /** @@ -74,14 +75,14 @@ public final strictfp class TypeNamesTes */ @Test public void testBasicTypes() throws ClassNotFoundException { - verifyLookup("OGC", "URI", URI.class); - verifyLookup("OGC", "PT_Locale", Locale.class); - verifyLookup("OGC", "DateTime", Date.class); - verifyLookup("OGC", "FreeText", InternationalString.class); - verifyLookup("OGC", "CharacterString", String.class); - verifyLookup("OGC", "Boolean", Boolean.class); - verifyLookup("OGC", "Real", Double.class); - verifyLookup("OGC", "Integer", Integer.class); + verifyLookup(OGC, "URI", URI.class); + verifyLookup(OGC, "PT_Locale", Locale.class); + verifyLookup(OGC, "DateTime", Date.class); + verifyLookup(OGC, "FreeText", InternationalString.class); + verifyLookup(OGC, "CharacterString", String.class); + verifyLookup(OGC, "Boolean", Boolean.class); + verifyLookup(OGC, "Real", Double.class); + verifyLookup(OGC, "Integer", Integer.class); } /** @@ -89,10 +90,10 @@ public final strictfp class TypeNamesTes */ @Test public void testNumbers() { - assertEquals("Short", "OGC:Integer", toTypeName(Short .class)); - assertEquals("Long", "OGC:Integer", toTypeName(Long .class)); - assertEquals("Float", "OGC:Real", toTypeName(Float .class)); - assertEquals("Double", "OGC:Real", toTypeName(Double.class)); + assertEquals("Short", OGC+":Integer", toTypeName(Short .class)); + assertEquals("Long", OGC+":Integer", toTypeName(Long .class)); + assertEquals("Float", OGC+":Real", toTypeName(Float .class)); + assertEquals("Double", OGC+":Real", toTypeName(Double.class)); } /** @@ -102,8 +103,8 @@ public final strictfp class TypeNamesTes */ @Test public void testMetadataClasses() throws ClassNotFoundException { - verifyLookup("OGC", "MD_Metadata", Metadata.class); - verifyLookup("OGC", "SC_CRS", CoordinateReferenceSystem.class); + verifyLookup(OGC, "MD_Metadata", Metadata.class); + verifyLookup(OGC, "SC_CRS", CoordinateReferenceSystem.class); } /** @@ -124,9 +125,9 @@ public final strictfp class TypeNamesTes @Test public void testInvalidNames() throws ClassNotFoundException { assertEquals("Dummy:Real", Void.TYPE, TypeNames.toClass("Dummy", "Real")); - assertEquals("OGC:Real", Double.class, TypeNames.toClass("OGC", "Real")); + assertEquals(OGC+":Real", Double.class, TypeNames.toClass(OGC, "Real")); assertEquals("Real", Double.class, TypeNames.toClass(null, "Real")); assertEquals("Dummy", Void.TYPE, TypeNames.toClass(null, "Dummy")); // Considered not an error. - assertNull ("OGC:Dummy", TypeNames.toClass("OGC", "Dummy")); // Considered an error. + assertNull (OGC+":Dummy", TypeNames.toClass(OGC, "Dummy")); // Considered an error. } } Modified: sis/branches/JDK6/ide-project/NetBeans/README.txt URL: http://svn.apache.org/viewvc/sis/branches/JDK6/ide-project/NetBeans/README.txt?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/ide-project/NetBeans/README.txt [UTF-8] (original) +++ sis/branches/JDK6/ide-project/NetBeans/README.txt [UTF-8] Sun Feb 22 23:02:52 2015 @@ -13,12 +13,12 @@ directory of all SIS-related projects): mkdir SIS svn checkout http://svn.apache.org/repos/asf/sis/branches/JDK6 SIS/JDK6 mkdir GeoAPI - svn checkout http://svn.code.sf.net/p/geoapi/code/trunk GeoAPI/trunk + git clone http://github.com/opengeospatial/geoapi GeoAPI/master Above commands should create the following directory structure: +-- GeoAPI - | +-- trunk + | +-- master | +-- README.txt | +-- etc... +-- SIS Modified: sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties URL: http://svn.apache.org/viewvc/sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties [ISO-8859-1] (original) +++ sis/branches/JDK6/ide-project/NetBeans/nbproject/project.properties [ISO-8859-1] Sun Feb 22 23:02:52 2015 @@ -70,7 +70,7 @@ test.fra-profile.dir = ${project.root}/p # If a different path is desired, copy that line in the "private/private.properties" file and edit # its value there. # -project.GeoAPI = ../../../../GeoAPI/trunk/ide-project/NetBeans +project.GeoAPI = ../../../../GeoAPI/master/ide-project/NetBeans # # Version numbers for all dependencies. Modified: sis/branches/JDK6/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java?rev=1661575&r1=1661574&r2=1661575&view=diff ============================================================================== --- sis/branches/JDK6/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java [UTF-8] (original) +++ sis/branches/JDK6/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java [UTF-8] Sun Feb 22 23:02:52 2015 @@ -26,7 +26,6 @@ import java.util.Map; import java.util.HashMap; import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.io.IOException; import javax.measure.unit.Unit; import javax.measure.unit.SI; @@ -77,6 +76,7 @@ import ucar.nc2.constants.CF; import static java.util.Collections.singleton; import static org.apache.sis.storage.netcdf.AttributeNames.*; +import static org.apache.sis.internal.util.CollectionsExt.first; /** @@ -257,14 +257,6 @@ final class MetadataReader { } /** - * Returns the first element of the given collection. - */ - private static <T> T first(final Collection<T> collection) { - final Iterator<T> it = collection.iterator(); - return it.hasNext() ? it.next() : null; - } - - /** * Adds the given element in the given collection if the element is not already present in the collection. * We define this method because the metadata API uses collections while the SIS implementation uses lists. * The lists are usually very short (typically 0 or 1 element), so the call to {@link List#contains(Object)}
