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; + } + }; } }