/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package com.sun.opends.sdk.util; import java.util.AbstractCollection; import java.util.Collection; import java.util.Iterator; /** * Additional {@code Collection} based utility methods. */ public final class Collections2 { private static final class TransformedCollection extends AbstractCollection implements Collection { private final Collection collection; private final Function funcMtoN; private final Function funcNtoM; private final P p; private TransformedCollection(final Collection collection, final Function funcMtoN, final Function funcNtoM, final P p) { this.collection = collection; this.funcMtoN = funcMtoN; this.funcNtoM = funcNtoM; this.p = p; } /** * {@inheritDoc} */ @Override public boolean add(final N e) { return collection.add(funcNtoM.apply(e, p)); } /** * {@inheritDoc} */ @Override public void clear() { collection.clear(); } /** * {@inheritDoc} */ @Override @SuppressWarnings("unchecked") public boolean contains(final Object o) { final N tmp = (N) o; return collection.contains(funcNtoM.apply(tmp, p)); } /** * {@inheritDoc} */ @Override public boolean isEmpty() { return collection.isEmpty(); } /** * {@inheritDoc} */ @Override public Iterator iterator() { return Iterators.transform(collection.iterator(), funcMtoN, p); } /** * {@inheritDoc} */ @Override @SuppressWarnings("unchecked") public boolean remove(final Object o) { final N tmp = (N) o; return collection.remove(funcNtoM.apply(tmp, p)); } /** * {@inheritDoc} */ @Override public int size() { return collection.size(); } } /** * Returns a view of {@code collection} whose values have been mapped to * elements of type {@code N} using {@code funcMtoN}. The returned collection * supports all operations. * * @param * The type of elements contained in {@code collection}. * @param * The type of elements contained in the returned collection. * @param

* The type of the additional parameter to the function's {@code * apply} method. Use {@link java.lang.Void} for functions that do * not need an additional parameter. * @param collection * The collection to be transformed. * @param funcMtoN * A function which maps values of type {@code M} to values of type * {@code N}. This function will be used when retrieving values from * {@code collection}. * @param funcNtoM * A function which maps values of type {@code N} to values of type * {@code M}. This function will be used when performing queries and * adding values to {@code collection} . * @param p * A predicate specified parameter. * @return A view of {@code collection} whose values have been mapped to * elements of type {@code N} using {@code funcMtoN}. */ public static Collection transform( final Collection collection, final Function funcMtoN, final Function funcNtoM, final P p) { return new TransformedCollection(collection, funcMtoN, funcNtoM, p); } /** * Returns a view of {@code collection} whose values have been mapped to * elements of type {@code N} using {@code funcMtoN}. The returned collection * supports all operations. * * @param * The type of elements contained in {@code collection}. * @param * The type of elements contained in the returned collection. * @param collection * The collection to be transformed. * @param funcMtoN * A function which maps values of type {@code M} to values of type * {@code N}. This function will be used when retrieving values from * {@code collection}. * @param funcNtoM * A function which maps values of type {@code N} to values of type * {@code M}. This function will be used when performing queries and * adding values to {@code collection} . * @return A view of {@code collection} whose values have been mapped to * elements of type {@code N} using {@code funcMtoN}. */ public static Collection transform(final Collection collection, final Function funcMtoN, final Function funcNtoM) { return new TransformedCollection(collection, funcMtoN, funcNtoM, null); } // Prevent instantiation private Collections2() { // Do nothing. } }