Author: desruisseaux
Date: Sun Mar  3 21:23:47 2013
New Revision: 1452127

URL: http://svn.apache.org/r1452127
Log:
Minor clarifications in javadoc and method names.

Modified:
    
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
    
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
    
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java

Modified: 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java?rev=1452127&r1=1452126&r2=1452127&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
 [UTF-8] Sun Mar  3 21:23:47 2013
@@ -113,10 +113,6 @@ public abstract class AbstractMetadata i
      * for better performances, or for comparing "hidden" attributes not 
specified
      * by the GeoAPI (or other standard) interface.
      *
-     * <p>This method performs a <cite>deep</cite> comparison: if this 
metadata contains
-     * other metadata, then the comparison will invoke the {@link 
Object#equals(Object)}
-     * method on those children as well.</p>
-     *
      * @param  object The object to compare with this metadata.
      * @param  mode The strictness level of the comparison.
      * @return {@code true} if the given object is equal to this metadata.
@@ -151,7 +147,7 @@ public abstract class AbstractMetadata i
          * Edit: actually, even if we could synchronize the two objects 
atomically, a deadlock
          *       risk would still exists for the reason documented in this 
class's javadoc.
          */
-        return standard.shallowEquals(this, object, mode, false);
+        return standard.equals(this, object, mode);
     }
 
     /**
@@ -177,8 +173,8 @@ public abstract class AbstractMetadata i
 
     /**
      * Computes a hash code value for this metadata using Java reflection. The 
hash code
-     * is defined as the sum of hash code values of all non-null properties. 
This is the
-     * same contract than {@link java.util.Set#hashCode()} and ensure that the 
hash code
+     * is defined as the sum of hash code values of all non-empty properties. 
This is a
+     * similar contract than {@link java.util.Set#hashCode()} and ensures that 
the hash code
      * value is insensitive to the ordering of properties.
      *
      * {@section Performance note}

Modified: 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java?rev=1452127&r1=1452126&r2=1452127&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
 [UTF-8] Sun Mar  3 21:23:47 2013
@@ -93,7 +93,7 @@ public class MetadataStandard {
     private static final MetadataStandard[] INSTANCES;
 
     /**
-     * An instance working on ISO 19123 standard as defined by GeoAPI 
interfaces
+     * An instance working on ISO 19111 standard as defined by GeoAPI 
interfaces
      * in the {@link org.opengis.referencing} package and sub-packages.
      */
     public static final MetadataStandard ISO_19111;
@@ -234,6 +234,8 @@ public class MetadataStandard {
      * </ul>
      *
      * @param  implementation The implementation class.
+     * @param  mandatory Whether this method shall throw an exception or 
return {@code null}
+     *         if no accessor is found for the given implementation class.
      * @return The accessor for the given implementation, or {@code null} if 
the given class does
      *         not implement a metadata interface of the expected package and 
{@code mandatory}
      *         is {@code false}.
@@ -448,30 +450,25 @@ public class MetadataStandard {
      * this {@code MetadataStandard}, otherwise an exception will be thrown. 
However the two
      * arguments do not need to be the same implementation class.
      *
-     * <p>This method can optionally excludes null values from the comparison. 
In metadata,
-     * null value often means "don't know", so in some occasions we want to 
consider two
-     * metadata as different only if a property value is know for sure to be 
different.</p>
-     *
      * {@section Shallow or deep comparisons}
      * This method implements a <cite>shallow</cite> comparison in that 
properties are compared by
      * invoking their {@code properties.equals(…)} method without 
<em>explicit</em> recursive call
-     * to this {@code shallowEquals(…)} method for children metadata. However 
the comparison will
+     * to this {@code standard.equals(…)} method for children metadata. 
However the comparison will
      * do <em>implicit</em> recursive calls if the {@code 
properties.equals(…)} implementations
-     * invoke this {@code shallowEquals(…)} method. In the later case, the 
final result is a deep
-     * comparison.
+     * delegate their work to this {@code standard.equals(…)} method, as 
{@link AbstractMetadata} does.
+     * In the later case, the final result is a deep comparison.
      *
      * @param metadata1 The first metadata object to compare.
      * @param metadata2 The second metadata object to compare.
      * @param mode      The strictness level of the comparison.
-     * @param skipNulls If {@code true}, only non-null values will be compared.
      * @return {@code true} if the given metadata objects are equals.
      * @throws ClassCastException if at least one metadata object don't
      *         implements a metadata interface of the expected package.
      *
      * @see AbstractMetadata#equals(Object, ComparisonMode)
      */
-    public boolean shallowEquals(final Object metadata1, final Object 
metadata2,
-            final ComparisonMode mode, final boolean skipNulls) throws 
ClassCastException
+    public boolean equals(final Object metadata1, final Object metadata2,
+            final ComparisonMode mode) throws ClassCastException
     {
         if (metadata1 == metadata2) {
             return true;
@@ -483,14 +480,14 @@ public class MetadataStandard {
         if (accessor.type != findInterface(metadata2.getClass())) {
             return false;
         }
-        return accessor.shallowEquals(metadata1, metadata2, mode, skipNulls);
+        return accessor.equals(metadata1, metadata2, mode, false);
     }
 
     /**
      * Computes a hash code for the specified metadata. The hash code is 
defined as the
-     * sum of hash code values of all non-null properties. This is the same 
contract than
-     * {@link java.util.Set#hashCode} and ensure that the hash code value is 
insensitive
-     * to the ordering of properties.
+     * sum of hash code values of all non-empty properties. This is a similar 
contract
+     * than {@link java.util.Set#hashCode()} and ensures that the hash code 
value is
+     * insensitive to the ordering of properties.
      *
      * @param  metadata The metadata object to compute hash code.
      * @return A hash code value for the specified metadata.

Modified: 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java?rev=1452127&r1=1452126&r2=1452127&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
 [UTF-8] Sun Mar  3 21:23:47 2013
@@ -62,7 +62,7 @@ import static org.apache.sis.internal.ut
  * <ul>
  *   <li>The standard properties defined by the GeoAPI (or other standard) 
interfaces.
  *       Those properties are the only one accessible by most methods in this 
class,
- *       except {@link #shallowEquals(Object, Object, ComparisonMode, 
boolean)},
+ *       except {@link #equals(Object, Object, ComparisonMode, boolean)},
  *       {@link #shallowCopy(Object, Object, boolean)} and {@link 
#freeze(Object)}.</li>
  *
  *   <li>Extra properties defined by the {@link IdentifiedObject} interface. 
Those properties
@@ -508,10 +508,13 @@ final class PropertyAccessor {
      * Returns the index of the specified property, or -1 if none.
      * The search is case-insensitive.
      *
-     * @param  key The property to search.
-     * @return The index of the given key, or -1 if none.
+     * @param  name The name of the property to search.
+     * @param  mandatory Whether this method shall throw an exception or 
return {@code -1}
+     *         if the given name is not found.
+     * @return The index of the given name, or -1 if none and {@code 
mandatory} is {@code false}.
+     * @throws IllegalArgumentException if the name is not found and {@code 
mandatory} is {@code true}.
      */
-    final int indexOf(final String name) {
+    final int indexOf(final String name, final boolean mandatory) {
         Integer index = mapping.get(name);
         if (index == null) {
             /*
@@ -521,29 +524,16 @@ final class PropertyAccessor {
              */
             final String key = CharSequences.trimWhitespaces(name.replace(" ", 
"").toLowerCase(Locale.ROOT));
             if (key == name || (index = mapping.get(key)) == null) { // 
Identity comparison is okay here.
-                return -1;
+                if (!mandatory) {
+                    return -1;
+                }
+                throw new 
IllegalArgumentException(Errors.format(Errors.Keys.NoSuchProperty_2, name, 
type));
             }
         }
         return index;
     }
 
     /**
-     * Always returns the index of the specified property (never -1).
-     * The search is case-insensitive.
-     *
-     * @param  key The property to search.
-     * @return The index of the given key.
-     * @throws IllegalArgumentException if the given key is not found.
-     */
-    final int requiredIndexOf(final String key) throws 
IllegalArgumentException {
-        final int index = indexOf(key);
-        if (index >= 0) {
-            return index;
-        }
-        throw new 
IllegalArgumentException(Errors.format(Errors.Keys.NoSuchProperty_2, key, 
type));
-    }
-
-    /**
      * Returns the declaring class of the getter at the given index.
      *
      * @param  index The index of the property for which to get the declaring 
class.
@@ -958,12 +948,13 @@ final class PropertyAccessor {
     }
 
     /**
-     * Compares the two specified metadata objects. The comparison is 
<cite>shallow</cite>,
-     * i.e. all metadata properties are compared using their {@code 
properties.equals(…)}
-     * method without explicit calls to this {@code shallowEquals} method for 
children.
+     * Compares the two specified metadata objects. This method implements a 
<cite>shallow</cite>
+     * comparison, i.e. all metadata properties are compared using their 
{@code properties.equals(…)}
+     * method without explicit calls to this {@code accessor.equals(…)} method 
for children.
+     * However the final result may still be a deep comparison.
      *
      * <p>This method can optionally excludes null values from the comparison. 
In metadata,
-     * null value often means "don't know", so in some occasion we want to 
consider two
+     * null value often means "don't know", so in some occasions we want to 
consider two
      * metadata as different only if a property value is know for sure to be 
different.</p>
      *
      * @param  metadata1 The first metadata object to compare. This object 
determines the accessor.
@@ -972,9 +963,12 @@ final class PropertyAccessor {
      * @param  skipNulls If {@code true}, only non-null values will be 
compared.
      * @throws BackingStoreException If the implementation threw a checked 
exception.
      *
-     * @see MetadataStandard#shallowEquals(Object, Object, ComparisonMode, 
boolean)
+     * @see MetadataStandard#equals(Object, Object, ComparisonMode, boolean)
+     *
+     * @todo The semantic of the <code>skipNulls</code> argument should be 
revisited
+     *       in order to provide a behavior more like a 
<code>contains(Object)</code> method.
      */
-    public boolean shallowEquals(final Object metadata1, final Object 
metadata2,
+    public boolean equals(final Object metadata1, final Object metadata2,
             final ComparisonMode mode, final boolean skipNulls) throws 
BackingStoreException
     {
         assert type.isInstance(metadata1) : metadata1;
@@ -985,13 +979,13 @@ final class PropertyAccessor {
             final Method  method = getters[i];
             final Object  value1 = get(method, metadata1);
             final Object  value2 = get(method, metadata2);
-            final boolean empty1 = isEmpty(value1);
-            final boolean empty2 = isEmpty(value2);
+            final boolean empty1 = isNullOrEmpty(value1);
+            final boolean empty2 = isNullOrEmpty(value2);
             if (empty1 && empty2) {
                 continue;
             }
             if (!Utilities.deepEquals(value1, value2, mode)) {
-                if (mode.ordinal() < ComparisonMode.APPROXIMATIVE.ordinal() && 
floatEpsilonEqual(value1, value2)) {
+                if (mode.ordinal() >= ComparisonMode.APPROXIMATIVE.ordinal() 
&& floatEpsilonEqual(value1, value2)) {
                     continue; // Accept this slight difference.
                 }
                 if (!skipNulls || (!empty1 && !empty2)) {
@@ -1003,9 +997,12 @@ final class PropertyAccessor {
     }
 
     /**
-     * Copies all metadata from source to target. The source can be any 
implementation of
-     * the metadata interface, but the target must be the implementation 
expected by this
-     * class.
+     * Copies all non-empty metadata from source to target. The source can be 
any implementation
+     * of the metadata interface, but the target must be the implementation 
expected by this class.
+     *
+     * <p>If {@code skipNulls} is {@code true} and the source contains any 
null or empty properties,
+     * then those properties will <strong>not</strong> overwrite the 
corresponding properties in the
+     * destination metadata.</p>
      *
      * @param  source The metadata to copy.
      * @param  target The target metadata.
@@ -1027,7 +1024,7 @@ final class PropertyAccessor {
         for (int i=0; i<standardCount; i++) {
             final Method getter = getters[i];
             arguments[0] = get(getter, source);
-            if (!skipNulls || !isEmpty(arguments[0])) {
+            if (!skipNulls || !isNullOrEmpty(arguments[0])) {
                 if (setters == null) {
                     return false;
                 }
@@ -1079,10 +1076,10 @@ final class PropertyAccessor {
     }
 
     /**
-     * Returns a hash code for the specified metadata. The hash code is 
defined as the
-     * sum of hash code values of all non-null properties. This is the same 
contract than
-     * {@link java.util.Set#hashCode} and ensure that the hash code value is 
insensitive
-     * to the ordering of properties.
+     * Computes a hash code for the specified metadata. The hash code is 
defined as the
+     * sum of hash code values of all non-empty properties. This is a similar 
contract
+     * than {@link java.util.Set#hashCode()} and ensures that the hash code 
value is
+     * insensitive to the ordering of properties.
      *
      * @throws BackingStoreException If the implementation threw a checked 
exception.
      */
@@ -1091,7 +1088,7 @@ final class PropertyAccessor {
         int code = 0;
         for (int i=0; i<standardCount; i++) {
             final Object value = get(getters[i], metadata);
-            if (!isEmpty(value)) {
+            if (!isNullOrEmpty(value)) {
                 code += value.hashCode();
             }
         }
@@ -1099,7 +1096,7 @@ final class PropertyAccessor {
     }
 
     /**
-     * Counts the number of non-null properties.
+     * Counts the number of non-empty properties.
      *
      * @throws BackingStoreException If the implementation threw a checked 
exception.
      */
@@ -1107,7 +1104,7 @@ final class PropertyAccessor {
         assert type.isInstance(metadata) : metadata;
         int count = 0;
         for (int i=0; i<standardCount; i++) {
-            if (!isEmpty(get(getters[i], metadata))) {
+            if (!isNullOrEmpty(get(getters[i], metadata))) {
                 if (++count >= max) {
                     break;
                 }
@@ -1123,7 +1120,7 @@ final class PropertyAccessor {
      * is invoked from methods doing shallow copy or comparison. If we were 
inspecting elements,
      * we would need to add a check against infinite recursivity.</p>
      */
-    static boolean isEmpty(final Object value) {
+    static boolean isNullOrEmpty(final Object value) {
         return value == null
                 || ((value instanceof CharSequence) && 
CharSequences.trimWhitespaces((CharSequence) value).length() == 0)
                 || ((value instanceof Collection<?>) && ((Collection<?>) 
value).isEmpty())


Reply via email to