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 <[email protected]>
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;
+ }
+ };
}
}