All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.collections4.multimap.AbstractSetValuedMap Maven / Gradle / Ivy

/*
 * 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.multimap;

import java.util.Collections;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections4.SetUtils;
import org.apache.commons.collections4.SetValuedMap;

/**
 * Abstract implementation of the {@link SetValuedMap} interface to simplify the
 * creation of subclass implementations.
 * 

* Subclasses specify a Map implementation to use as the internal storage and * the Set implementation to use as values. *

* * @param the type of the keys in this map * @param the type of the values in this map * @since 4.1 */ public abstract class AbstractSetValuedMap extends AbstractMultiValuedMap implements SetValuedMap { /** * Constructor needed for subclass serialisation. */ protected AbstractSetValuedMap() { super(); } /** * A constructor that wraps, not copies * * @param map the map to wrap, must not be null * @throws NullPointerException if the map is null */ protected AbstractSetValuedMap(final Map> map) { super(map); } // ----------------------------------------------------------------------- @Override @SuppressWarnings("unchecked") protected Map> getMap() { return (Map>) super.getMap(); } /** * Creates a new value collection using the provided factory. * @return a new list */ @Override protected abstract Set createCollection(); // ----------------------------------------------------------------------- /** * Gets the set of values associated with the specified key. This would * return an empty set in case the mapping is not present * * @param key the key to retrieve * @return the Set of values, will return an empty * Set for no mapping */ @Override public Set get(final K key) { return wrappedCollection(key); } @Override Set wrappedCollection(final K key) { return new WrappedSet(key); } /** * Removes all values associated with the specified key. *

* A subsequent get(Object) would return an empty set. * * @param key the key to remove values from * @return the Set of values removed, will return an empty, * unmodifiable set for no mapping found. */ @Override public Set remove(final Object key) { return SetUtils.emptyIfNull(getMap().remove(key)); } // ----------------------------------------------------------------------- /** * Wrapped set to handle add and remove on the collection returned by * {@code get(Object)}. */ private class WrappedSet extends WrappedCollection implements Set { public WrappedSet(final K key) { super(key); } @Override public boolean equals(final Object other) { final Set set = (Set) getMapping(); if (set == null) { return Collections.emptySet().equals(other); } if (!(other instanceof Set)) { return false; } final Set otherSet = (Set) other; return SetUtils.isEqualSet(set, otherSet); } @Override public int hashCode() { final Set set = (Set) getMapping(); return SetUtils.hashCodeForSet(set); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy