package rocks.inspectit.shared.cs.ci.business.expression.impl; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import rocks.inspectit.shared.all.cmr.service.ICachedDataService; import rocks.inspectit.shared.all.communication.data.InvocationSequenceData; import rocks.inspectit.shared.cs.ci.business.expression.AbstractExpression; import rocks.inspectit.shared.cs.ci.business.expression.IContainerExpression; /** * AND expression definition. Allows to conjunct multiple expressions. * * @author Alexander Wert * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "and") @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) public class AndExpression extends AbstractExpression implements IContainerExpression { /** * List of expressions constituting the operands of the conjunction expression. */ @XmlElementWrapper(name = "operands") @XmlElementRef(type = AbstractExpression.class, required = false) private List<AbstractExpression> operands = new ArrayList<AbstractExpression>(2); /** * Default Constructor. */ public AndExpression() { } /** * Constructor. * * @param operands * set of operands to be used in the AND conjunction */ public AndExpression(AbstractExpression... operands) { if (null == operands) { throw new IllegalArgumentException("Operands must not be null!"); } for (AbstractExpression exp : operands) { this.operands.add(exp); } } /** * {@inheritDoc} */ @Override public List<AbstractExpression> getOperands() { return operands; } /** * Sets {@link #operands}. * * @param operands * New value for {@link #operands} */ public void setOperands(List<AbstractExpression> operands) { this.operands = operands; } /** * {@inheritDoc} */ @Override public int getNumberOfChildExpressions() { return null == operands ? 0 : operands.size(); } /** * {@inheritDoc} */ @Override public boolean evaluate(InvocationSequenceData invocSequence, ICachedDataService cachedDataService) { for (AbstractExpression expr : getOperands()) { if (!expr.evaluate(invocSequence, cachedDataService)) { return false; } } return true; } /** * {@inheritDoc} */ @Override public void addOperand(AbstractExpression operand) { if (canAddOperand() && !getOperands().contains(operand)) { getOperands().add(operand); } } /** * {@inheritDoc} */ @Override public boolean canAddOperand() { return true; } /** * {@inheritDoc} */ @Override public void removeOperand(AbstractExpression operand) { getOperands().remove(operand); } }