blob: 9e4dbaa934b55154be5dda8a67fb3a5a5ab559f3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
* Jakob Spies - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.core.common;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Collection utility functions.
*/
public class CollectionTypeUtils
{
/**
* Replaces the content of one {@link Collection} with the content of another one
* if they are not equal.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @pre source != null
* @pre target != null
*/
public static <T> void copyContents(
final Collection<T> source,
final Collection<T> target
){
if (!Checker.isEqual(source, target)){
copyContentsWithoutCheck(source, target);
}
}
/**
* Returns an object different from the given one.
* @param set the set to search
* @param obj the object to avoid
* @param <T> type of the objects
* @param equal equality relation to use for comparison
* @return an object different from <code>obj</code>,
* if there is one, otherwise nil
* @pre docs != null
* @pre schema != null
*/
public static <T> T findOther(
final Collection<? extends T> set,
final T obj,
final Equal<? super T> equal
){
Nil.checkNil(set, "docs"); //$NON-NLS-1$
T res = null;
for (final T doc: set){
if (!equal.isEqual(doc, obj)){
res = doc;
break;
}
}
return res;
}
/**
* Replaces the content of one {@link Collection} with the content of another one
* if they are not equal.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @param equal the comparison operator
* @pre source != null
* @pre target != null
*/
public static <T> void copyContents(
final Collection<T> source,
final Collection<T> target,
final Equal<? super T> equal
){
if (!Checker.isEqual(source, target, equal)){
copyContentsWithoutCheck(source, target);
}
}
/**
* Replaces the content of one {@link Collection} with the content of another one,
* clearing the source {@link Collection} first,
* if they are not equal.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @param equal equality relation for <code>T</code> objects
* @pre source != null
* @pre target != null
*/
public static <T> void moveContents(
final Collection<T> source,
final Collection<T> target,
final Equal<T> equal
){
if (!Checker.isEqual(source, target, equal)){
clearSourceAndTargetAndCopy(source, target);
}
}
/**
* Replaces the content of one {@link Collection} with the content of another one
* without checking equality. The target <em>and source</em> {@link Collection}s
* are emptied before the
* target {@link Collection} is filled.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @pre source != null
* @pre target != null
*/
public static <T> void clearSourceAndTargetAndCopy(
final Collection<T> source,
final Collection<T> target
){
Nil.checkNil(source, "source"); //$NON-NLS-1$
Nil.checkNil(target, "target"); //$NON-NLS-1$
final Collection<T> copy = duplicate(source);
source.clear();
target.clear();
target.addAll(copy);
}
/**
* Replaces the content of one {@link Collection} with the content of another one
* without checking equality. The <em>source</em> {@link Collection}
* is emptied before the
* target {@link Collection} is filled.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @pre source != null
* @pre target != null
*/
public static <T> void clearSourceAndCopy(
final Collection<T> source,
final Collection<T> target
){
Nil.checkNil(source, "source"); //$NON-NLS-1$
Nil.checkNil(target, "target"); //$NON-NLS-1$
final Collection<T> copy = duplicate(source);
source.clear();
target.addAll(copy);
}
/**
* Returns a new {@link ArrayList} with the same contents as <code>source</code>,
* except for the case that <code>source</code> is nil or empty, in which <code>source</code>
* itself is returned.
* @param <T> element type
* @param source the {@link Collection} to clone
* @return a new {@link ArrayList} with the same contents as <code>source</code>,
* except for the case that <code>source</code> is nil or empty, in which <code>source</code>
* itself is returned
*/
public static <T> Collection<T> duplicate(Collection<T> source){
final Collection<T> result;
if (source == null || source.isEmpty()){
result = source;
}else{
result = new ArrayList<T>(source.size());
result.addAll(source);
}
return result;
}
/**
* Replaces the content of one {@link Collection} with the content of another one
* without checking equality. Cears the source collection afterwards.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @pre source != null
* @pre target != null
*/
public static <T> void moveContentsWithoutCheck(
final Collection<T> source,
final Collection<T> target
){
Nil.checkNil(source, "source"); //$NON-NLS-1$
Nil.checkNil(target, "target"); //$NON-NLS-1$
target.clear();
target.addAll(source);
source.clear();
}
/**
* Tries to find an one occurrence of an object in the given collection.
* @param objects the set to search
* @param <T> the object type
* @param criterion the search criterion
* @return the found object if it was found, nil otherwise
* @pre objects != null
* @pre criterion != null
*/
public static <T> List<T> find(
final Collection<T> objects,
final Condition<? super T> criterion
){
Nil.checkNil(objects, "objects"); //$NON-NLS-1$
Nil.checkNil(criterion, "criterion"); //$NON-NLS-1$
List<T> findings = new ArrayList<T>();
for (final T obj: objects){
if (criterion.isSatisfied(obj)){
findings.add(obj);
}
}
return findings;
}
/**
* Returns the position of the first occurrence of an object in the given sequence.
* @param objects the sequence to search
* @param <T> the object type
* @param criterion the search criterion
* @return the position of the first occurrence of the object if it was found, -1 otherwise
* @pre objects != null
* @pre criterion != null
*/
public static <T> int indexOf(
final List<? extends T> objects,
final Condition<T> criterion
){
Nil.checkNil(objects, "objects"); //$NON-NLS-1$
Nil.checkNil(criterion, "criterion"); //$NON-NLS-1$
int found = -1;
for (int i = 0, n = objects.size(); i < n; ++i){
if (criterion.isSatisfied(objects.get(i))){
found = i;
break;
}
}
return found;
}
/**
* Returns all occurrences of objects satisfying some <code>criterion</code>
* in the given collection.
* @param objects the set to search
* @param criterion the search criterion
* @param <T> the object type
* @return the objects satisfying the <code>criterion</code>
* @pre objects != null
* @pre criterion != null
* @post return != null
*/
public static <T> Collection<T> findAll(
final Collection<T> objects,
final Condition<? super T> criterion
){
Nil.checkNil(objects, "objects"); //$NON-NLS-1$
Nil.checkNil(criterion, "criterion"); //$NON-NLS-1$
Collection<T> found = null;
for (final T obj: objects){
if (criterion.isSatisfied(obj)){
if (found == null){
found = new LinkedList<T>();
}
found.add(obj);
}
}
if (found == null){
found = Collections.emptyList();
}
return found;
}
/**
* Returns all occurrences of objects of a certain runtime type
* in the given collection.
* @param objects the set to search
* @param type the target type
* @param <T> the target type
* @return the objects of type <code>type</code>
* @pre objects != null
* @pre type != null
* @post return != null
*/
public static <T> Collection<T> findAllOfType(
final Collection<? super T> objects,
final Class<T> type
){
Nil.checkNil(objects, "objects"); //$NON-NLS-1$
Nil.checkNil(type, "type"); //$NON-NLS-1$
Collection<T> found = null;
for (final Object obj: objects){
if (type.isInstance(obj)){
if (found == null){
found = new LinkedList<T>();
}
found.add((T)obj);
}
}
if (found == null){
found = Collections.emptyList();
}
return found;
}
/**
* Returns all occurrences objects satisfying some <code>criterion</code> in the given collection.
* @param objects the set to search
* @param criterion the search criterion
* @param <T> the object type
* @return the objects satisfying the <code>criterion</code>
* @pre objects != null
* @pre criterion != null
* @post return != null
*/
public static <T> Set<T> findAllAsSet(
final Collection<T> objects,
final Condition<? super T> criterion
){
Nil.checkNil(objects, "objects"); //$NON-NLS-1$
Nil.checkNil(criterion, "criterion"); //$NON-NLS-1$
Set<T> found = null;
for (final T obj: objects){
if (criterion.isSatisfied(obj)){
if (found == null){
found = new HashSet<T>();
}
found.add(obj);
}
}
if (found == null){
found = Collections.emptySet();
}
return found;
}
/**
* Replaces the content of one {@link Collection} with the content of another one
* without checking equality.
* @param <T> content type
* @param source source {@link Collection}
* @param target target {@link Collection}
* @pre source != null
* @pre target != null
*/
private static <T> void copyContentsWithoutCheck(
final Collection<T> source,
final Collection<T> target
){
Nil.checkNil(source, "source"); //$NON-NLS-1$
Nil.checkNil(target, "target"); //$NON-NLS-1$
target.clear();
target.addAll(source);
}
/**
* Search whether any object in 'objects' array does equal 'searchForObject'.
* @param objects can be null, and can contain null values
* @param searchForObject can be null
* @return true if searchForObject is found in 'objects'
*/
public static boolean containsObject(Object objects[], Object searchForObject) {
if(objects == null) {
return false;
}
for(Object object : objects) {
boolean found = object == null ? searchForObject == null : object.equals(searchForObject);
if(found) {
return true;
}
}
return false;
}
}