/* * 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.ignite.internal.util; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.NoSuchElementException; import org.jetbrains.annotations.NotNull; /** * Wrapper around several collection, don't allow adding new elements. * @param <E> */ public class GridMultiCollectionWrapper<E> implements Collection<E>{ /** Collections. */ public final Collection<E>[] collections; /** * @param collections Collections. */ public GridMultiCollectionWrapper(Collection<E> ... collections) { this.collections = collections; } /** {@inheritDoc} */ @Override public int size() { int size = 0; for (Collection<E> collection : collections) size += collection.size(); return size; } /** {@inheritDoc} */ @Override public boolean isEmpty() { for (Collection<E> collection : collections) { if (!collection.isEmpty()) return false; } return true; } /** {@inheritDoc} */ @Override public boolean contains(Object o) { for (Collection<E> collection : collections) { if (collection.contains(o)) return true; } return false; } /** {@inheritDoc} */ @NotNull @Override public Iterator<E> iterator() { if (collections.length == 0) return Collections.emptyIterator(); return new Iterator<E>() { int currCol = 0; Iterator<E> currIter = collections[0].iterator(); @Override public boolean hasNext() { if (currIter.hasNext()) return true; while (true) { currCol++; if (currCol < collections.length) currIter = collections[currCol].iterator(); else return false; if (currIter.hasNext()) return true; } } @Override public E next() { if (hasNext()) return currIter.next(); throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } /** {@inheritDoc} */ @NotNull @Override public Object[] toArray() { throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @NotNull @Override public <T> T[] toArray(@NotNull T[] a) { throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @Override public boolean add(E e) { throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @Override public boolean remove(Object o) { boolean rmv = false; for (Collection<E> collection : collections) rmv |= collection.remove(o); return rmv; } /** {@inheritDoc} */ @Override public boolean containsAll(@NotNull Collection<?> c) { for (Object o : c) { if (!contains(o)) return false; } return true; } /** {@inheritDoc} */ @Override public boolean addAll(Collection<? extends E> c) { throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @Override public boolean removeAll(@NotNull Collection<?> c) { boolean rmv = false; for (Collection<E> collection : collections) rmv |= collection.removeAll(c); return rmv; } /** {@inheritDoc} */ @Override public boolean retainAll(@NotNull Collection<?> c) { throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @Override public void clear() { for (Collection<E> collection : collections) collection.clear(); } /** * @return Number of inner collections. */ public int collectionsSize() { return collections.length; } /** * @param idx Inner collection index. * @return Collection. */ public Collection<E> innerCollection(int idx) { return collections[idx]; } }