package org.magenta.core; import java.util.Set; import org.magenta.DataKey; import org.magenta.DataSet; import org.magenta.DataSetNotFoundException; import org.magenta.DataSpecification; import org.magenta.Fixture; import org.magenta.GenerationStrategy; import org.magenta.Generator; import org.magenta.GeneratorNotFoundException; import org.magenta.random.FluentRandom; import com.google.common.base.Preconditions; import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import com.google.common.eventbus.EventBus; /** * Aggregator that links an existing data domain with another. * * @author normand * * @param <S> */ public class DataDomainAggregator<S extends DataSpecification> implements Fixture<S> { private final Fixture<S> parent; private final Fixture<? super S> delegate; /** * Default constructor. * * @param delegate * the delegate * @param parent * the parent */ public DataDomainAggregator(Fixture<? super S> delegate, Fixture<S> parent) { this.parent = parent; this.delegate = delegate; this.delegate.getEventBus().register(parent); } @Override public <D> DataSet<D> dataset(Class<D> clazz) { Preconditions.checkNotNull(clazz); try { return delegate.dataset(clazz); } catch (DataSetNotFoundException dsnfe) { return parent.dataset(clazz); } } @Override public <D> DataSet<D> dataset(DataKey<D> key) { Preconditions.checkNotNull(key); try { return delegate.dataset(key); } catch (DataSetNotFoundException dsnfe) { return parent.dataset(key); } } @Override public Set<DataKey<?>> datasetKeys() { return parent == null ? delegate.datasetKeys() : FluentIterable.from(Iterables.concat(delegate.datasetKeys(), parent.datasetKeys())).toSet(); } @Override public Iterable<DataSet<?>> datasets() { return parent == null ? delegate.datasets() : FluentIterable.from(Iterables.concat(delegate.datasets(), parent.datasets())); } @Override public <D> Generator<D> generator(Class<D> clazz) { Preconditions.checkNotNull(clazz); try { return delegate.generator(clazz); } catch (GeneratorNotFoundException dsnfe) { return parent.generator(clazz); } } @Override public <D> Generator<D> generator(DataKey<D> key) { Preconditions.checkNotNull(key); try { return delegate.generator(key); } catch (GeneratorNotFoundException dsnfe) { return parent.generator(key); } } @Override public Set<DataKey<?>> strategyKeys() { return parent == null ? delegate.strategyKeys() : FluentIterable.from(Iterables.concat(delegate.strategyKeys(), parent.strategyKeys())).toSet(); } @Override public Iterable<GenerationStrategy<?, ? extends DataSpecification>> strategies() { return parent == null ? delegate.strategies() : FluentIterable.from(Iterables.concat(delegate.strategies(), parent.strategies())); } @SuppressWarnings("unchecked") @Override public <D> GenerationStrategy<D, S> strategy(DataKey<D> key) { Preconditions.checkNotNull(key); GenerationStrategy<D, ? super S> gen = delegate.strategy(key); if (gen == null && getParent() != null) { return getParent().strategy(key); } return (GenerationStrategy<D, S>) gen; } @Override public <D> GenerationStrategy<D, S> strategy(Class<D> clazz) { return strategy(DataKey.makeDefault(clazz)); } @Override public Fixture<S> getParent() { return parent; } @Override public FluentRandom getRandomizer() { return delegate.getRandomizer(); } @Override public S getSpecification() { return parent.getSpecification(); } @Override public String getName() { return "aggregation of " + delegate.getName() + " and " + parent.getName(); } @Override public int getVersion(){ return this.parent.getVersion() + this.delegate.getVersion(); } @Override public Integer sizeOf(DataKey<?> key) { return delegate.sizeOf(key); } @Override public EventBus getEventBus() { return this.parent.getEventBus(); } @Override public Integer sizeOf(Class<?> clazz) { return delegate.sizeOf(clazz); } }