package rocks.inspectit.shared.cs.ci.business.expression;
import java.util.UUID;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSeeAlso;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import rocks.inspectit.shared.all.cmr.service.ICachedDataService;
import rocks.inspectit.shared.all.communication.data.InvocationSequenceData;
import rocks.inspectit.shared.cs.ci.business.expression.impl.AndExpression;
import rocks.inspectit.shared.cs.ci.business.expression.impl.BooleanExpression;
import rocks.inspectit.shared.cs.ci.business.expression.impl.NotExpression;
import rocks.inspectit.shared.cs.ci.business.expression.impl.OrExpression;
import rocks.inspectit.shared.cs.ci.business.expression.impl.StringMatchingExpression;
/**
* Abstract class for a boolean expression definition.
*
* @author Alexander Wert
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({ AndExpression.class, OrExpression.class, NotExpression.class, StringMatchingExpression.class, BooleanExpression.class })
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({ @JsonSubTypes.Type(value = AndExpression.class, name = "AND"),
@JsonSubTypes.Type(value = NotExpression.class, name = "NOT"),
@JsonSubTypes.Type(value = OrExpression.class, name = "OR"), @JsonSubTypes.Type(value = BooleanExpression.class, name = "Boolean"),
@JsonSubTypes.Type(value = StringMatchingExpression.class, name = "StringMatching") })
public abstract class AbstractExpression {
/**
* Identifier of the expression.
*/
@JsonIgnore
@XmlAttribute(name = "id", required = true)
private final long id = UUID.randomUUID().getMostSignificantBits();
/**
* Indicates whether the expression is modified in advanced mode.
*/
@JsonIgnore
@XmlAttribute(name = "advanced")
private Boolean advanced = Boolean.FALSE;
/**
* Evaluates the {@link AbstractExpression} against the evaluation context defined by the
* {@link InvocationSequenceData} instance.
*
* @param invocSequence
* {@link InvocationSequenceData} instance defining the evaluation context.
* @param cachedDataService
* {@link ICachedDataService} instance for retrieving method names, etc.
* @return Boolean result of evaluating the {@link AbstractExpression}
*/
public abstract boolean evaluate(InvocationSequenceData invocSequence, ICachedDataService cachedDataService);
/**
* Gets {@link #advanced}.
*
* @return {@link #advanced}
*/
public boolean isAdvanced() {
return advanced.booleanValue();
}
/**
* Sets {@link #advanced}.
*
* @param advanced
* New value for {@link #advanced}
*/
public void setAdvanced(boolean advanced) {
this.advanced = Boolean.valueOf(advanced);
}
/**
* Gets {@link #id}.
*
* @return {@link #id}
*/
public long getId() {
return id;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + (int) (id ^ (id >>> 32));
return result;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AbstractExpression other = (AbstractExpression) obj;
if (id != other.id) {
return false;
}
return true;
}
}