In the JDK, only a couple classes directly implement Iterable: Path,
DirectoryStream, and Collection. DirectoryStream has a note that it doesn't
support calling iterator() more than once, so I guess this is a
possibility. I'll change it back to Collection.

On 6 January 2017 at 22:52, Matt Sicker <boa...@gmail.com> wrote:

> 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/6
>> 1b3ab30
>> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6
>> 1b3ab30
>> >
>> > 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/6
>> 1b3ab30/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/config/plugins/validation/validators/RequiredValidator.java
>> > ----------------------------------------------------------------------
>> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
>> fig/plugins/validation/validators/RequiredValidator.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
>> fig/plugins/validation/validators/RequiredValidator.java
>> > index 5e6cec0..98c0a71 100644
>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
>> fig/plugins/validation/validators/RequiredValidator.java
>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
>> fig/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.Cons
>> traintValidator;
>> > import org.apache.logging.log4j.core.config.plugins.validation.cons
>> traints.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/6
>> 1b3ab30/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/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/uti
>> l/Assert.java
>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>> l/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/6
>> 1b3ab30/log4j-core/src/test/java/org/apache/logging/log4j/co
>> re/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/uti
>> l/AssertTest.java
>> > new file mode 100644
>> > index 0000000..242c41e
>> > --- /dev/null
>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/uti
>> l/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>
>



-- 
Matt Sicker <boa...@gmail.com>

Reply via email to