Author: desruisseaux
Date: Thu May 29 19:36:40 2014
New Revision: 1598380

URL: http://svn.apache.org/r1598380
Log:
DefaultAssociationRole now implements FeatureAssociationRole.

Modified:
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.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/DefaultFeatureType.java
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureFormat.java
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
    
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/Validator.java
    
sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java

Modified: 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -27,6 +27,7 @@ import org.apache.sis.util.resources.Err
 
 // Branch-dependent imports
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -57,16 +58,16 @@ public abstract class AbstractAssociatio
     /**
      * Information about the association.
      */
-    final DefaultAssociationRole role;
+    final FeatureAssociationRole role;
 
     /**
      * Creates a new association of the given role.
      *
      * @param role Information about the association.
      *
-     * @see #create(DefaultAssociationRole)
+     * @see #create(FeatureAssociationRole)
      */
-    protected AbstractAssociation(final DefaultAssociationRole role) {
+    protected AbstractAssociation(final FeatureAssociationRole role) {
         this.role = role;
     }
 
@@ -76,7 +77,7 @@ public abstract class AbstractAssociatio
      * @param  role Information about the association.
      * @return The new association.
      */
-    public static AbstractAssociation create(final DefaultAssociationRole 
role) {
+    public static AbstractAssociation create(final FeatureAssociationRole 
role) {
         ArgumentChecks.ensureNonNull("role", role);
         return isSingleton(role.getMaximumOccurs())
                ? new SingletonAssociation(role)
@@ -90,7 +91,7 @@ public abstract class AbstractAssociatio
      * @param  value The initial value (may be {@code null}).
      * @return The new association.
      */
-    static AbstractAssociation create(final DefaultAssociationRole role, final 
Object value) {
+    static AbstractAssociation create(final FeatureAssociationRole role, final 
Object value) {
         ArgumentChecks.ensureNonNull("role", role);
         return isSingleton(role.getMaximumOccurs())
                ? new SingletonAssociation(role, (AbstractFeature) value)
@@ -99,7 +100,7 @@ public abstract class AbstractAssociatio
 
     /**
      * Returns the name of this association as defined by its {@linkplain 
#getRole() role}.
-     * This convenience method delegates to {@link 
DefaultAssociationRole#getName()}.
+     * This convenience method delegates to {@link 
FeatureAssociationRole#getName()}.
      *
      * @return The association name specified by its role.
      */
@@ -111,12 +112,9 @@ public abstract class AbstractAssociatio
     /**
      * Returns information about the association.
      *
-     * <div class="warning"><b>Warning:</b> In a future SIS version, the 
return type may be changed
-     * to {@code org.opengis.feature.AssociationRole}. This change is pending 
GeoAPI revision.</div>
-     *
      * @return Information about the association.
      */
-    public DefaultAssociationRole getRole() {
+    public FeatureAssociationRole getRole() {
         return role;
     }
 
@@ -225,7 +223,7 @@ public abstract class AbstractAssociatio
     @Debug
     @Override
     public String toString() {
-        final String pt = role.getTitleProperty();
+        final String pt = DefaultAssociationRole.getTitleProperty(role);
         final Iterator<AbstractFeature> it = getValues().iterator();
         return FieldType.toString("FeatureAssociation", role, 
role.getValueType().getName(), new Iterator<Object>() {
             @Override public boolean hasNext() {

Modified: 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -32,6 +32,7 @@ import org.apache.sis.internal.util.Chec
 import org.opengis.feature.PropertyType;
 import org.opengis.feature.AttributeType;
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -175,8 +176,8 @@ public abstract class AbstractFeature im
         final PropertyType pt = type.getProperty(name);
         if (pt instanceof AttributeType<?>) {
             return AbstractAttribute.create((AttributeType<?>) pt, value);
-        } else if (pt instanceof DefaultAssociationRole) {
-            return AbstractAssociation.create((DefaultAssociationRole) pt, 
value);
+        } else if (pt instanceof FeatureAssociationRole) {
+            return AbstractAssociation.create((FeatureAssociationRole) pt, 
value);
         } else {
             // Should never happen, unless the user gave us some mutable 
FeatureType.
             throw new 
CorruptedObjectException(Errors.format(Errors.Keys.UnknownType_1, pt));
@@ -194,8 +195,8 @@ public abstract class AbstractFeature im
         final PropertyType pt = type.getProperty(name);
         if (pt instanceof AttributeType<?>) {
             return AbstractAttribute.create((AttributeType<?>) pt);
-        } else if (pt instanceof DefaultAssociationRole) {
-            return AbstractAssociation.create((DefaultAssociationRole) pt);
+        } else if (pt instanceof FeatureAssociationRole) {
+            return AbstractAssociation.create((FeatureAssociationRole) pt);
         } else {
             throw unsupportedPropertyType(pt.getName());
         }
@@ -213,7 +214,7 @@ public abstract class AbstractFeature im
         final PropertyType pt = type.getProperty(name);
         if (pt instanceof AttributeType<?>) {
             return getDefaultValue((AttributeType<?>) pt);
-        } else if (pt instanceof DefaultAssociationRole) {
+        } else if (pt instanceof FeatureAssociationRole) {
             return null; // No default value for associations.
         } else {
             throw unsupportedPropertyType(pt.getName());
@@ -343,7 +344,7 @@ public abstract class AbstractFeature im
     @SuppressWarnings("unchecked")
     private static void setAssociationValue(final AbstractAssociation 
association, final Object value) {
         if (value != null) {
-            final DefaultAssociationRole role = association.getRole();
+            final FeatureAssociationRole role = association.getRole();
             final FeatureType base = role.getValueType();
             if (value instanceof AbstractFeature) {
                 final FeatureType actual = ((AbstractFeature) value).getType();
@@ -413,9 +414,9 @@ public abstract class AbstractFeature im
             if (value != null) {
                 return verifyAttributeValue((AttributeType<?>) pt, value);
             }
-        } else if (pt instanceof DefaultAssociationRole) {
+        } else if (pt instanceof FeatureAssociationRole) {
             if (value != null) {
-                return verifyAssociationValue((DefaultAssociationRole) pt, 
value);
+                return verifyAssociationValue((FeatureAssociationRole) pt, 
value);
             }
         } else {
             throw unsupportedPropertyType(pt.getName());
@@ -455,7 +456,7 @@ public abstract class AbstractFeature im
      *
      * @param value The value, which shall be non-null.
      */
-    private static Object verifyAssociationValue(final DefaultAssociationRole 
role, final Object value) {
+    private static Object verifyAssociationValue(final FeatureAssociationRole 
role, final Object value) {
         final boolean isSingleton = Field.isSingleton(role.getMaximumOccurs());
         if (value instanceof AbstractFeature) {
             /*
@@ -480,7 +481,7 @@ public abstract class AbstractFeature im
     /**
      * Verifies if all values in the given collection are valid instances of 
feature for the given association role.
      */
-    private static void verifyAssociationValues(final DefaultAssociationRole 
role, final Collection<?> values) {
+    private static void verifyAssociationValues(final FeatureAssociationRole 
role, final Collection<?> values) {
         final FeatureType base = role.getValueType();
         int index = 0;
         for (final Object value : values) {

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=1598380&r1=1598379&r2=1598380&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] Thu May 29 19:36:40 2014
@@ -27,6 +27,7 @@ import static org.apache.sis.util.Argume
 import org.opengis.feature.PropertyType;
 import org.opengis.feature.AttributeType;
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -53,7 +54,7 @@ import org.opengis.feature.FeatureType;
  *
  * @see AbstractAssociation
  */
-public class DefaultAssociationRole extends FieldType {
+public class DefaultAssociationRole extends FieldType implements 
FeatureAssociationRole {
     /**
      * For cross-version compatibility.
      */
@@ -131,30 +132,42 @@ public class DefaultAssociationRole exte
      *
      * @return The type of feature values.
      */
+    @Override
     public final FeatureType getValueType() {
         return valueType;
     }
 
     /**
      * Returns the name of the property to use as a title for the associated 
feature, or {@code null} if none.
-     * This method search for the first attribute having a value class 
assignable to {@link CharSequence}.
+     * This method searches for the first attribute having a value class 
assignable to {@link CharSequence}.
+     */
+    static String getTitleProperty(final FeatureAssociationRole role) {
+        if (role instanceof DefaultAssociationRole) {
+            String p = ((DefaultAssociationRole) role).titleProperty; // No 
synchronization - not a big deal if computed twice.
+            if (p != null) {
+                return p.isEmpty() ? null : p;
+            }
+            p = searchTitleProperty(role);
+            ((DefaultAssociationRole) role).titleProperty = (p != null) ? p : 
"";
+            return p;
+        }
+        return searchTitleProperty(role);
+    }
+
+    /**
+     * Implementation of {@link #getTitleProperty(FeatureAssociationRole)} for 
first search,
+     * or for non-SIS {@code FeatureAssociationRole} implementations.
      */
-    final String getTitleProperty() {
-        String p = titleProperty; // No synchronization - not a big deal if 
computed twice.
-        if (p == null) {
-            p = "";
-            for (final PropertyType type : valueType.getProperties(true)) {
-                if (type instanceof AttributeType<?>) {
-                    final AttributeType<?> pt = (AttributeType<?>) type;
-                    if (pt.getMaximumOccurs() != 0 && 
CharSequence.class.isAssignableFrom(pt.getValueClass())) {
-                        p = pt.getName().toString();
-                        break;
-                    }
+    private static String searchTitleProperty(final FeatureAssociationRole 
role) {
+        for (final PropertyType type : 
role.getValueType().getProperties(true)) {
+            if (type instanceof AttributeType<?>) {
+                final AttributeType<?> pt = (AttributeType<?>) type;
+                if (pt.getMaximumOccurs() != 0 && 
CharSequence.class.isAssignableFrom(pt.getValueClass())) {
+                    return pt.getName().toString();
                 }
             }
-            titleProperty = p;
         }
-        return p.isEmpty() ? null : p;
+        return null;
     }
 
     /**

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=1598380&r1=1598379&r2=1598380&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] Thu May 29 19:36:40 2014
@@ -40,6 +40,7 @@ import java.util.Objects;
 import org.opengis.feature.PropertyType;
 import org.opengis.feature.AttributeType;
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -500,12 +501,12 @@ public class DefaultFeatureType extends 
                     return false;
                 }
             }
-            if (base instanceof DefaultAssociationRole) {
-                if (!(other instanceof DefaultAssociationRole)) {
+            if (base instanceof FeatureAssociationRole) {
+                if (!(other instanceof FeatureAssociationRole)) {
                     return false;
                 }
-                final DefaultAssociationRole p0 = (DefaultAssociationRole) 
base;
-                final DefaultAssociationRole p1 = (DefaultAssociationRole) 
other;
+                final FeatureAssociationRole p0 = (FeatureAssociationRole) 
base;
+                final FeatureAssociationRole p1 = (FeatureAssociationRole) 
other;
                 if (p0.getMinimumOccurs() > p1.getMinimumOccurs() ||
                     p0.getMaximumOccurs() < p1.getMaximumOccurs())
                 {

Modified: 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureFormat.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureFormat.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureFormat.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureFormat.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -37,6 +37,7 @@ import org.opengis.feature.IdentifiedTyp
 import org.opengis.feature.PropertyType;
 import org.opengis.feature.AttributeType;
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -222,8 +223,8 @@ header: for (int i=0; ; i++) {
                 valueClass    = pt.getValueClass();
                 valueType     = getFormat(Class.class).format(valueClass, 
buffer, dummyFP).toString();
                 buffer.setLength(0);
-            } else if (propertyType instanceof DefaultAssociationRole) {
-                final DefaultAssociationRole pt = (DefaultAssociationRole) 
propertyType;
+            } else if (propertyType instanceof FeatureAssociationRole) {
+                final FeatureAssociationRole pt = (FeatureAssociationRole) 
propertyType;
                 minimumOccurs = pt.getMinimumOccurs();
                 maximumOccurs = pt.getMaximumOccurs();
                 valueType     = toString(pt.getValueType().getName());
@@ -264,11 +265,15 @@ header: for (int i=0; ; i++) {
                     value = format.format(value, buffer, dummyFP);
                 } else if (value instanceof InternationalString) {
                     value = ((InternationalString) 
value).toString(displayLocale);
-                } else if (value instanceof AbstractFeature && propertyType 
instanceof DefaultAssociationRole) {
-                    value = ((AbstractFeature) value).getPropertyValue(
-                            ((DefaultAssociationRole) 
propertyType).getTitleProperty());
+                } else if (value instanceof AbstractFeature && propertyType 
instanceof FeatureAssociationRole) {
+                    final String p = 
DefaultAssociationRole.getTitleProperty((FeatureAssociationRole) propertyType);
+                    if (p != null) {
+                        value = ((AbstractFeature) value).getPropertyValue(p);
+                    }
+                }
+                if (value != null) {
+                    table.append(value.toString());
                 }
-                table.append(value.toString());
                 buffer.setLength(0);
             }
             table.nextLine();

Modified: 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -23,6 +23,7 @@ import org.apache.sis.util.resources.Err
 
 // Branch-dependent imports
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -63,7 +64,7 @@ final class MultiValuedAssociation exten
      *
      * @param role Information about the association.
      */
-    public MultiValuedAssociation(final DefaultAssociationRole role) {
+    public MultiValuedAssociation(final FeatureAssociationRole role) {
         super(role);
         values = new CheckedArrayList<>(AbstractFeature.class);
     }
@@ -74,7 +75,7 @@ final class MultiValuedAssociation exten
      * @param role   Information about the association.
      * @param values The initial values, or {@code null} for initializing to 
an empty list.
      */
-    MultiValuedAssociation(final DefaultAssociationRole role, final Object 
values) {
+    MultiValuedAssociation(final FeatureAssociationRole role, final Object 
values) {
         super(role);
         if (values == null) {
             this.values = new CheckedArrayList<>(AbstractFeature.class);

Modified: 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -16,8 +16,9 @@
  */
 package org.apache.sis.feature;
 
-// Related to JDK7
+// Branch-dependent imports
 import java.util.Objects;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -55,7 +56,7 @@ final class SingletonAssociation extends
      *
      * @param role Information about the association.
      */
-    public SingletonAssociation(final DefaultAssociationRole role) {
+    public SingletonAssociation(final FeatureAssociationRole role) {
         super(role);
         assert isSingleton(role.getMaximumOccurs());
     }
@@ -66,7 +67,7 @@ final class SingletonAssociation extends
      * @param role  Information about the association.
      * @param value The initial value (may be {@code null}).
      */
-    SingletonAssociation(final DefaultAssociationRole role, final 
AbstractFeature value) {
+    SingletonAssociation(final FeatureAssociationRole role, final 
AbstractFeature value) {
         super(role);
         assert isSingleton(role.getMaximumOccurs());
         this.value = value;

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=1598380&r1=1598379&r2=1598380&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] Thu May 29 19:36:40 2014
@@ -35,6 +35,7 @@ import org.apache.sis.util.resources.Err
 import org.opengis.feature.PropertyType;
 import org.opengis.feature.AttributeType;
 import org.opengis.feature.FeatureType;
+import org.opengis.feature.FeatureAssociationRole;
 
 
 /**
@@ -116,9 +117,9 @@ final class Validator {
             validate((AttributeType<?>) type, asList(value,
                     ((AttributeType<?>) type).getMaximumOccurs()));
         }
-        if (type instanceof DefaultAssociationRole) {
-            validate((DefaultAssociationRole) type, asList(value,
-                    ((DefaultAssociationRole) type).getMaximumOccurs()));
+        if (type instanceof FeatureAssociationRole) {
+            validate((FeatureAssociationRole) type, asList(value,
+                    ((FeatureAssociationRole) type).getMaximumOccurs()));
         }
     }
 
@@ -145,7 +146,7 @@ final class Validator {
     /**
      * Verifies if the given value is valid for the given association role.
      */
-    void validate(final DefaultAssociationRole role, final Collection<?> 
values) {
+    void validate(final FeatureAssociationRole role, final Collection<?> 
values) {
         AbstractElement report = null;
         for (final Object value : values) {
             final FeatureType type = ((AbstractFeature) value).getType();

Modified: 
sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java?rev=1598380&r1=1598379&r2=1598380&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
 [UTF-8] Thu May 29 19:36:40 2014
@@ -52,12 +52,12 @@ public final strictfp class DefaultAssoc
     }
 
     /**
-     * Tests {@link DefaultAssociationRole#getTitleProperty()}.
+     * Tests {@link 
DefaultAssociationRole#getTitleProperty(FeatureAssociationRole)}.
      */
     @Test
     public void testGetTitleProperty() {
         final DefaultAssociationRole twinTown = twinTown();
-        assertEquals("city", twinTown.getTitleProperty());
+        assertEquals("city", 
DefaultAssociationRole.getTitleProperty(twinTown));
     }
 
     /**


Reply via email to