Map doesn't implement collection. And the Iterator::hasNext is called on a new Iterator obtained from the Iterable. It was implemented as a Collection before, but I had a thought and implemented it as such. The javadocs for Iterable don't exactly state whether or not the Iterator is a singleton, but that would probably break something if used like that anyways.
On 6 January 2017 at 22:37, Remko Popma <remko.po...@gmail.com> wrote: > Instead of Map::isEmpty, we could do Collection::isEmpty. Also is it a > good idea to call Iterator::hasNext? In some implementations calling this > method moves the cursor one position forward. Do we actually need to check > that an Iterator is empty anywhere? > > Sent from my iPhone > > > On Jan 7, 2017, at 12:51, mattsic...@apache.org wrote: > > > > Repository: logging-log4j2 > > Updated Branches: > > refs/heads/master b0daba63f -> 61b3ab301 > > > > > > Extract isEmpty() logic from RequiredValidator > > > > > > Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > > Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ > commit/61b3ab30 > > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ > 61b3ab30 > > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ > 61b3ab30 > > > > Branch: refs/heads/master > > Commit: 61b3ab301a4d54c28e736ca3a37f984475969377 > > Parents: b0daba6 > > Author: Matt Sicker <matt.sic...@spr.com> > > Authored: Fri Jan 6 21:50:49 2017 -0600 > > Committer: Matt Sicker <matt.sic...@spr.com> > > Committed: Fri Jan 6 21:50:49 2017 -0600 > > > > ---------------------------------------------------------------------- > > .../validators/RequiredValidator.java | 24 +------ > > .../apache/logging/log4j/core/util/Assert.java | 46 +++++++++++++ > > .../logging/log4j/core/util/AssertTest.java | 68 > ++++++++++++++++++++ > > 3 files changed, 116 insertions(+), 22 deletions(-) > > ---------------------------------------------------------------------- > > > > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 61b3ab30/log4j-core/src/main/java/org/apache/logging/log4j/ > core/config/plugins/validation/validators/RequiredValidator.java > > ---------------------------------------------------------------------- > > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > config/plugins/validation/validators/RequiredValidator.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > config/plugins/validation/validators/RequiredValidator.java > > index 5e6cec0..98c0a71 100644 > > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > config/plugins/validation/validators/RequiredValidator.java > > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > config/plugins/validation/validators/RequiredValidator.java > > @@ -22,6 +22,7 @@ import java.util.Map; > > import org.apache.logging.log4j.Logger; > > import org.apache.logging.log4j.core.config.plugins.validation. > ConstraintValidator; > > import org.apache.logging.log4j.core.config.plugins.validation. > constraints.Required; > > +import org.apache.logging.log4j.core.util.Assert; > > import org.apache.logging.log4j.status.StatusLogger; > > > > /** > > @@ -49,28 +50,7 @@ public class RequiredValidator implements > ConstraintValidator<Required> { > > > > @Override > > public boolean isValid(final String name, final Object value) { > > - if (value == null) { > > - return err(name); > > - } > > - if (value instanceof CharSequence) { > > - final CharSequence sequence = (CharSequence) value; > > - return sequence.length() != 0 || err(name); > > - } > > - final Class<?> clazz = value.getClass(); > > - if (clazz.isArray()) { > > - final Object[] array = (Object[]) value; > > - return array.length != 0 || err(name); > > - } > > - if (Collection.class.isAssignableFrom(clazz)) { > > - final Collection<?> collection = (Collection<?>) value; > > - return collection.size() != 0 || err(name); > > - } > > - if (Map.class.isAssignableFrom(clazz)) { > > - final Map<?, ?> map = (Map<?, ?>) value; > > - return map.size() != 0 || err(name); > > - } > > - // LOGGER.debug("Encountered type [{}] which can only be > checked for null.", clazz.getName()); > > - return true; > > + return Assert.isNonEmpty(value) || err(name); > > } > > > > private boolean err(final String name) { > > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 61b3ab30/log4j-core/src/main/java/org/apache/logging/log4j/ > core/util/Assert.java > > ---------------------------------------------------------------------- > > diff --git > > a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java > > index e37090f..d46c06a 100644 > > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > util/Assert.java > > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > util/Assert.java > > @@ -16,6 +16,8 @@ > > */ > > package org.apache.logging.log4j.core.util; > > > > +import java.util.Map; > > + > > /** > > * Utility class providing common validation logic. > > */ > > @@ -23,6 +25,50 @@ public final class Assert { > > private Assert() { > > } > > > > + /** > > + * Checks if an object has empty semantics. The following scenarios > are considered empty: > > + * <ul> > > + * <li>{@code null}</li> > > + * <li>empty {@link CharSequence}</li> > > + * <li>empty array</li> > > + * <li>empty {@link Iterable}</li> > > + * <li>empty {@link Map}</li> > > + * </ul> > > + * > > + * @param o value to check for emptiness > > + * @return true if the value is empty, false otherwise > > + * @since 2.8 > > + */ > > + public static boolean isEmpty(final Object o) { > > + if (o == null) { > > + return true; > > + } > > + if (o instanceof CharSequence) { > > + return ((CharSequence) o).length() == 0; > > + } > > + if (o.getClass().isArray()) { > > + return ((Object[]) o).length == 0; > > + } > > + if (o instanceof Iterable) { > > + return !((Iterable<?>) o).iterator().hasNext(); > > + } > > + if (o instanceof Map) { > > + return ((Map<?, ?>) o).isEmpty(); > > + } > > + return false; > > + } > > + > > + /** > > + * Opposite of {@link #isEmpty(Object)}. > > + * > > + * @param o value to check for non-emptiness > > + * @return true if the value is non-empty, false otherwise > > + * @since 2.8 > > + */ > > + public static boolean isNonEmpty(final Object o) { > > + return !isEmpty(o); > > + } > > + > > public static int valueIsAtLeast(final int value, final int > minValue) { > > if (value < minValue) { > > throw new IllegalArgumentException("Value should be at > least " + minValue + " but was " + value); > > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 61b3ab30/log4j-core/src/test/java/org/apache/logging/log4j/ > core/util/AssertTest.java > > ---------------------------------------------------------------------- > > diff --git > > a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > util/AssertTest.java > > new file mode 100644 > > index 0000000..242c41e > > --- /dev/null > > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > util/AssertTest.java > > @@ -0,0 +1,68 @@ > > +/* > > + * Licensed to the Apache Software Foundation (ASF) under one or more > > + * contributor license agreements. See the NOTICE file distributed with > > + * this work for additional information regarding copyright ownership. > > + * The ASF licenses this file to You under the Apache license, Version > 2.0 > > + * (the "License"); you may not use this file except in compliance with > > + * the License. You may obtain a copy of the License at > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the license for the specific language governing permissions and > > + * limitations under the license. > > + */ > > +package org.apache.logging.log4j.core.util; > > + > > +import java.util.ArrayList; > > +import java.util.Collections; > > +import java.util.HashMap; > > + > > +import org.junit.Test; > > +import org.junit.runner.RunWith; > > +import org.junit.runners.Parameterized; > > + > > +import static org.junit.Assert.*; > > + > > +/** > > + * > > + */ > > +@RunWith(Parameterized.class) > > +public class AssertTest { > > + > > + private final Object value; > > + private final boolean isEmpty; > > + > > + @Parameterized.Parameters > > + public static Object[][] data() { > > + return new Object[][]{ > > + // value, isEmpty > > + {null, true}, > > + {"", true}, > > + {new Object[0], true}, > > + {new ArrayList<>(), true}, > > + {new HashMap<>(), true}, > > + {0, false}, > > + {1, false}, > > + {false, false}, > > + {true, false}, > > + {new Object[]{null}, false}, > > + {Collections.singletonList(null), false}, > > + {Collections.singletonMap("", null), false}, > > + {"null", false} > > + }; > > + } > > + > > + public AssertTest(final Object value, final boolean isEmpty) { > > + this.value = value; > > + this.isEmpty = isEmpty; > > + } > > + > > + @Test > > + public void isEmpty() throws Exception { > > + assertEquals(isEmpty, Assert.isEmpty(value)); > > + } > > + > > +} > > \ No newline at end of file > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org > For additional commands, e-mail: log4j-dev-h...@logging.apache.org > > -- Matt Sicker <boa...@gmail.com>