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

lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git


The following commit(s) were added to refs/heads/master by this push:
     new e8abc36  [SSHD-1043] Fixed semantics of Property#getOrNull and 
getOrCustomDefault
e8abc36 is described below

commit e8abc36627fc44b336ef65480b618fc07701d96e
Author: Lyor Goldstein <lgoldst...@apache.org>
AuthorDate: Sun Jul 26 23:13:14 2020 +0300

    [SSHD-1043] Fixed semantics of Property#getOrNull and getOrCustomDefault
---
 .../main/java/org/apache/sshd/common/Property.java | 28 ++++++++-
 .../java/org/apache/sshd/common/PropertyTest.java  | 73 ++++++++++++++++++----
 2 files changed, 85 insertions(+), 16 deletions(-)

diff --git a/sshd-common/src/main/java/org/apache/sshd/common/Property.java 
b/sshd-common/src/main/java/org/apache/sshd/common/Property.java
index 2fe963a..a1d92c0 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/Property.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/Property.java
@@ -150,6 +150,12 @@ public interface Property<T> {
         }
 
         @Override
+        public T getOrCustomDefault(PropertyResolver resolver, T defaultValue) 
{
+            Object propValue = 
PropertyResolverUtils.resolvePropertyValue(resolver, getName());
+            return (propValue != null) ? fromStorage(propValue) : defaultValue;
+        }
+
+        @Override
         public void set(PropertyResolver resolver, T value) {
             PropertyResolverUtils.updateProperty(resolver, getName(), 
toStorage(value));
         }
@@ -358,6 +364,13 @@ public interface Property<T> {
         }
 
         @Override
+        public T getOrCustomDefault(PropertyResolver resolver, T defaultValue) 
{
+            T value = delegate.getOrCustomDefault(resolver, defaultValue);
+            validator.accept(value);
+            return value;
+        }
+
+        @Override
         public void set(PropertyResolver resolver, T value) {
             validator.accept(value);
             delegate.set(resolver, value);
@@ -385,13 +398,22 @@ public interface Property<T> {
         return get(resolver).get();
     }
 
+    /**
+     * @param  resolver The {@link PropertyResolver} to query for the property 
value.
+     * @return          The resolver's value or {@code null} if no specific 
value found in the resolver - regardless of
+     *                  whether there is a default value
+     */
     default T getOrNull(PropertyResolver resolver) {
         return getOrCustomDefault(resolver, null);
     }
 
-    default T getOrCustomDefault(PropertyResolver resolver, T defaultValue) {
-        return get(resolver).orElse(defaultValue);
-    }
+    /**
+     * @param  resolver     The {@link PropertyResolver} to query for the 
property value.
+     * @param  defaultValue The default value to return if no specific value 
found in resolver
+     * @return              The resolver's value or specified default if no 
specific value found in the resolver -
+     *                      regardless of whether there is a default value
+     */
+    T getOrCustomDefault(PropertyResolver resolver, T defaultValue);
 
     void set(PropertyResolver resolver, T value);
 
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/PropertyTest.java 
b/sshd-common/src/test/java/org/apache/sshd/common/PropertyTest.java
index 3a67f76..094bdbf 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/PropertyTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/PropertyTest.java
@@ -21,7 +21,9 @@ package org.apache.sshd.common;
 
 import java.lang.reflect.Constructor;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
+import java.util.Map;
 import java.util.Optional;
 
 import org.apache.sshd.util.test.JUnit4ClassRunnerWithParametersFactory;
@@ -90,29 +92,74 @@ public class PropertyTest<T> extends JUnitTestSupport {
     }
 
     @Test
-    public void testGetOrNull() {
-        T actual = prop.getOrNull(null);
-        assertSame(defaultValue, actual);
+    public void testGetOrNullIfNoValueResolved() {
+        T actual = prop.getOrNull(PropertyResolver.EMPTY);
+        assertNull(actual);
     }
 
     @Test
-    public void testGetOrCustomDefault() {
-        Object customValue;
+    public void testGetOrNullIfNoValueExists() {
+        T expected = getNonDefaultValue();
+        T actual = prop.getOrNull(asPropertyResolver(expected));
+        assertSame(expected, actual);
+    }
+
+    @Test
+    public void testGetOrCustomDefaultIfNoValueResolved() {
+        T expected = getCustomValue();
+        T actual = prop.getOrCustomDefault(PropertyResolver.EMPTY, expected);
+        assertSame(expected, actual);
+    }
+
+    @Test
+    public void testGetOrCustomDefaultIfValueExists() {
+        T expected = getNonDefaultValue();
+        T actual = prop.getOrCustomDefault(asPropertyResolver(expected), 
getCustomValue());
+        assertSame(expected, actual);
+    }
+
+    private T getCustomValue() {
+        if (propType == Integer.class) {
+            return propType.cast(33);
+        } else if (propType == Long.class) {
+            return propType.cast(33L);
+        } else if (propType == String.class) {
+            return propType.cast(getCurrentTestName());
+        } else if (propType == Boolean.class) {
+            return propType.cast(false);
+        } else {
+            throw new UnsupportedOperationException("Unsupported property 
type: " + propType.getSimpleName());
+        }
+    }
+
+    private T getNonDefaultValue() {
         if (propType == Integer.class) {
-            customValue = 33;
+            return propType.cast(44);
         } else if (propType == Long.class) {
-            customValue = 33L;
+            return propType.cast(44L);
         } else if (propType == String.class) {
-            customValue = getCurrentTestName();
+            return propType.cast(getClass().getSimpleName());
         } else if (propType == Boolean.class) {
-            customValue = false;
+            return propType.cast(false);
         } else {
             throw new UnsupportedOperationException("Unsupported property 
type: " + propType.getSimpleName());
         }
+    }
 
-        T customDefault = propType.cast(customValue);
-        T expected = (defaultValue == null) ? customDefault : defaultValue;
-        T actual = prop.getOrCustomDefault(null, customDefault);
-        assertSame(expected, actual);
+    private PropertyResolver asPropertyResolver(Object value) {
+        return new PropertyResolver() {
+            @SuppressWarnings("synthetic-access")
+            private final Map<String, Object> props = 
Collections.singletonMap(prop.getName(), value);
+
+            @Override
+            public Map<String, Object> getProperties() {
+                return props;
+            }
+
+            @Override
+            public PropertyResolver getParentPropertyResolver() {
+                return null;
+            }
+        };
     }
 }

Reply via email to