sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1594544 - in /sis/branches/JDK8/core: sis-feature/src/main/java/org/apache/sis/feature/ sis-feature/src/test/java/org/apache/sis/feature/ sis-utility/src/main/java/org/apache/sis/util/resources/
Date Wed, 14 May 2014 11:25:32 GMT
Author: desruisseaux
Date: Wed May 14 11:25:32 2014
New Revision: 1594544

URL: http://svn.apache.org/r1594544
Log:
Renamed FeatureType.characteristics as FeatureType.properties for conformance with common usage
(I'm not sure that ISO 19109 "characteristics" was exactly the same thing, since ISO seems to use
"characteristics" in a broader sense than "properties"). Also provide better check about whether
a property overrides a property of the super-type, and whether is overriding is legal.

Modified:
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultOperation.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FieldType.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyType.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java
    sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java
    sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java
    sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
    sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
    sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
    sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java [UTF-8] Wed May 14 11:25:32 2014
@@ -119,12 +119,12 @@ public class AbstractIdentifiedType impl
     /**
      * Constructs a type from the given properties. Keys are strings from the table below.
      * The map given in argument shall contain an entry at least for the {@value #NAME_KEY}.
-     * Other properties listed in the table below are optional.
+     * Other entries listed in the table below are optional.
      *
      * <table class="sis">
-     *   <caption>Recognized properties</caption>
+     *   <caption>Recognized map entries</caption>
      *   <tr>
-     *     <th>Property name</th>
+     *     <th>Map key</th>
      *     <th>Value type</th>
      *     <th>Returned by</th>
      *   </tr>
@@ -165,26 +165,26 @@ public class AbstractIdentifiedType impl
      * is used only on a <cite>best effort</cite> basis. The locale is discarded after successful construction
      * since localizations are applied by the {@link InternationalString#toString(Locale)} method.</p>
      *
-     * @param  properties The name and other properties to be given to this identified type.
+     * @param  identification The name and other information to be given to this identified type.
      * @throws IllegalArgumentException if a property has an invalid value.
      */
-    protected AbstractIdentifiedType(final Map<String,?> properties) throws IllegalArgumentException {
-        ensureNonNull("properties", properties);
-        Object value = properties.get(NAME_KEY);
+    protected AbstractIdentifiedType(final Map<String,?> identification) throws IllegalArgumentException {
+        ensureNonNull("identification", identification);
+        Object value = identification.get(NAME_KEY);
         if (value == null) {
-            throw new IllegalArgumentException(Errors.getResources(properties)
+            throw new IllegalArgumentException(Errors.getResources(identification)
                     .getString(Errors.Keys.MissingValueForProperty_1, NAME_KEY));
         } else if (value instanceof String) {
             name = DefaultFactories.NAMES.createLocalName(null, (String) value);
         } else if (value instanceof GenericName) {
             name = (GenericName) value;
         } else {
-            throw new IllegalArgumentException(Errors.getResources(properties).getString(
+            throw new IllegalArgumentException(Errors.getResources(identification).getString(
                     Errors.Keys.IllegalPropertyClass_2, NAME_KEY, value.getClass()));
         }
-        definition  = Types.toInternationalString(properties, DEFINITION_KEY );
-        designation = Types.toInternationalString(properties, DESIGNATION_KEY);
-        description = Types.toInternationalString(properties, DESCRIPTION_KEY);
+        definition  = Types.toInternationalString(identification, DEFINITION_KEY );
+        designation = Types.toInternationalString(identification, DESIGNATION_KEY);
+        description = Types.toInternationalString(identification, DESCRIPTION_KEY);
     }
 
     /**

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java [UTF-8] Wed May 14 11:25:32 2014
@@ -53,12 +53,12 @@ public class DefaultAssociationRole exte
     /**
      * Constructs an association role from the given properties. The properties map is given unchanged
      * to the {@linkplain AbstractIdentifiedType#AbstractIdentifiedType(Map) super-class constructor}.
-     * The following table is a reminder of main (not all) properties:
+     * The following table is a reminder of main (not all) recognized map entries:
      *
      * <table class="sis">
-     *   <caption>Recognized properties (non exhaustive list)</caption>
+     *   <caption>Recognized map entries (non exhaustive list)</caption>
      *   <tr>
-     *     <th>Property name</th>
+     *     <th>Map key</th>
      *     <th>Value type</th>
      *     <th>Returned by</th>
      *   </tr>
@@ -84,16 +84,16 @@ public class DefaultAssociationRole exte
      *   </tr>
      * </table>
      *
-     * @param properties    The name and other properties to be given to this association role.
-     * @param valueType     The type of feature values.
-     * @param minimumOccurs The minimum number of occurrences of the association within its containing entity.
-     * @param maximumOccurs The maximum number of occurrences of the association within its containing entity,
-     *                      or {@link Integer#MAX_VALUE} if there is no restriction.
+     * @param identification The name and other information to be given to this association role.
+     * @param valueType      The type of feature values.
+     * @param minimumOccurs  The minimum number of occurrences of the association within its containing entity.
+     * @param maximumOccurs  The maximum number of occurrences of the association within its containing entity,
+     *                       or {@link Integer#MAX_VALUE} if there is no restriction.
      */
-    public DefaultAssociationRole(final Map<String,?> properties, final DefaultFeatureType valueType,
+    public DefaultAssociationRole(final Map<String,?> identification, final DefaultFeatureType valueType,
             final int minimumOccurs, final int maximumOccurs)
     {
-        super(properties, minimumOccurs, maximumOccurs);
+        super(identification, minimumOccurs, maximumOccurs);
         ensureNonNull("valueType", valueType);
         this.valueType = valueType;
     }

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java [UTF-8] Wed May 14 11:25:32 2014
@@ -94,14 +94,14 @@ public class DefaultAttributeType<T> ext
     private final T defaultValue;
 
     /**
-     * Constructs an attribute type from the given properties. The properties map is given unchanged to
+     * Constructs an attribute type from the given properties. The identification map is given unchanged to
      * the {@linkplain AbstractIdentifiedType#AbstractIdentifiedType(Map) super-class constructor}.
-     * The following table is a reminder of main (not all) properties:
+     * The following table is a reminder of main (not all) recognized map entries:
      *
      * <table class="sis">
-     *   <caption>Recognized properties (non exhaustive list)</caption>
+     *   <caption>Recognized map entries (non exhaustive list)</caption>
      *   <tr>
-     *     <th>Property name</th>
+     *     <th>Map key</th>
      *     <th>Value type</th>
      *     <th>Returned by</th>
      *   </tr>
@@ -127,17 +127,17 @@ public class DefaultAttributeType<T> ext
      *   </tr>
      * </table>
      *
-     * @param properties    The name and other properties to be given to this attribute type.
-     * @param valueClass    The type of attribute values.
-     * @param minimumOccurs The minimum number of occurrences of the attribute within its containing entity.
-     * @param maximumOccurs The maximum number of occurrences of the attribute within its containing entity,
-     *                      or {@link Integer#MAX_VALUE} if there is no restriction.
-     * @param defaultValue  The default value for the attribute, or {@code null} if none.
+     * @param identification The name and other information to be given to this attribute type.
+     * @param valueClass     The type of attribute values.
+     * @param minimumOccurs  The minimum number of occurrences of the attribute within its containing entity.
+     * @param maximumOccurs  The maximum number of occurrences of the attribute within its containing entity,
+     *                       or {@link Integer#MAX_VALUE} if there is no restriction.
+     * @param defaultValue   The default value for the attribute, or {@code null} if none.
      */
-    public DefaultAttributeType(final Map<String,?> properties, final Class<T> valueClass,
+    public DefaultAttributeType(final Map<String,?> identification, final Class<T> valueClass,
             final int minimumOccurs, final int maximumOccurs, final T defaultValue)
     {
-        super(properties, minimumOccurs, maximumOccurs);
+        super(identification, minimumOccurs, maximumOccurs);
         ensureNonNull("valueClass",   valueClass);
         ensureCanCast("defaultValue", valueClass, defaultValue);
         this.valueClass   = valueClass;

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java [UTF-8] Wed May 14 11:25:32 2014
@@ -55,8 +55,7 @@ import org.apache.sis.internal.util.Unmo
  * Names can be {@linkplain org.apache.sis.util.iso.DefaultScopedName scoped} for avoiding name collision.
  *
  * {@section Properties and inheritance}
- * A feature type can inherit the properties of one or more other feature types.
- * Each feature type can provide descriptions for the following properties:
+ * Each feature type can provide descriptions for the following {@linkplain #properties() properties}:
  *
  * <ul>
  *   <li>{@linkplain DefaultAttributeType    Attributes}</li>
@@ -64,7 +63,15 @@ import org.apache.sis.internal.util.Unmo
  *   <li>{@linkplain DefaultOperation        Operations}</li>
  * </ul>
  *
- * The description of all those properties are collectively called {@linkplain #characteristics() characteristics}.
+ * In addition, a feature type can inherit the properties of one or more other feature types.
+ * Properties defined in the sub-type can override properties of the same name defined in the
+ * {@linkplain #superTypes() super-types}, provided that values of the sub-type property are
+ * assignable to the super-type property.
+ *
+ * <div class="note"><b>Analogy:</b> compared to the Java language, the above rule is similar to overriding a method
+ * with a more specific return type (a.k.a. <cite>covariant return type</cite>). This is also similar to Java arrays,
+ * which are implicitly <cite>covariant</cite> (i.e. {@code String[]} can be casted to {@code CharSequence[]}, which
+ * is safe for read operations but not for write operations — the later may throw {@link ArrayStoreException}).</div>
  *
  * {@section Immutability and thread safety}
  * Instances of this class are immutable if all properties ({@link GenericName} and {@link InternationalString}
@@ -119,7 +126,7 @@ public class DefaultFeatureType extends 
      * Any feature operation, any feature attribute type and any feature association role
      * that carries characteristics of a feature type.
      */
-    private final List<PropertyType> characteristics;
+    private final List<PropertyType> properties;
 
     /**
      * A lookup table for fetching properties by name, including the properties from super-types.
@@ -130,7 +137,7 @@ public class DefaultFeatureType extends 
     private transient Map<String, PropertyType> byName;
 
     /**
-     * Indices of properties in an array of properties similar to {@link #characteristics},
+     * Indices of properties in an array of properties similar to {@link #properties},
      * but excluding operations. This map includes the properties from the super-types.
      *
      * The size of this map may be smaller than the {@link #byName} size.
@@ -139,14 +146,14 @@ public class DefaultFeatureType extends 
     private transient Map<String, Integer> indices;
 
     /**
-     * Constructs a feature type from the given properties. The properties map is given unchanged to
+     * Constructs a feature type from the given properties. The identification map is given unchanged to
      * the {@linkplain AbstractIdentifiedType#AbstractIdentifiedType(Map) super-class constructor}.
-     * The following table is a reminder of main (not all) properties:
+     * The following table is a reminder of main (not all) recognized map entries:
      *
      * <table class="sis">
-     *   <caption>Recognized properties (non exhaustive list)</caption>
+     *   <caption>Recognized map entries (non exhaustive list)</caption>
      *   <tr>
-     *     <th>Property name</th>
+     *     <th>Map key</th>
      *     <th>Value type</th>
      *     <th>Returned by</th>
      *   </tr>
@@ -174,30 +181,55 @@ public class DefaultFeatureType extends 
      *
      * <div class="warning"><b>Warning:</b> In a future SIS version, the type of array elements may be
      * changed to {@code org.opengis.feature.FeatureType} and {@code org.opengis.feature.PropertyType}.
-     * This change is pending GeoAPI revision. In the meantime, make sure that the {@code characteristics}
+     * This change is pending GeoAPI revision. In the meantime, make sure that the {@code properties}
      * array contains only attribute types, association roles or operations, <strong>not</strong> other
      * feature types since the later are not properties in the ISO sense.</div>
      *
-     * @param properties The name and other properties to be given to this feature type.
-     * @param isAbstract If {@code true}, the feature type acts as an abstract super-type.
-     * @param superTypes The parents of this feature type, or {@code null} or empty if none.
-     * @param characteristics Any feature operation, any feature attribute type and any feature
-     *        association role that carries characteristics of a feature type.
+     * @param identification The name and other information to be given to this feature type.
+     * @param isAbstract     If {@code true}, the feature type acts as an abstract super-type.
+     * @param superTypes     The parents of this feature type, or {@code null} or empty if none.
+     * @param properties     Any feature operation, any feature attribute type and any feature
+     *                       association role that carries characteristics of a feature type.
      */
-    public DefaultFeatureType(final Map<String,?> properties, final boolean isAbstract,
-            final DefaultFeatureType[] superTypes, final AbstractIdentifiedType... characteristics)
+    public DefaultFeatureType(final Map<String,?> identification, final boolean isAbstract,
+            final DefaultFeatureType[] superTypes, final AbstractIdentifiedType... properties)
     {
-        super(properties);
-        ArgumentChecks.ensureNonNull("characteristics", characteristics);
+        super(identification);
+        ArgumentChecks.ensureNonNull("properties", properties);
         this.isAbstract = isAbstract;
         this.superTypes = (superTypes == null) ? Collections.<DefaultFeatureType>emptySet() :
                           CollectionsExt.<DefaultFeatureType>immutableSet(true, superTypes);
-        this.characteristics = UnmodifiableArrayList.wrap(Arrays.copyOf(
-                characteristics, characteristics.length, PropertyType[].class));
+        this.properties = UnmodifiableArrayList.wrap(Arrays.copyOf(
+                properties, properties.length, PropertyType[].class));
         computeTransientFields();
     }
 
     /**
+     * Returns the string representation of the given name, making sure that the name is non-null
+     * and the string non-empty. This method is used for checking argument validity.
+     *
+     * @param name   The name for which to get the string representation.
+     * @param source The feature which contains the property (typically {@code this}).
+     * @param index  Index of the property having the given name.
+     */
+    private String toString(final GenericName name, final DefaultFeatureType source, final int index) {
+        short key = Errors.Keys.MissingValueForProperty_1;
+        if (name != null) {
+            final String s = name.toString();
+            if (!s.isEmpty()) {
+                return s;
+            }
+            key = Errors.Keys.EmptyProperty_1;
+        }
+        final StringBuilder b = new StringBuilder(30);
+        if (source != this) {
+            b.append(source.getName()).append('.');
+        }
+        throw new IllegalArgumentException(Errors.format(key,
+                b.append("properties[").append(index).append("].name").toString()));
+    }
+
+    /**
      * Computes all transient fields ({@link #assignableTo}, {@link #byName}, {@link #indices}, {@link #isSimple}).
      *
      * <p>As a side effect, this method checks for missing or duplicated names.</p>
@@ -205,13 +237,13 @@ public class DefaultFeatureType extends 
      * @throws IllegalArgumentException if two properties have the same name.
      */
     private void computeTransientFields() {
-        final int capacity = Containers.hashMapCapacity(characteristics.size());
+        final int capacity = Containers.hashMapCapacity(properties.size());
         isSimple     = true;
         byName       = new LinkedHashMap<>(capacity);
         indices      = new HashMap<>(capacity);
         assignableTo = new HashSet<>(4);
         assignableTo.add(getName());
-        scanCharacteristicsFrom(this);
+        scanPropertiesFrom(this);
         byName       = CollectionsExt.unmodifiableOrCopy(byName);
         indices      = CollectionsExt.unmodifiableOrCopy(indices);
         assignableTo = CollectionsExt.unmodifiableOrCopy(assignableTo);
@@ -221,34 +253,33 @@ public class DefaultFeatureType extends 
      * Computes the transient fields using the non-transient information in the given {@code source}.
      * This method invokes itself recursively in order to use the information provided in super-types.
      */
-    private void scanCharacteristicsFrom(final DefaultFeatureType source) {
+    private void scanPropertiesFrom(final DefaultFeatureType source) {
         /*
          * Process all super-types before to process the given type. The intend is to have the
-         * super-types characteristics indexed before the sub-types ones in the 'indices' map.
+         * super-types properties indexed before the sub-types ones in the 'indices' map.
          */
         for (final DefaultFeatureType parent : source.superTypes()) {
             if (assignableTo.add(parent.getName())) {
-                scanCharacteristicsFrom(parent);
+                scanPropertiesFrom(parent);
             }
         }
         int index = -1;
-        for (final PropertyType property : source.characteristics) {
-            ArgumentChecks.ensureNonNullElement("characteristics", ++index, property);
+        Map<DefaultFeatureType,Boolean> done = null;
+        for (final PropertyType property : source.properties) {
+            ArgumentChecks.ensureNonNullElement("properties", ++index, property);
             /*
-             * Fill the (name, property) map, after opportunist verification of argument validity.
+             * Fill the (name, property) map with opportunist verification of argument validity.
              */
-            final GenericName gn = property.getName();
-            if (gn == null) {
-                final StringBuilder b = new StringBuilder(30);
-                if (source != this) {
-                    b.append(source.getName()).append('.');
+            final String name = toString(property.getName(), source, index);
+            final PropertyType previous = byName.put(name, property);
+            if (previous != null) {
+                if (done == null) {
+                    done = new IdentityHashMap<>(4); // Guard against infinite recursivity.
                 }
-                throw new IllegalArgumentException(Errors.format(Errors.Keys.MissingValueForProperty_1,
-                        b.append("characteristics[").append(index).append("].name")));
-            }
-            final String name = gn.toString();
-            if (byName.put(name, property) != null) {
-                throw new IllegalArgumentException(Errors.format(Errors.Keys.DuplicatedIdentifier_1, name));
+                if (!isAssignableIgnoreName(previous, property, done)) {
+                    throw new IllegalArgumentException(Errors.format(Errors.Keys.PropertyAlreadyExists_2, name));
+                }
+                done.clear();
             }
             /*
              * Fill the (name, indice) map. Values are indices that the property elements would have
@@ -326,46 +357,72 @@ public class DefaultFeatureType extends 
             return true; // Optimization for a common case.
         }
         ArgumentChecks.ensureNonNull("type", type);
-        return maybeAssignableFrom(type) && isSubsetOf(type, new IdentityHashMap<>(4));
+        return maybeAssignableFrom(type) && isAssignableIgnoreName(type, new IdentityHashMap<>(4));
     }
 
     /**
      * Return {@code true} if all properties in this type are also properties in the given type.
+     * This method does not compare the names — this verification is presumed already done by the caller.
      *
      * @param type The type to check.
      * @param done An initially empty map to be used for avoiding infinite recursivity.
      */
-    private boolean isSubsetOf(final DefaultFeatureType type, final Map<DefaultFeatureType,Boolean> done) {
+    private boolean isAssignableIgnoreName(final DefaultFeatureType type, final Map<DefaultFeatureType,Boolean> done) {
         if (done.put(this, Boolean.TRUE) == null) {
             /*
              * Ensures that all properties defined in this feature type is also defined
              * in the given property, and that the former is assignable from the later.
              */
             for (final Map.Entry<String, PropertyType> entry : byName.entrySet()) {
-                final PropertyType property = entry.getValue();
                 final PropertyType other = type.getProperty(entry.getKey());
-                if (property != other) {
-                    if (other == null) {
-                        return false;
-                    }
-                    boolean isAssignable = true;
-                    /*
-                     * TODO: DefaultAttributeType and DefaultAssociationRole to be replaced by GeoAPI interfaces
-                     *       (pending GeoAPI review).
-                     */
-                    if (property instanceof DefaultAttributeType<?>) {
-                        isAssignable &= (other instanceof DefaultAttributeType<?>) &&
-                                        ((DefaultAttributeType<?>) property).getValueClass().isAssignableFrom(
-                                        ((DefaultAttributeType<?>) other   ).getValueClass());
-                    }
-                    if (property instanceof DefaultAssociationRole) {
-                        isAssignable &= (other instanceof DefaultAssociationRole) &&
-                                        ((DefaultAssociationRole) property).getValueType().isSubsetOf(
-                                        ((DefaultAssociationRole) other   ).getValueType(), done);
-                    }
-                    if (!isAssignable) {
-                        return false;
-                    }
+                if (other == null || !isAssignableIgnoreName(entry.getValue(), other, done)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns {@code true} if instances of the {@code other} type are assignable to the given {@code base} type.
+     * This method does not compare the names — this verification is presumed already done by the caller.
+     */
+    private static boolean isAssignableIgnoreName(final PropertyType base, final PropertyType other,
+            final Map<DefaultFeatureType,Boolean> done)
+    {
+        if (base != other) {
+            /*
+             * TODO: DefaultAttributeType and DefaultAssociationRole to be replaced by GeoAPI interfaces
+             *       (pending GeoAPI review).
+             */
+            if (base instanceof DefaultAttributeType<?>) {
+                if (!(other instanceof DefaultAttributeType<?>)) {
+                    return false;
+                }
+                final DefaultAttributeType<?> p0 = (DefaultAttributeType<?>) base;
+                final DefaultAttributeType<?> p1 = (DefaultAttributeType<?>) other;
+                if (!p0.getValueClass().isAssignableFrom(p1.getValueClass()) ||
+                     p0.getMinimumOccurs() > p1.getMinimumOccurs() ||
+                     p0.getMaximumOccurs() < p1.getMaximumOccurs())
+                {
+                    return false;
+                }
+            }
+            if (base instanceof DefaultAssociationRole) {
+                if (!(other instanceof DefaultAssociationRole)) {
+                    return false;
+                }
+                final DefaultAssociationRole p0 = (DefaultAssociationRole) base;
+                final DefaultAssociationRole p1 = (DefaultAssociationRole) other;
+                if (p0.getMinimumOccurs() > p1.getMinimumOccurs() ||
+                    p0.getMaximumOccurs() < p1.getMaximumOccurs())
+                {
+                    return false;
+                }
+                final DefaultFeatureType f0 = p0.getValueType();
+                final DefaultFeatureType f1 = p1.getValueType();
+                if (!f0.maybeAssignableFrom(f1) || !f0.isAssignableIgnoreName(f1, done)) {
+                    return false;
                 }
             }
         }
@@ -397,8 +454,8 @@ public class DefaultFeatureType extends 
      * @return Feature operation, attribute type and association role that carries characteristics of this
      *         feature type (not including parent types).
      */
-    public List<AbstractIdentifiedType> characteristics() {
-        return (List) characteristics; // Cast is safe because the list is read-only.
+    public List<AbstractIdentifiedType> properties() {
+        return (List) properties; // Cast is safe because the list is read-only.
     }
 
     /**
@@ -426,7 +483,7 @@ public class DefaultFeatureType extends 
      */
     @Override
     public int hashCode() {
-        return super.hashCode() + superTypes.hashCode() + 37*characteristics.hashCode();
+        return super.hashCode() + superTypes.hashCode() + 37*properties.hashCode();
     }
 
     /**
@@ -443,7 +500,7 @@ public class DefaultFeatureType extends 
             final DefaultFeatureType that = (DefaultFeatureType) obj;
             return isAbstract == that.isAbstract &&
                    superTypes.equals(that.superTypes) &&
-                   characteristics.equals(that.characteristics);
+                   properties.equals(that.properties);
         }
         return false;
     }

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultOperation.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultOperation.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultOperation.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultOperation.java [UTF-8] Wed May 14 11:25:32 2014
@@ -58,17 +58,17 @@ public class DefaultOperation extends Pr
     private final DefaultAttributeType<?> result;
 
     /**
-     * Constructs an attribute type from the given properties. The properties map is given unchanged to
+     * Constructs an operation from the given properties. The identification map is given unchanged to
      * the {@linkplain AbstractIdentifiedType#AbstractIdentifiedType(Map) super-class constructor}.
      *
-     * @param properties The name and other properties to be given to this operation.
-     * @param parameters A description of the input parameters.
-     * @param result     The type of the result, or {@code null} if none.
+     * @param identification The name and other information to be given to this operation.
+     * @param parameters     A description of the input parameters.
+     * @param result         The type of the result, or {@code null} if none.
      */
-    public DefaultOperation(final Map<String,?> properties,
+    public DefaultOperation(final Map<String,?> identification,
             final ParameterDescriptorGroup parameters, final DefaultAttributeType<?> result)
     {
-        super(properties);
+        super(identification);
         ArgumentChecks.ensureNonNull("inputs", parameters);
         this.parameters = parameters;
         this.result     = result;

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FieldType.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FieldType.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FieldType.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FieldType.java [UTF-8] Wed May 14 11:25:32 2014
@@ -48,16 +48,16 @@ abstract class FieldType extends Propert
     private final int maximumOccurs;
 
     /**
-     * Constructs a field type from the given properties. The properties map is given unchanged to
+     * Constructs a field type from the given properties. The identification map is given unchanged to
      * the {@linkplain AbstractIdentifiedType#AbstractIdentifiedType(Map) super-class constructor}.
      *
-     * @param properties    The name and other properties to be given to this field type.
-     * @param minimumOccurs The minimum number of occurrences of the property within its containing entity.
-     * @param maximumOccurs The maximum number of occurrences of the property within its containing entity,
-     *                      or {@link Integer#MAX_VALUE} if there is no restriction.
+     * @param identification The name and other information to be given to this field type.
+     * @param minimumOccurs  The minimum number of occurrences of the property within its containing entity.
+     * @param maximumOccurs  The maximum number of occurrences of the property within its containing entity,
+     *                       or {@link Integer#MAX_VALUE} if there is no restriction.
      */
-    FieldType(final Map<String,?> properties, final int minimumOccurs, final int maximumOccurs) {
-        super(properties);
+    FieldType(final Map<String,?> identification, final int minimumOccurs, final int maximumOccurs) {
+        super(identification);
         if (minimumOccurs < 0 || maximumOccurs < minimumOccurs) {
             throw new IllegalArgumentException(Errors.format(
                     Errors.Keys.IllegalRange_2, minimumOccurs, maximumOccurs));

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyType.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyType.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyType.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/PropertyType.java [UTF-8] Wed May 14 11:25:32 2014
@@ -40,7 +40,7 @@ class PropertyType extends AbstractIdent
     /**
      * Passes the given properties unchanged to the super-class constructor.
      */
-    PropertyType(final Map<String,?> properties) throws IllegalArgumentException {
-        super(properties);
+    PropertyType(final Map<String,?> identification) throws IllegalArgumentException {
+        super(identification);
     }
 }

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java [UTF-8] Wed May 14 11:25:32 2014
@@ -130,7 +130,8 @@ final class Validator {
             }
         } else {
             if (maximumOccurs == 0) {
-                // TODO
+                addViolationReport(type, Errors.formatInternational(
+                        Errors.Keys.ForbiddenProperty_1, type.getName()));
             }
         }
     }

Modified: sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java [UTF-8] Wed May 14 11:25:32 2014
@@ -22,8 +22,12 @@
  *
  * <ul>
  *   <li><p><b>{@linkplain org.apache.sis.feature.DefaultFeatureType Feature types}</b><br>
- *       Define the <em>structure</em> of real-world representations. A feature type lists the attributes, operations,
- *       or associations to other features (collectively called “characteristics”) that a feature can have.</p>
+ *       Define the <em>structure</em> of real-world representations. A feature type lists the
+ *       {@linkplain org.apache.sis.feature.DefaultAttributeType attributes},
+ *       {@linkplain org.apache.sis.feature.DefaultOperation operations} or
+ *       {@linkplain org.apache.sis.feature.DefaultAssociationRole associations to other features}
+ *       (collectively called “{@linkplain org.apache.sis.feature.DefaultFeatureType#properties() properties}”
+ *       or “characteristics”) that a feature can have.</p>
  *
  *       <div class="note"><b>Analogy:</b> a {@code FeatureType} in a Spatial Information System is equivalent to a
  *       {@link java.lang.Class} in the Java language. By extension, {@code AttributeType} and {@code Operation} are
@@ -40,6 +44,12 @@
  *       are constrained to the [1 … 1] cardinality. Such simple features are very common.</p></li>
  * </ul>
  *
+ * In addition, a feature type can inherit the properties of one or more other feature types.
+ * Properties defined in the sub-type can override properties of the same name defined in the
+ * {@linkplain org.apache.sis.feature.DefaultFeatureType#superTypes() super-types}, provided
+ * that values of the sub-type property are assignable to the super-type property.
+ *
+ * {@section Naming}
  * Each feature type has a {@linkplain org.apache.sis.feature.DefaultFeatureType#getName() name},
  * which should be unique. Those names are the main criterion used for checking if a feature type
  * {@linkplain org.apache.sis.feature.DefaultFeatureType#isAssignableFrom is assignable from} another type.

Modified: sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java [UTF-8] Wed May 14 11:25:32 2014
@@ -41,33 +41,33 @@ public final strictfp class DefaultAttri
     /**
      * Creates an attribute type for city name.
      *
-     * @param properties An empty temporary map (provided only for recycling existing instances).
+     * @param identification An empty temporary map (provided only for recycling existing instances).
      */
-    static DefaultAttributeType<String> city(final Map<String,Object> properties) {
-        assertNull(properties.put(DefaultAttributeType.NAME_KEY, "city"));
-        assertNull(properties.put(DefaultAttributeType.DESIGNATION_KEY + "_en", "City"));
-        assertNull(properties.put(DefaultAttributeType.DESIGNATION_KEY + "_fr", "Ville"));
-        assertNull(properties.put(DefaultAttributeType.DESIGNATION_KEY + "_ja", "都市"));
-        assertNull(properties.put(DefaultAttributeType.DEFINITION_KEY  + "_en", "The name of the city."));
-        assertNull(properties.put(DefaultAttributeType.DEFINITION_KEY  + "_fr", "Le nom de la ville."));
-        assertNull(properties.put(DefaultAttributeType.DEFINITION_KEY  + "_ja", "都市の名前。"));
-        assertNull(properties.put(DefaultAttributeType.DESCRIPTION_KEY, "Some verbose description."));
-        final DefaultAttributeType<String> city = new DefaultAttributeType<>(properties,
+    static DefaultAttributeType<String> city(final Map<String,Object> identification) {
+        assertNull(identification.put(DefaultAttributeType.NAME_KEY, "city"));
+        assertNull(identification.put(DefaultAttributeType.DESIGNATION_KEY + "_en", "City"));
+        assertNull(identification.put(DefaultAttributeType.DESIGNATION_KEY + "_fr", "Ville"));
+        assertNull(identification.put(DefaultAttributeType.DESIGNATION_KEY + "_ja", "都市"));
+        assertNull(identification.put(DefaultAttributeType.DEFINITION_KEY  + "_en", "The name of the city."));
+        assertNull(identification.put(DefaultAttributeType.DEFINITION_KEY  + "_fr", "Le nom de la ville."));
+        assertNull(identification.put(DefaultAttributeType.DEFINITION_KEY  + "_ja", "都市の名前。"));
+        assertNull(identification.put(DefaultAttributeType.DESCRIPTION_KEY, "Some verbose description."));
+        final DefaultAttributeType<String> city = new DefaultAttributeType<>(identification,
                 String.class, 1, 1, "Utopia");
-        properties.clear();
+        identification.clear();
         return city;
     }
 
     /**
      * Creates an attribute type for city population.
      *
-     * @param properties An empty temporary map (provided only for recycling existing instances).
+     * @param identification An empty temporary map (provided only for recycling existing instances).
      */
-    static DefaultAttributeType<Integer> population(final Map<String,Object> properties) {
-        assertNull(properties.put(DefaultAttributeType.NAME_KEY, "population"));
+    static DefaultAttributeType<Integer> population(final Map<String,Object> identification) {
+        assertNull(identification.put(DefaultAttributeType.NAME_KEY, "population"));
         final DefaultAttributeType<Integer> population = new DefaultAttributeType<>(
-                properties, Integer.class, 1, 1, null);
-        properties.clear();
+                identification, Integer.class, 1, 1, null);
+        identification.clear();
         return population;
     }
 
@@ -106,9 +106,9 @@ public final strictfp class DefaultAttri
      */
     @Test
     public void testEquals() {
-        final Map<String,Object> properties = new HashMap<>(4);
-        final DefaultAttributeType<Integer> a1 = population(properties);
-        final DefaultAttributeType<Integer> a2 = population(properties);
+        final Map<String,Object> identification = new HashMap<>(4);
+        final DefaultAttributeType<Integer> a1 = population(identification);
+        final DefaultAttributeType<Integer> a2 = population(identification);
         assertFalse ("equals",   a1.equals(null));
         assertTrue  ("equals",   a1.equals(a2));
         assertEquals("hashCode", a1.hashCode(), a2.hashCode());

Modified: sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java [UTF-8] Wed May 14 11:25:32 2014
@@ -42,13 +42,13 @@ public final strictfp class DefaultFeatu
      * Creates a simple feature type without super-types.
      */
     static DefaultFeatureType cityPopulation() {
-        final Map<String,Object>            properties = new HashMap<>();
-        final DefaultAttributeType<String>  city       = DefaultAttributeTypeTest.city(properties);
-        final DefaultAttributeType<Integer> population = DefaultAttributeTypeTest.population(properties);
-
-        properties.clear();
-        assertNull(properties.put(DefaultFeatureType.NAME_KEY, "City population"));
-        return new DefaultFeatureType(properties, false, null, city, population);
+        final Map<String,Object> identification = new HashMap<>();
+        final DefaultAttributeType<String>  city       = DefaultAttributeTypeTest.city(identification);
+        final DefaultAttributeType<Integer> population = DefaultAttributeTypeTest.population(identification);
+
+        identification.clear();
+        assertNull(identification.put(DefaultFeatureType.NAME_KEY, "City population"));
+        return new DefaultFeatureType(identification, false, null, city, population);
     }
 
     /**
@@ -78,15 +78,15 @@ public final strictfp class DefaultFeatu
         /*
          * Verify content.
          */
-        final List<AbstractIdentifiedType> characteristics = simple.characteristics();
-        assertEquals("characteristics.size", 2,            characteristics.size());
-        assertEquals("characteristics[0]",   "city",       characteristics.get(0).getName().toString());
-        assertEquals("characteristics[1]",   "population", characteristics.get(1).getName().toString());
+        final List<AbstractIdentifiedType> properties = simple.properties();
+        assertEquals("properties.size", 2,            properties.size());
+        assertEquals("properties[0]",   "city",       properties.get(0).getName().toString());
+        assertEquals("properties[1]",   "population", properties.get(1).getName().toString());
         /*
          * Verify search by name.
          */
-        assertSame(characteristics.get(0), simple.getProperty("city"));
-        assertSame(characteristics.get(1), simple.getProperty("population"));
+        assertSame(properties.get(0), simple.getProperty("city"));
+        assertSame(properties.get(1), simple.getProperty("population"));
         assertNull(                        simple.getProperty("apple"));
     }
 
@@ -98,10 +98,10 @@ public final strictfp class DefaultFeatu
     @Test
     @DependsOnMethod("testSimple")
     public void testComplex() {
-        final Map<String,Object>            properties = new HashMap<>();
-        final DefaultAttributeType<String>  city       = DefaultAttributeTypeTest.city(properties);
-        final DefaultAttributeType<Integer> population = DefaultAttributeTypeTest.population(properties);
-        properties.clear();
+        final Map<String,Object> identification = new HashMap<>();
+        final DefaultAttributeType<String>  city       = DefaultAttributeTypeTest.city(identification);
+        final DefaultAttributeType<Integer> population = DefaultAttributeTypeTest.population(identification);
+        identification.clear();
         for (int i=0; i<=4; i++) {
             final int minimumOccurs, maximumOccurs;
             switch (i) {
@@ -112,28 +112,28 @@ public final strictfp class DefaultFeatu
                 case 4: minimumOccurs = 1; maximumOccurs = 1; break; // Simple
                 default: throw new AssertionError(i);
             }
-            properties.put(DefaultAttributeType.NAME_KEY, "festival");
+            identification.put(DefaultAttributeType.NAME_KEY, "festival");
             final DefaultAttributeType<String> festival = new DefaultAttributeType<>(
-                    properties, String.class, minimumOccurs, maximumOccurs, null);
+                    identification, String.class, minimumOccurs, maximumOccurs, null);
             /*
              * Build the feature.
              */
-            properties.put(DefaultAttributeType.NAME_KEY, "City festival");
-            final DefaultFeatureType complex = new DefaultFeatureType(properties, false, null, city, population, festival);
-            final List<AbstractIdentifiedType> characteristics = complex.characteristics();
+            identification.put(DefaultAttributeType.NAME_KEY, "City festival");
+            final DefaultFeatureType complex = new DefaultFeatureType(identification, false, null, city, population, festival);
+            final List<AbstractIdentifiedType> properties = complex.properties();
             /*
              * Verify content.
              */
-            assertEquals("name",                 "City festival",                complex.getName().toString());
-            assertFalse ("isAbstract",                                           complex.isAbstract());
-            assertEquals("isSimple",             maximumOccurs == minimumOccurs, complex.isSimple());
-            assertEquals("instanceSize",         maximumOccurs == 0 ? 2 : 3,     complex.getInstanceSize());
-            assertEquals("characteristics.size", 3,                              characteristics.size());
-            assertSame  ("characteristics[0]",   city,                           characteristics.get(0));
-            assertSame  ("characteristics[1]",   population,                     characteristics.get(1));
-            assertSame  ("characteristics[3]",   festival,                       characteristics.get(2));
-            assertEquals("minimumOccurs",        minimumOccurs,                  festival.getMinimumOccurs());
-            assertEquals("maximumOccurs",        maximumOccurs,                  festival.getMaximumOccurs());
+            assertEquals("name",            "City festival",                complex.getName().toString());
+            assertFalse ("isAbstract",                                      complex.isAbstract());
+            assertEquals("isSimple",        maximumOccurs == minimumOccurs, complex.isSimple());
+            assertEquals("instanceSize",    maximumOccurs == 0 ? 2 : 3,     complex.getInstanceSize());
+            assertEquals("properties.size", 3,                              properties.size());
+            assertSame  ("properties[0]",   city,                           properties.get(0));
+            assertSame  ("properties[1]",   population,                     properties.get(1));
+            assertSame  ("properties[3]",   festival,                       properties.get(2));
+            assertEquals("minimumOccurs",   minimumOccurs,                  festival.getMinimumOccurs());
+            assertEquals("maximumOccurs",   maximumOccurs,                  festival.getMaximumOccurs());
         }
     }
 
@@ -150,9 +150,9 @@ public final strictfp class DefaultFeatu
         final DefaultAttributeType<Integer> population = new DefaultAttributeType<>(
                 singletonMap(DefaultAttributeType.NAME_KEY, "population"), Integer.class, 1, 1, null);
 
-        final Map<String,String> properties = singletonMap(DefaultAttributeType.NAME_KEY, "City population");
+        final Map<String,String> identification = singletonMap(DefaultAttributeType.NAME_KEY, "City population");
         try {
-            new DefaultFeatureType(properties, false, null, city, population, cityId);
+            new DefaultFeatureType(identification, false, null, city, population, cityId);
             fail("Duplicated attribute names shall not be allowed.");
         } catch (IllegalArgumentException e) {
             final String message = e.getMessage();
@@ -179,14 +179,14 @@ public final strictfp class DefaultFeatu
         /*
          * Verify content.
          */
-        List<AbstractIdentifiedType> characteristics = city.characteristics();
-        assertEquals("characteristics.size", 2,            characteristics.size());
-        assertEquals("characteristics[0]",   "city",       characteristics.get(0).getName().toString());
-        assertEquals("characteristics[1]",   "population", characteristics.get(1).getName().toString());
-
-        characteristics = capital.characteristics();
-        assertEquals("characteristics.size", 1,            characteristics.size());
-        assertEquals("characteristics[0]",   "since",      characteristics.get(0).getName().toString());
+        List<AbstractIdentifiedType> properties = city.properties();
+        assertEquals("properties.size", 2,            properties.size());
+        assertEquals("properties[0]",   "city",       properties.get(0).getName().toString());
+        assertEquals("properties[1]",   "population", properties.get(1).getName().toString());
+
+        properties = capital.properties();
+        assertEquals("properties.size", 1,            properties.size());
+        assertEquals("properties[0]",   "since",      properties.get(0).getName().toString());
         /*
          * Verify search by name.
          */

Modified: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java [UTF-8] Wed May 14 11:25:32 2014
@@ -225,6 +225,11 @@ public final class Errors extends Indexe
         public static final short ForbiddenAttribute_2 = 26;
 
         /**
+         * Property “{0}” is not allowed.
+         */
+        public static final short ForbiddenProperty_1 = 155;
+
+        /**
          * Identifier “{0}” is already associated to another object.
          */
         public static final short IdentifierAlreadyBound_1 = 27;
@@ -633,6 +638,11 @@ public final class Errors extends Indexe
         public static final short ParameterNotFound_2 = 147;
 
         /**
+         * Property “{1}” is already exists in “{0}”.
+         */
+        public static final short PropertyAlreadyExists_2 = 156;
+
+        /**
          * No property named “{1}” has been found in “{0}”.
          */
         public static final short PropertyNotFound_2 = 71;

Modified: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.properties [ISO-8859-1] Wed May 14 11:25:32 2014
@@ -56,6 +56,7 @@ ExcessiveArgumentSize_3           = Argu
 ExcessiveListSize_2               = A size of {1} elements is excessive for the \u201c{0}\u201d list.
 ExcessiveStringSize               = The character string is too long.
 ForbiddenAttribute_2              = Attribute \u201c{0}\u201d is not allowed for an object of type \u2018{1}\u2019.
+ForbiddenProperty_1               = Property \u201c{0}\u201d is not allowed.
 IllegalArgumentClass_2            = Argument \u2018{0}\u2019 can not be an instance of \u2018{1}\u2019.
 IllegalArgumentClass_3            = Argument \u2018{0}\u2019 can not be an instance of \u2018{2}\u2019. Expected an instance of \u2018{1}\u2019 or derived type.
 IllegalArgumentField_4            = Argument \u2018{0}\u2019 can not take the \u201c{1}\u201d value, because the \u2018{2}\u2019 field can not take the \u201c{3}\u201d value.
@@ -137,6 +138,7 @@ NullCollectionElement_1           = \u20
 NullMapKey                        = Null key is not allowed in this dictionary.
 NullMapValue                      = Null values are not allowed in this dictionary.
 OddArrayLength_1                  = Array length is {0}, while we expected an even length.
+PropertyAlreadyExists_2           = Property \u201c{1}\u201d is already exists in \u201c{0}\u201d.
 ParameterNotFound_2               = No parameter named \u201c{1}\u201d has been found in \u201c{0}\u201d.
 PropertyNotFound_2                = No property named \u201c{1}\u201d has been found in \u201c{0}\u201d.
 SingularMatrix                    = Matrix is singular.

Modified: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties?rev=1594544&r1=1594543&r2=1594544&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] Wed May 14 11:25:32 2014
@@ -46,6 +46,7 @@ ExcessiveArgumentSize_3           = L\u2
 ExcessiveListSize_2               = Une taille de {1} \u00e9l\u00e9ments est excessive pour la liste \u00ab\u202f{0}\u202f\u00bb.
 ExcessiveStringSize               = La cha\u00eene de caract\u00e8res est trop longue.
 ForbiddenAttribute_2              = L\u2019attribut \u00ab\u202f{0}\u202f\u00bb n\u2019est pas autoris\u00e9 pour un objet de type \u2018{1}\u2019.
+ForbiddenProperty_1               = La propri\u00e9t\u00e9 \u00ab\u202f{0}\u202f\u00bb n\u2019est pas autoris\u00e9e.
 IllegalArgumentClass_2            = L\u2019argument \u2018{0}\u2019 ne peut pas \u00eatre de type \u2018{1}\u2019.
 IllegalArgumentClass_3            = L\u2019argument \u2018{0}\u2019 ne peut pas \u00eatre de type \u2018{2}\u2019. Une instance de \u2018{1}\u2019 ou d\u2019un type d\u00e9riv\u00e9 \u00e9tait attendue.
 IllegalArgumentField_4            = L\u2019argument \u2018{0}\u2019 n\u2019accepte pas la valeur \u00ab\u202f{1}\u202f\u00bb parce que le champs \u2018{2}\u2019 ne peut pas prendre la valeur \u00ab\u202f{3}\u202f\u00bb.
@@ -126,6 +127,7 @@ NullCollectionElement_1           = La c
 NullMapKey                        = La cl\u00e9 nulle n\u2019est pas autoris\u00e9e dans ce dictionnaire.
 NullMapValue                      = Les valeurs nulles ne sont pas autoris\u00e9es dans ce dictionnaire.
 OddArrayLength_1                  = La longueur du tableau est {0}, alors qu\u2019on attendait une longueur paire.
+PropertyAlreadyExists_2           = La propri\u00e9t\u00e9 \u00ab\u202f{1}\u202f\u00bb existe d\u00e9j\u00e0 dans \u00ab\u202f{0}\u202f\u00bb.
 ParameterNotFound_2               = Aucun param\u00e8tre nomm\u00e9 \u00ab\u202f{1}\u202f\u00bb n\u2019a \u00e9t\u00e9 trouv\u00e9 dans \u00ab\u202f{0}\u202f\u00bb.
 PropertyNotFound_2                = Aucune propri\u00e9t\u00e9 nomm\u00e9e \u00ab\u202f{1}\u202f\u00bb n\u2019a \u00e9t\u00e9 trouv\u00e9e dans \u00ab\u202f{0}\u202f\u00bb.
 RecursiveCreateCallForKey_1       = Appel r\u00e9cursif lors de la cr\u00e9ation d\u2019un objet pour la cl\u00e9 \u00ab\u202f{0}\u202f\u00bb.



Mime
View raw message