blob: 4487a4d5a70fdceb875d277cdf71003a4c5fa752 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Formal Mind GmbH.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ingo Weigelt - initial API and implementation
******************************************************************************/
package org.eclipse.rmf.reqif10.search.filter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
import org.eclipse.rmf.reqif10.EnumValue;
import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
public class EnumFilter extends AbstractAttributeFilter{
public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
.immutableEnumSet(Operator.EQUALS, Operator.NOT_EQUALS,
Operator.CONTAINS_ALL, Operator.CONTAINS_ANY, Operator.IS_SET, Operator.IS_NOT_SET);
private AttributeDefinitionEnumeration attributeDefinition;
private Operator operator;
private HashSet<EnumValue> filterValues;
private HashSet<EnumValue> defaultValues;
public EnumFilter(Operator operator, Collection<EnumValue> value, AttributeDefinitionEnumeration attributeDefinition) {
// ensure that operator is supported
if (!SUPPORTED_OPERATORS.contains(operator)){
throw new IllegalArgumentException(
"This filter does not support the " + operator.toString()
+ " operation");
};
// ensure that value1 is not null
if (null == value && operator != Operator.IS_SET && operator != Operator.IS_NOT_SET ){
throw new IllegalArgumentException(
"value1 can not be null");
}
this.attributeDefinition = attributeDefinition;
this.operator = operator;
this.filterValues = value == null ? new HashSet<EnumValue>() : new HashSet<EnumValue>(value);
if (attributeDefinition.getDefaultValue() != null){
this.defaultValues = new HashSet<EnumValue>(attributeDefinition.getDefaultValue().getValues());
}else{
this.defaultValues = new HashSet<EnumValue>();
}
}
@Override
public boolean match(SpecElementWithAttributes element) {
if (operator == Operator.IS_SET || operator == Operator.IS_NOT_SET){
return super.match(element);
}
AttributeValueEnumeration attributeValue = (AttributeValueEnumeration) ReqIF10Util.getAttributeValue(element, attributeDefinition);
HashSet<EnumValue> elementValues = null;
if (attributeValue == null || !attributeValue.isSetValues()){
if (AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
elementValues = defaultValues;
}else{
elementValues = null;
}
}else{
elementValues = new HashSet<EnumValue>(attributeValue.getValues());
}
if (elementValues == null || elementValues.size() == 0){
switch (operator) {
case NOT_EQUALS:
return filterValues.isEmpty() ? false : true;
case EQUALS:
case CONTAINS_ALL:
case CONTAINS_ANY:
return filterValues.isEmpty() ? true : false;
default:
throw new IllegalArgumentException(
"This filter does not support the " + this.operator
+ " operation");
}
}
switch (operator) {
case EQUALS:
return elementValues.equals(filterValues);
case NOT_EQUALS:
return !elementValues.equals(filterValues);
case CONTAINS_ALL:
return elementValues.containsAll(filterValues);
case CONTAINS_ANY:
for (EnumValue enumValue : filterValues) {
if (elementValues.contains(enumValue)){
return true;
}
}
return false;
default:
throw new IllegalArgumentException(
"This filter does not support the " + this.operator
+ " operation");
}
}
@Override
public AttributeDefinitionEnumeration getAttribute() {
return attributeDefinition;
}
@Override
public Operator getOperator() {
return operator;
}
@Override
public Collection<EnumValue> getFilterValue1() {
return filterValues;
}
@Override
public Object getFilterValue2() {
return null;
}
@Override
public ImmutableSet<Operator> getSupportedOperators() {
return SUPPORTED_OPERATORS;
}
@Override
public String getFilterValue1AsString() {
return enumValuesAsString(getFilterValue1());
}
@Override
public String getFilterValue2AsString() {
return null;
}
private String enumValuesAsString(Collection<EnumValue> values){
StringBuilder sb = new StringBuilder("[");
for (Iterator<EnumValue> iterator = values.iterator(); iterator
.hasNext();) {
EnumValue enumValue = (EnumValue) iterator.next();
String label = enumValue.getLongName();
if (label == null){
label = enumValue.getDesc();
}
if (label == null){
label = "ID="+enumValue.getIdentifier();
}
sb.append(label);
if (iterator.hasNext()){
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}