/* * Copyright 2008 Google Inc. * * Licensed 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 com.google.gwt.core.ext.linker; import java.io.Serializable; import java.util.Collection; import java.util.Comparator; import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; /** * Provides stable ordering and de-duplication of artifacts. */ public final class ArtifactSet implements SortedSet<Artifact<?>>, Serializable { private final TypeIndexedSet<Artifact<?>> delegate = new TypeIndexedSet<Artifact<?>>(new TreeSet<Artifact<?>>()); public ArtifactSet() { } public ArtifactSet(Collection<? extends Artifact<?>> copyFrom) { addAll(copyFrom); } @Override public boolean add(Artifact<?> o) { return delegate.add(o); } @Override public boolean addAll(Collection<? extends Artifact<?>> c) { return delegate.addAll(c); } @Override public void clear() { delegate.clear(); } @Override public Comparator<? super Artifact<?>> comparator() { return delegate.comparator(); } @Override public boolean contains(Object o) { return delegate.contains(o); } @Override public boolean containsAll(Collection<?> c) { return delegate.containsAll(c); } @Override public boolean equals(Object o) { return delegate.equals(o); } /** * Find all Artifacts assignable to some base type. The returned value will be * a snapshot of the values in the ArtifactSet. An example of how this could * be used: * * <pre> * for (EmittedArtifact ea : artifactSet.find(EmittedArtifact.class)) { * ... * } * </pre> * * @param <T> the desired type of Artifact * @param artifactType the desired type of Artifact * @return all Artifacts in the ArtifactSet assignable to the desired type */ public <T extends Artifact<? super T>> SortedSet<T> find(Class<T> artifactType) { return delegate.getTypeIndex().findAssignableTo(artifactType); } @Override public Artifact<?> first() { return delegate.first(); } /** * Prevent further modification of the ArtifactSet. Any attempts to alter * the ArtifactSet after invoking this method will result in an * UnsupportedOperationException. */ public void freeze() { delegate.freeze(); } @Override public int hashCode() { return delegate.hashCode(); } @Override public SortedSet<Artifact<?>> headSet(Artifact<?> toElement) { return delegate.headSet(toElement); } @Override public boolean isEmpty() { return delegate.isEmpty(); } @Override public Iterator<Artifact<?>> iterator() { return delegate.iterator(); } @Override public Artifact<?> last() { return delegate.last(); } @Override public boolean remove(Object o) { return delegate.remove(o); } @Override public boolean removeAll(Collection<?> c) { return delegate.removeAll(c); } /** * Possibly replace an existing Artifact. * * @param artifact the replacement Artifact * @return <code>true</code> if an equivalent Artifact was already present. */ public boolean replace(Artifact<?> artifact) { boolean toReturn = delegate.remove(artifact); delegate.add(artifact); return toReturn; } @Override public boolean retainAll(Collection<?> c) { return delegate.retainAll(c); } @Override public int size() { return delegate.size(); } @Override public SortedSet<Artifact<?>> subSet(Artifact<?> fromElement, Artifact<?> toElement) { return delegate.subSet(fromElement, toElement); } @Override public SortedSet<Artifact<?>> tailSet(Artifact<?> fromElement) { return delegate.tailSet(fromElement); } @Override public Object[] toArray() { return delegate.toArray(); } @Override public <T> T[] toArray(T[] a) { return delegate.toArray(a); } @Override public String toString() { return delegate.toString(); } }