package org.magenta.core;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.magenta.DataSet;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
/**
* Implementation of a forwarding data set that can be used to implement the
* Decorator pattern over existing {@link DataSet}.
*
* @author ngagnon
*
* @param <D>
*/
public class ForwardingDataSet<D> implements DataSet<D> {
private final Supplier<DataSet<D>> delegate;
/**
* @param delegate the delegate
*/
public ForwardingDataSet(Supplier<DataSet<D>> delegate) {
this.delegate = delegate;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((delegate == null) ? 0 : delegate.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof DataSet)) {
return false;
}
DataSet<?> other = (DataSet<?>) obj;
if (!delegate.get().equals(other)) {
return false;
}
return true;
}
@Override
public Class<D> getType() {
return delegate.get().getType();
}
@Override
public D[] array() {
return delegate.get().array();
}
@Override
public D[] array(int size) {
return delegate.get().array(size);
}
@Override
public D[] randomArray() {
return delegate.get().randomArray();
}
@Override
public D[] randomArray(int size) {
return delegate.get().randomArray(size);
}
@Override
public Iterable<D> get() {
return delegate.get().get();
}
@Override
public List<D> list() {
return delegate.get().list();
}
@Override
public List<D> list(int size) {
return delegate.get().list(size);
}
@Override
public List<D> randomList() {
return delegate.get().randomList();
}
@Override
public List<D> randomList(int size) {
return delegate.get().randomList(size);
}
@Override
public Set<D> set() {
return delegate.get().set();
}
@Override
public Set<D> set(int size) {
return delegate.get().set(size);
}
@Override
public DataSet<D> subset(int size) {
return delegate.get().subset(size);
}
@Override
public DataSet<D> filter(Predicate<? super D> filter) {
return delegate.get().filter(filter);
}
@Override
public <X> DataSet<X> transform(Function<? super D, X> function, Class<X> transformedType) {
return delegate.get().transform(function, transformedType);
}
@Override
public <S> DataSet<S> cast(Class<S> type) {
return delegate.get().cast(type);
}
@Override
public D any() {
return delegate.get().any();
}
@Override
public D link(Object o) {
return delegate.get().link(o);
}
@Override
public <L> Iterable<L> reverseLink(Class<L> type, D referred) {
return delegate.get().reverseLink(type, referred);
}
@Override
@SafeVarargs
public final DataSet<D> without(D... items) {
return delegate.get().without(items);
}
@Override
public boolean isGenerated() {
return delegate.get().isGenerated();
}
@Override
public boolean isPersistent() {
return delegate.get().isPersistent();
}
@Override
public DataSet<D> toTransient() {
return delegate.get().toTransient();
}
@Override
public DataSet<D> without(Collection<D> items) {
return delegate.get().without(items);
}
@Override
public boolean isEmpty() {
return delegate.get().isEmpty();
}
/*
* @Override public DataSet<D> process(Function<? super D, Void> processor) {
* return delegate.process(processor); }
*/
@Override
public D any(Predicate<? super D> filter) {
return delegate.get().any(filter);
}
@Override
public String toString() {
return Objects.toStringHelper(this).add("delegate", delegate).toString();
}
@Override
public DataSet<D> persist() {
return delegate.get().persist();
}
@Override
public DataSet<D> load() {
return delegate.get().load();
}
}