package org.activityinfo.core.shared.criteria; import org.activityinfo.model.resource.ResourceId; import org.activityinfo.core.shared.Projection; import org.activityinfo.model.form.FormInstance; import org.activityinfo.model.formTree.FieldPath; import org.activityinfo.model.type.FieldValue; import org.activityinfo.model.type.ReferenceValue; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Objects; /** * Accepts an instance if the given field value matches * exactly. */ public class FieldCriteria implements Criteria { private FieldPath fieldPath; private FieldValue value; public FieldCriteria(@Nonnull ResourceId fieldId, @Nonnull FieldValue value) { this.fieldPath = new FieldPath(fieldId); this.value = value; } public FieldCriteria(FieldPath fieldPath, FieldValue value) { this.fieldPath = fieldPath; this.value = value; } public FieldCriteria(FieldPath fieldPath, ResourceId referenceValueId) { this(fieldPath, new ReferenceValue(referenceValueId)); } @Override public void accept(CriteriaVisitor visitor) { visitor.visitFieldCriteria(this); } @Override public boolean apply(@Nullable FormInstance input) { if(fieldPath.isNested()) { return true; } else { return Objects.equals(input.get(fieldPath.getRoot()), value); } } @Override public boolean apply(@Nonnull Projection input) { return Objects.equals(input.getValue(fieldPath), value); } public ResourceId getFieldId() { return fieldPath.getRoot(); } public FieldPath getFieldPath() { return fieldPath; } public Object getValue() { return value; } }