/*
* Copyright (c) 2017 wetransform GmbH
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* wetransform GmbH <http://www.wetransform.to>
*/
package eu.esdihumboldt.hale.common.instance.model.impl;
import java.util.Collection;
import java.util.Iterator;
import eu.esdihumboldt.hale.common.instance.model.Filter;
import eu.esdihumboldt.hale.common.instance.model.Instance;
import eu.esdihumboldt.hale.common.instance.model.InstanceCollection;
import eu.esdihumboldt.hale.common.instance.model.InstanceReference;
import eu.esdihumboldt.hale.common.instance.model.InstanceResolver;
import eu.esdihumboldt.hale.common.instance.model.ResourceIterator;
/**
* Instance collection based on references.
*
* @author Simon Templer
*/
public class ReferenceInstanceCollection implements InstanceCollection {
/**
* Instance iterator based on instance references.
*
* @param <X> the instance reference type
*/
private class ReferenceIterator<X extends InstanceReference>
extends GenericResourceIteratorAdapter<X, Instance> {
/**
* Constructor.
*
* @param iterator iterator on instances references
*/
public ReferenceIterator(Iterator<X> iterator) {
super(iterator);
}
@Override
protected Instance convert(X next) {
return instanceResolver.getInstance(next);
}
}
private final Collection<? extends InstanceReference> references;
private final InstanceResolver instanceResolver;
/**
* Create an instance collection based on the given references.
*
* @param references the instance references
* @param instanceResolver the instance resolver
*/
public ReferenceInstanceCollection(Collection<? extends InstanceReference> references,
InstanceResolver instanceResolver) {
this.references = references;
this.instanceResolver = instanceResolver;
}
@Override
public InstanceReference getReference(Instance instance) {
// TODO instead have references associated to instances and retrieve
// those?
return new PseudoInstanceReference(instance);
}
@Override
public Instance getInstance(InstanceReference reference) {
if (reference instanceof PseudoInstanceReference) {
return ((PseudoInstanceReference) reference).getInstance();
}
return instanceResolver.getInstance(reference);
}
@Override
public ResourceIterator<Instance> iterator() {
return new ReferenceIterator<>(references.iterator());
}
@Override
public boolean hasSize() {
return true;
}
@Override
public int size() {
return references.size();
}
@Override
public boolean isEmpty() {
return references.isEmpty();
}
@Override
public InstanceCollection select(Filter filter) {
return FilteredInstanceCollection.applyFilter(this, filter);
}
}