/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma.filter; import org.obiba.magma.NoSuchValueSetException; import org.obiba.magma.ValueSet; import org.obiba.magma.ValueTable; import org.obiba.magma.Variable; import org.obiba.magma.VariableEntity; import org.obiba.magma.support.AbstractValueTableWrapper; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; public class FilteredValueTable extends AbstractValueTableWrapper { private final FilterChain<ValueSet> entityFilterChain; private final FilterChain<Variable> variableFilterChain; private final ValueTable valueTable; public FilteredValueTable(ValueTable valueTable, FilterChain<Variable> variableFilterChain, FilterChain<ValueSet> entityFilterChain) { this.valueTable = valueTable; this.entityFilterChain = entityFilterChain; this.variableFilterChain = variableFilterChain; } @Override public ValueTable getWrappedValueTable() { return valueTable; } @Override public boolean hasValueSet(VariableEntity entity) { return entityFilterChain.filter(getWrappedValueTable().getValueSet(entity)) != null; } @Override public ValueSet getValueSet(VariableEntity entity) throws NoSuchValueSetException { ValueSet valueSet = super.getValueSet(entity); if(entityFilterChain.filter(valueSet) == null) { throw new NoSuchValueSetException(this, entity); } return valueSet; } @Override public Iterable<ValueSet> getValueSets() { return Iterables.filter(getWrappedValueTable().getValueSets(), new Predicate<ValueSet>() { @Override public boolean apply(ValueSet input) { return entityFilterChain.filter(input) != null; } }); } @Override public Iterable<Variable> getVariables() { return Iterables.filter(getWrappedValueTable().getVariables(), new Predicate<Variable>() { @Override public boolean apply(Variable input) { return variableFilterChain.filter(input) != null; } }); } }