commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From t.@apache.org
Subject svn commit: r1688308 - in /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset: PredicatedMultiSet.java SynchronizedMultiSet.java package-info.java
Date Mon, 29 Jun 2015 21:28:55 GMT
Author: tn
Date: Mon Jun 29 21:28:54 2015
New Revision: 1688308

URL: http://svn.apache.org/r1688308
Log:
[COLLECTIONS-567] Add Predicated and Synchronized decorators.

Added:
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
  (with props)
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
  (with props)
Modified:
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/package-info.java

Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java?rev=1688308&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
(added)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
Mon Jun 29 21:28:54 2015
@@ -0,0 +1,137 @@
+/*
+ * 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.commons.collections4.multiset;
+
+import java.util.Set;
+
+import org.apache.commons.collections4.MultiSet;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.collection.PredicatedCollection;
+
+/**
+ * Decorates another {@link MultiSet} to validate that additions
+ * match a specified predicate.
+ * <p>
+ * This multiset exists to provide validation for the decorated multiset.
+ * It is normally created to decorate an empty multiset.
+ * If an object cannot be added to the multiset, an {@link IllegalArgumentException}
+ * is thrown.
+ * <p>
+ * One usage would be to ensure that no null entries are added to the multiset.
+ * <pre>
+ * MultiSet&lt;E&gt; set =
+ *      PredicatedMultiSet.predicatedMultiSet(new HashMultiSet&lt;E&gt;(),
+ *                                            NotNullPredicate.notNullPredicate());
+ * </pre>
+ *
+ * @since 4.1
+ * @version $Id$
+ */
+public class PredicatedMultiSet<E> extends PredicatedCollection<E> implements
MultiSet<E> {
+
+    /** Serialization version */
+    private static final long serialVersionUID = 20150629L;
+
+    /**
+     * Factory method to create a predicated (validating) multiset.
+     * <p>
+     * If there are any elements already in the multiset being decorated, they
+     * are validated.
+     *
+     * @param <E> the type of the elements in the multiset
+     * @param multiset  the multiset to decorate, must not be null
+     * @param predicate  the predicate to use for validation, must not be null
+     * @return a new predicated MultiSet
+     * @throws NullPointerException if multiset or predicate is null
+     * @throws IllegalArgumentException if the multiset contains invalid elements
+     */
+    public static <E> PredicatedMultiSet<E> predicatedMultiSet(final MultiSet<E>
multiset,
+                                                               final Predicate<? super
E> predicate) {
+        return new PredicatedMultiSet<E>(multiset, predicate);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Constructor that wraps (not copies).
+     * <p>
+     * If there are any elements already in the multiset being decorated, they
+     * are validated.
+     *
+     * @param multiset  the multiset to decorate, must not be null
+     * @param predicate  the predicate to use for validation, must not be null
+     * @throws NullPointerException if multiset or predicate is null
+     * @throws IllegalArgumentException if the multiset contains invalid elements
+     */
+    protected PredicatedMultiSet(final MultiSet<E> multiset, final Predicate<? super
E> predicate) {
+        super(multiset, predicate);
+    }
+
+    /**
+     * Gets the decorated multiset.
+     *
+     * @return the decorated multiset
+     */
+    @Override
+    protected MultiSet<E> decorated() {
+        return (MultiSet<E>) super.decorated();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object == this || decorated().equals(object);
+    }
+
+    @Override
+    public int hashCode() {
+        return decorated().hashCode();
+    }
+
+    //-----------------------------------------------------------------------
+
+    @Override
+    public int add(final E object, final int count) {
+        validate(object);
+        return decorated().add(object, count);
+    }
+
+    @Override
+    public int remove(final Object object, final int count) {
+        return decorated().remove(object, count);
+    }
+
+    @Override
+    public int getCount(final Object object) {
+        return decorated().getCount(object);
+    }
+
+    @Override
+    public int setCount(E object, int count) {
+        validate(object);
+        return decorated().setCount(object, count);
+    }
+
+    @Override
+    public Set<E> uniqueSet() {
+        return decorated().uniqueSet();
+    }
+
+    @Override
+    public Set<MultiSet.Entry<E>> entrySet() {
+        return decorated().entrySet();
+    }
+
+}

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision HeadURL

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/PredicatedMultiSet.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java?rev=1688308&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
(added)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
Mon Jun 29 21:28:54 2015
@@ -0,0 +1,164 @@
+/*
+ * 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.commons.collections4.multiset;
+
+import java.util.Set;
+
+import org.apache.commons.collections4.MultiSet;
+import org.apache.commons.collections4.collection.SynchronizedCollection;
+
+/**
+ * Decorates another {@link MultiSet} to synchronize its behaviour
+ * for a multi-threaded environment.
+ * <p>
+ * Methods are synchronized, then forwarded to the decorated multiset.
+ * Iterators must be separately synchronized around the loop.
+ *
+ * @since 4.1
+ * @version $Id$
+ */
+public class SynchronizedMultiSet<E> extends SynchronizedCollection<E> implements
MultiSet<E> {
+
+    /** Serialization version */
+    private static final long serialVersionUID = 20150629L;
+
+    /**
+     * Factory method to create a synchronized multiset.
+     *
+     * @param <E> the type of the elements in the multiset
+     * @param multiset  the multiset to decorate, must not be null
+     * @return a new synchronized MultiSet
+     * @throws NullPointerException if multiset is null
+     */
+    public static <E> SynchronizedMultiSet<E> synchronizedBag(final MultiSet<E>
multiset) {
+        return new SynchronizedMultiSet<E>(multiset);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Constructor that wraps (not copies).
+     *
+     * @param multiset  the multiset to decorate, must not be null
+     * @throws NullPointerException if multiset is null
+     */
+    protected SynchronizedMultiSet(final MultiSet<E> multiset) {
+        super(multiset);
+    }
+
+    /**
+     * Constructor that wraps (not copies).
+     *
+     * @param multiset  the multiset to decorate, must not be null
+     * @param lock  the lock to use, must not be null
+     * @throws NullPointerException if multiset or lock is null
+     */
+    protected SynchronizedMultiSet(final MultiSet<E> multiset, final Object lock) {
+        super(multiset, lock);
+    }
+
+    /**
+     * Gets the multiset being decorated.
+     *
+     * @return the decorated multiset
+     */
+    @Override
+    protected MultiSet<E> decorated() {
+        return (MultiSet<E>) super.decorated();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        if (object == this) {
+            return true;
+        }
+        synchronized (lock) {
+            return decorated().equals(object);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        synchronized (lock) {
+            return decorated().hashCode();
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    @Override
+    public int add(final E object, final int count) {
+        synchronized (lock) {
+            return decorated().add(object, count);
+        }
+    }
+
+    @Override
+    public int remove(final Object object, final int count) {
+        synchronized (lock) {
+            return decorated().remove(object, count);
+        }
+    }
+
+    @Override
+    public int getCount(final Object object) {
+        synchronized (lock) {
+            return decorated().getCount(object);
+        }
+    }
+
+    @Override
+    public int setCount(E object, int count) {
+        synchronized (lock) {
+            return decorated().setCount(object, count);
+        }
+    }
+
+    @Override
+    public Set<E> uniqueSet() {
+        synchronized (lock) {
+            final Set<E> set = decorated().uniqueSet();
+            return new SynchronizedSet<E>(set, lock);
+        }
+    }
+
+    @Override
+    public Set<Entry<E>> entrySet() {
+        synchronized (lock) {
+            final Set<MultiSet.Entry<E>> set = decorated().entrySet();
+            return new SynchronizedSet<MultiSet.Entry<E>>(set, lock);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Synchronized Set for the MultiSet class.
+     */
+    static class SynchronizedSet<T> extends SynchronizedCollection<T> implements
Set<T> {
+        /** Serialization version */
+        private static final long serialVersionUID = 20150629L;
+
+        /**
+         * Constructor.
+         * @param set  the set to decorate
+         * @param lock  the lock to use, shared with the multiset
+         */
+        SynchronizedSet(final Set<T> set, final Object lock) {
+            super(set, lock);
+        }
+    }
+
+}

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision HeadURL

Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/package-info.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/package-info.java?rev=1688308&r1=1688307&r2=1688308&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/package-info.java
(original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/package-info.java
Mon Jun 29 21:28:54 2015
@@ -28,10 +28,9 @@
  * <p>
  * The following decorators are provided in the package:
  * <ul>
+ *   <li>Predicated   - ensures that only elements that are valid according to a predicate
can be added
  *   <li>Synchronized - synchronizes method access for multi-threaded environments
  *   <li>Unmodifiable - ensures the multiset cannot be altered
- *   <li>Predicated - ensures that only elements that are valid according to a predicate
can be added
- *   <li>Transformed - transforms each element added to the multiset
  * </ul>
  *
  * @version $Id$



Mime
View raw message