/*
 * Copyright (c) 2019 Shotaro Sano and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v. 1.0 which accompany this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 */

package org.eclipse.collections.impl.multimap.set;

import java.io.Serializable;

import org.eclipse.collections.api.block.function.Function;
import org.eclipse.collections.api.block.function.Function2;
import org.eclipse.collections.api.block.predicate.Predicate2;
import org.eclipse.collections.api.multimap.bag.MutableBagMultimap;
import org.eclipse.collections.api.multimap.set.ImmutableSetMultimap;
import org.eclipse.collections.api.multimap.set.MutableSetMultimap;
import org.eclipse.collections.api.set.MutableSet;
import org.eclipse.collections.api.tuple.Pair;
import org.eclipse.collections.impl.multimap.AbstractSynchronizedMultimap;

public class SynchronizedSetMultimap<K, V>
        extends AbstractSynchronizedMultimap<K, V>
        implements MutableSetMultimap<K, V>, Serializable
{
    private static final long serialVersionUID = 1L;

    public SynchronizedSetMultimap(MutableSetMultimap<K, V> multimap)
    {
        super(multimap);
    }

    public SynchronizedSetMultimap(MutableSetMultimap<K, V> multimap, Object newLock)
    {
        super(multimap, newLock);
    }

    
This method will take a Multimap and wrap it directly in a SynchronizedSetMultimap.
/** * This method will take a Multimap and wrap it directly in a SynchronizedSetMultimap. */
public static <K, V> SynchronizedSetMultimap<K, V> of(MutableSetMultimap<K, V> multimap) { if (multimap == null) { throw new IllegalArgumentException("cannot create a SynchronizedSetMultimap for null"); } return new SynchronizedSetMultimap<>(multimap); }
This method will take a Multimap and wrap it directly in a SynchronizedSetMultimap. Additionally, a developer specifies which lock to use with the collection.
/** * This method will take a Multimap and wrap it directly in a SynchronizedSetMultimap. * Additionally, a developer specifies which lock to use with the collection. */
public static <K, V> SynchronizedSetMultimap<K, V> of(MutableSetMultimap<K, V> multimap, Object lock) { if (multimap == null) { throw new IllegalArgumentException("cannot create a SynchronizedSetMultimap for null"); } return new SynchronizedSetMultimap<>(multimap, lock); } @Override public MutableSet<V> replaceValues(K key, Iterable<? extends V> values) { synchronized (this.getLock()) { return this.getDelegate().replaceValues(key, values); } } @Override public MutableSet<V> removeAll(Object key) { synchronized (this.getLock()) { return this.getDelegate().removeAll(key); } } @Override public MutableSetMultimap<K, V> newEmpty() { synchronized (this.getLock()) { return this.getDelegate().newEmpty().asSynchronized(); } } @Override public MutableSet<V> get(K key) { synchronized (this.getLock()) { return this.getDelegate().get(key); } } @Override public MutableSet<V> getIfAbsentPutAll(K key, Iterable<? extends V> values) { synchronized (this.getLock()) { return this.getDelegate().getIfAbsentPutAll(key, values); } } @Override public MutableSetMultimap<K, V> toMutable() { synchronized (this.getLock()) { return this.getDelegate().toMutable(); } } @Override public ImmutableSetMultimap<K, V> toImmutable() { synchronized (this.getLock()) { return this.getDelegate().toImmutable(); } } @Override public MutableSetMultimap<V, K> flip() { synchronized (this.getLock()) { return this.getDelegate().flip(); } } @Override public MutableSetMultimap<K, V> selectKeysValues(Predicate2<? super K, ? super V> predicate) { synchronized (this.getLock()) { return this.getDelegate().selectKeysValues(predicate); } } @Override public MutableSetMultimap<K, V> rejectKeysValues(Predicate2<? super K, ? super V> predicate) { synchronized (this.getLock()) { return this.getDelegate().rejectKeysValues(predicate); } } @Override public MutableSetMultimap<K, V> selectKeysMultiValues(Predicate2<? super K, ? super Iterable<V>> predicate) { synchronized (this.getLock()) { return this.getDelegate().selectKeysMultiValues(predicate); } } @Override public MutableSetMultimap<K, V> rejectKeysMultiValues(Predicate2<? super K, ? super Iterable<V>> predicate) { synchronized (this.getLock()) { return this.getDelegate().rejectKeysMultiValues(predicate); } } @Override public <K2, V2> MutableBagMultimap<K2, V2> collectKeysValues(Function2<? super K, ? super V, Pair<K2, V2>> function) { synchronized (this.getLock()) { return this.getDelegate().collectKeysValues(function); } } @Override public <K2, V2> MutableBagMultimap<K2, V2> collectKeyMultiValues(Function<? super K, ? extends K2> keyFunction, Function<? super V, ? extends V2> valueFunction) { synchronized (this.getLock()) { return this.getDelegate().collectKeyMultiValues(keyFunction, valueFunction); } } @Override public <V2> MutableBagMultimap<K, V2> collectValues(Function<? super V, ? extends V2> function) { synchronized (this.getLock()) { return this.getDelegate().collectValues(function); } } @Override public MutableSetMultimap<K, V> asSynchronized() { return this; } @Override protected MutableSetMultimap<K, V> getDelegate() { return (MutableSetMultimap<K, V>) super.getDelegate(); } }