package org.mobicents.slee.container.component.deployment.jaxb.descriptors.profile.query; import java.util.ArrayList; import java.util.List; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.And; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.Compare; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.HasPrefix; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.LongestPrefixMatch; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.Not; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.Or; import org.mobicents.slee.container.component.deployment.jaxb.slee11.profile.RangeMatch; /** * This class is agregation of query expresion elements defined in: slee.1.1 * specs chapter 10.20.2. Generaly it creates expression tree from passed * arguments to match one defined in xml descriptor. This is an abstraction from plain translation from xml structure <br> * * Start time:11:10:10 2009-01-29<br> * Project: mobicents-jainslee-server-core<br> * * @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a> * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> */ public class MQueryExpression { private MQueryExpressionType type; private MQueryExpressionType parentType; //for not, or, and private ArrayList<MQueryExpression> childExpressions = new ArrayList<MQueryExpression>(); //For others private MCompare compare; private MLongestPrefixMatch longestPrefixMatch; private MHasPrefix hasPrefix; private MRangeMatch rangeMatch; /** * Constructs this query expression tree * * @param operator */ public MQueryExpression(Object operator) { if(operator instanceof Compare) { this.parentType = null; this.type = MQueryExpressionType.Compare; this.compare = new MCompare((Compare) operator); } else if(operator instanceof HasPrefix) { this.parentType = null; this.type = MQueryExpressionType.HasPrefix; this.hasPrefix = new MHasPrefix( (HasPrefix) operator); } else if(operator instanceof LongestPrefixMatch) { this.parentType = null; this.type = MQueryExpressionType.LongestPrefixMatch; this.longestPrefixMatch = new MLongestPrefixMatch( (LongestPrefixMatch) operator); } else if(operator instanceof RangeMatch) { this.parentType = null; this.type = MQueryExpressionType.RangeMatch; this.rangeMatch = new MRangeMatch( (RangeMatch) operator); } else if(operator instanceof Or) { //here we will have atleast two elements Or or = (Or)operator; this.parentType = null; this.type = MQueryExpressionType.Or; for(Object childRaw : or.getCompareOrRangeMatchOrLongestPrefixMatchOrHasPrefixOrAndOrOrOrNot()) { MQueryExpression child = new MQueryExpression(childRaw); child.parentType = this.type; this.childExpressions.add(child); } } else if(operator instanceof And) { //here we will have atleast two elements And and = (And)operator; this.parentType = null; this.type = MQueryExpressionType.And; for(Object childRaw : and.getCompareOrRangeMatchOrLongestPrefixMatchOrHasPrefixOrAndOrOrOrNot()) { MQueryExpression child = new MQueryExpression(childRaw); child.parentType = this.type; this.childExpressions.add(child); } } else if(operator instanceof Not) { //Not should have one, we will get one, this is xml validation part Not not = (Not)operator; this.parentType = null; this.type = MQueryExpressionType.Not; for(Object childRaw : not.getCompareOrRangeMatchOrLongestPrefixMatchOrHasPrefixOrAndOrOrOrNot()) { MQueryExpression child = new MQueryExpression(childRaw); child.parentType = this.type; this.childExpressions.add(child); } } else throw new IllegalArgumentException("Can not match query expression element to any known: " + operator); } public MQueryExpressionType getType() { return type; } public MQueryExpressionType getParentType() { return parentType; } public MCompare getCompare() { return compare; } public MLongestPrefixMatch getLongestPrefixMatch() { return longestPrefixMatch; } public MHasPrefix getHasPrefix() { return hasPrefix; } public MRangeMatch getRangeMatch() { return rangeMatch; } public MQueryExpression getNot() { for(MQueryExpression expr : this.childExpressions) { if(expr.getType() == MQueryExpressionType.Not); return expr; } return null; } public List<MQueryExpression> getAnd() { return this.childExpressions; } public List<MQueryExpression> getOr() { return this.childExpressions; } }