You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2015/11/15 11:06:17 UTC
svn commit: r1714424 - in
/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4:
./ collection/ multiset/
Author: tn
Date: Sun Nov 15 10:06:16 2015
New Revision: 1714424
URL: http://svn.apache.org/viewvc?rev=1714424&view=rev
Log:
[COLLECTIONS-567] Add MultiSetUtils, fix typos, remove references to bag.
Added:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java (with props)
Modified:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSet.java
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/collection/PredicatedCollection.java
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/HashMultiSet.java
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSet.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSet.java?rev=1714424&r1=1714423&r2=1714424&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSet.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSet.java Sun Nov 15 10:06:16 2015
@@ -123,8 +123,8 @@ public interface MultiSet<E> extends Col
* <p>
* The returned set is backed by this multiset, so any change to either
* is immediately reflected in the other. Only removal operations are
- * supporting, in which case all occurrences of the removed elements
- * are removed from the backing multiset.
+ * supported, in which case all occurrences of the element are removed
+ * from the backing multiset.
*
* @return the Set of unique MultiSet elements
*/
Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java?rev=1714424&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java (added)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java Sun Nov 15 10:06:16 2015
@@ -0,0 +1,119 @@
+/*
+ * 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;
+
+import org.apache.commons.collections4.multiset.HashMultiSet;
+import org.apache.commons.collections4.multiset.PredicatedMultiSet;
+import org.apache.commons.collections4.multiset.SynchronizedMultiSet;
+import org.apache.commons.collections4.multiset.UnmodifiableMultiSet;
+
+/**
+ * Provides utility methods and decorators for {@link MultiSet} instances.
+ *
+ * @since 4.1
+ * @version $Id$
+ */
+public class MultiSetUtils {
+
+ /**
+ * An empty unmodifiable multiset.
+ */
+ @SuppressWarnings("rawtypes") // OK, empty multiset is compatible with any type
+ public static final MultiSet EMPTY_MULTISET =
+ UnmodifiableMultiSet.unmodifiableMultiSet(new HashMultiSet<Object>());
+
+ /**
+ * Instantiation of MultiSetUtils is not intended or required.
+ */
+ private MultiSetUtils() {}
+
+ //-----------------------------------------------------------------------
+ /**
+ * Returns a synchronized (thread-safe) multiset backed by the given multiset.
+ * In order to guarantee serial access, it is critical that all access to the
+ * backing multiset is accomplished through the returned multiset.
+ * <p>
+ * It is imperative that the user manually synchronize on the returned multiset
+ * when iterating over it:
+ *
+ * <pre>
+ * MultiSet multiset = MultiSetUtils.synchronizedMultiSet(new HashMultiSet());
+ * ...
+ * synchronized(multiset) {
+ * Iterator i = multiset.iterator(); // Must be in synchronized block
+ * while (i.hasNext())
+ * foo(i.next());
+ * }
+ * }
+ * </pre>
+ *
+ * Failure to follow this advice may result in non-deterministic behavior.
+ *
+ * @param <E> the element type
+ * @param multiset the multiset to synchronize, must not be null
+ * @return a synchronized multiset backed by that multiset
+ * @throws NullPointerException if the MultiSet is null
+ */
+ public static <E> MultiSet<E> synchronizedMultiSet(final MultiSet<E> multiset) {
+ return SynchronizedMultiSet.synchronizedMultiSet(multiset);
+ }
+
+ /**
+ * Returns an unmodifiable view of the given multiset. Any modification attempts
+ * to the returned multiset will raise an {@link UnsupportedOperationException}.
+ *
+ * @param <E> the element type
+ * @param multiset the multiset whose unmodifiable view is to be returned, must not be null
+ * @return an unmodifiable view of that multiset
+ * @throws NullPointerException if the MultiSet is null
+ */
+ public static <E> MultiSet<E> unmodifiableMultiSet(final MultiSet<? extends E> multiset) {
+ return UnmodifiableMultiSet.unmodifiableMultiSet(multiset);
+ }
+
+ /**
+ * Returns a predicated (validating) multiset backed by the given multiset.
+ * <p>
+ * Only objects that pass the test in the given predicate can be added to
+ * the multiset. Trying to add an invalid object results in an
+ * IllegalArgumentException. It is important not to use the original multiset
+ * after invoking this method, as it is a backdoor for adding invalid
+ * objects.
+ *
+ * @param <E> the element type
+ * @param multiset the multiset to predicate, must not be null
+ * @param predicate the predicate for the multiset, must not be null
+ * @return a predicated multiset backed by the given multiset
+ * @throws NullPointerException if the MultiSet or Predicate is null
+ */
+ public static <E> MultiSet<E> predicatedMultiSet(final MultiSet<E> multiset,
+ final Predicate<? super E> predicate) {
+ return PredicatedMultiSet.predicatedMultiSet(multiset, predicate);
+ }
+
+ /**
+ * Get an empty <code>MultiSet</code>.
+ *
+ * @param <E> the element type
+ * @return an empty MultiSet
+ */
+ @SuppressWarnings("unchecked") // OK, empty multiset is compatible with any type
+ public static <E> MultiSet<E> emptyMultiSet() {
+ return EMPTY_MULTISET;
+ }
+
+}
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MultiSetUtils.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/collection/PredicatedCollection.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/collection/PredicatedCollection.java?rev=1714424&r1=1714423&r2=1714424&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/collection/PredicatedCollection.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/collection/PredicatedCollection.java Sun Nov 15 10:06:16 2015
@@ -26,11 +26,14 @@ import java.util.Queue;
import java.util.Set;
import org.apache.commons.collections4.Bag;
+import org.apache.commons.collections4.MultiSet;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.bag.HashBag;
import org.apache.commons.collections4.bag.PredicatedBag;
import org.apache.commons.collections4.functors.NotNullPredicate;
import org.apache.commons.collections4.list.PredicatedList;
+import org.apache.commons.collections4.multiset.HashMultiSet;
+import org.apache.commons.collections4.multiset.PredicatedMultiSet;
import org.apache.commons.collections4.queue.PredicatedQueue;
import org.apache.commons.collections4.set.PredicatedSet;
@@ -328,6 +331,40 @@ public class PredicatedCollection<E> ext
}
/**
+ * Create a new predicated multiset filled with the accepted elements.
+ * <p>
+ * The builder is not modified by this method, so it is possible to create more collections
+ * or add more elements afterwards. Further changes will not propagate to the returned multiset.
+ *
+ * @return a new predicated multiset.
+ */
+ public MultiSet<E> createPredicatedMultiSet() {
+ return createPredicatedMultiSet(new HashMultiSet<E>());
+ }
+
+ /**
+ * Decorates the given multiset with validating behavior using the predicate. All accepted elements
+ * are appended to the multiset. If the multiset already contains elements, they are validated.
+ * <p>
+ * The builder is not modified by this method, so it is possible to create more collections
+ * or add more elements afterwards. Further changes will not propagate to the returned multiset.
+ *
+ * @param bag the multiset to decorate, must not be null
+ * @return the decorated multiset.
+ * @throws NullPointerException if multiset is null
+ * @throws IllegalArgumentException if multiset contains invalid elements
+ */
+ public MultiSet<E> createPredicatedMultiSet(final MultiSet<E> multiset) {
+ if (multiset == null) {
+ throw new NullPointerException("MultiSet must not be null.");
+ }
+ final PredicatedMultiSet<E> predicatedMultiSet =
+ PredicatedMultiSet.predicatedMultiSet(multiset, predicate);
+ predicatedMultiSet.addAll(accepted);
+ return predicatedMultiSet;
+ }
+
+ /**
* Create a new predicated bag filled with the accepted elements.
* <p>
* The builder is not modified by this method, so it is possible to create more collections
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java?rev=1714424&r1=1714423&r2=1714424&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java Sun Nov 15 10:06:16 2015
@@ -555,9 +555,9 @@ public abstract class AbstractMapMultiSe
private final AbstractMapMultiSet<E> parent;
/**
- * Constructs a new view of the BidiMap.
+ * Constructs a new view of the MultiSet.
*
- * @param parent the parent BidiMap
+ * @param parent the parent MultiSet
*/
protected EntrySet(final AbstractMapMultiSet<E> parent) {
this.parent = parent;
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/HashMultiSet.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/HashMultiSet.java?rev=1714424&r1=1714423&r2=1714424&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/HashMultiSet.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/HashMultiSet.java Sun Nov 15 10:06:16 2015
@@ -47,9 +47,9 @@ public class HashMultiSet<E> extends Abs
}
/**
- * Constructs a bag containing all the members of the given collection.
+ * Constructs a multiset containing all the members of the given collection.
*
- * @param coll a collection to copy into this bag
+ * @param coll a collection to copy into this multiset
*/
public HashMultiSet(final Collection<? extends E> coll) {
this();
@@ -58,7 +58,7 @@ public class HashMultiSet<E> extends Abs
//-----------------------------------------------------------------------
/**
- * Write the bag out using a custom routine.
+ * Write the multiset out using a custom routine.
*/
private void writeObject(final ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
@@ -66,7 +66,7 @@ public class HashMultiSet<E> extends Abs
}
/**
- * Read the bag in using a custom routine.
+ * Read the multiset in using a custom routine.
*/
private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
Modified: 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=1714424&r1=1714423&r2=1714424&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multiset/SynchronizedMultiSet.java Sun Nov 15 10:06:16 2015
@@ -44,7 +44,7 @@ public class SynchronizedMultiSet<E> ext
* @return a new synchronized MultiSet
* @throws NullPointerException if multiset is null
*/
- public static <E> SynchronizedMultiSet<E> synchronizedBag(final MultiSet<E> multiset) {
+ public static <E> SynchronizedMultiSet<E> synchronizedMultiSet(final MultiSet<E> multiset) {
return new SynchronizedMultiSet<E>(multiset);
}