View Javadoc

1   /*
2    * ModeShape (http://www.modeshape.org)
3    * See the COPYRIGHT.txt file distributed with this work for information
4    * regarding copyright ownership.  Some portions may be licensed
5    * to Red Hat, Inc. under one or more contributor license agreements.
6    * See the AUTHORS.txt file in the distribution for a full listing of 
7    * individual contributors.
8    *
9    * ModeShape is free software. Unless otherwise indicated, all code in ModeShape
10   * is licensed to you under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation; either version 2.1 of
12   * the License, or (at your option) any later version.
13   * 
14   * ModeShape is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this software; if not, write to the Free
21   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
23   */
24  package org.modeshape.graph.query.model;
25  
26  import net.jcip.annotations.Immutable;
27  import org.modeshape.common.util.CheckArg;
28  import org.modeshape.common.util.HashCode;
29  
30  /**
31   * A constraint that evaluates to true when the value defined by the dynamic operand evaluates to be within the specified range.
32   */
33  @Immutable
34  public class Between implements Constraint {
35  
36      private static final long serialVersionUID = 1L;
37  
38      private final DynamicOperand operand;
39      private final StaticOperand lowerBound;
40      private final StaticOperand upperBound;
41      private final boolean includeLowerBound;
42      private final boolean includeUpperBound;
43      private final int hc;
44  
45      /**
46       * Create a constraint that the values of the supplied dynamic operand are between the lower and upper bounds (inclusive).
47       * 
48       * @param operand the dynamic operand describing the values that are to be constrained
49       * @param lowerBound the lower bound of the range
50       * @param upperBound the upper bound of the range
51       * @throws IllegalArgumentException if any of the arguments are null
52       */
53      public Between( DynamicOperand operand,
54                      StaticOperand lowerBound,
55                      StaticOperand upperBound ) {
56          this(operand, lowerBound, upperBound, true, true);
57      }
58  
59      /**
60       * Create a constraint that the values of the supplied dynamic operand are between the lower and upper bounds, specifying
61       * whether the boundary values are to be included in the range.
62       * 
63       * @param operand the dynamic operand describing the values that are to be constrained
64       * @param lowerBound the lower bound of the range
65       * @param upperBound the upper bound of the range
66       * @param includeLowerBound true if the lower boundary value is not be included
67       * @param includeUpperBound true if the upper boundary value is not be included
68       * @throws IllegalArgumentException if any of the arguments are null
69       */
70      public Between( DynamicOperand operand,
71                      StaticOperand lowerBound,
72                      StaticOperand upperBound,
73                      boolean includeLowerBound,
74                      boolean includeUpperBound ) {
75          CheckArg.isNotNull(operand, "operand");
76          CheckArg.isNotNull(lowerBound, "lowerBound");
77          CheckArg.isNotNull(upperBound, "upperBound");
78          this.operand = operand;
79          this.lowerBound = lowerBound;
80          this.upperBound = upperBound;
81          this.includeLowerBound = includeLowerBound;
82          this.includeUpperBound = includeUpperBound;
83          this.hc = HashCode.compute(this.operand, this.lowerBound, this.upperBound);
84      }
85  
86      /**
87       * Get the dynamic operand specification.
88       * 
89       * @return the dynamic operand; never null
90       */
91      public DynamicOperand operand() {
92          return operand;
93      }
94  
95      /**
96       * Get the lower bound operand.
97       * 
98       * @return the lower bound; never null
99       */
100     public StaticOperand lowerBound() {
101         return lowerBound;
102     }
103 
104     /**
105      * Get the upper bound operand.
106      * 
107      * @return the upper bound; never null
108      */
109     public StaticOperand upperBound() {
110         return upperBound;
111     }
112 
113     /**
114      * Return whether the lower bound is to be included in the results.
115      * 
116      * @return true if the {@link #lowerBound() lower bound} is to be included, or false otherwise
117      */
118     public boolean isLowerBoundIncluded() {
119         return includeLowerBound;
120     }
121 
122     /**
123      * Return whether the upper bound is to be included in the results.
124      * 
125      * @return true if the {@link #upperBound() upper bound} is to be included, or false otherwise
126      */
127     public boolean isUpperBoundIncluded() {
128         return includeUpperBound;
129     }
130 
131     /**
132      * {@inheritDoc}
133      * 
134      * @see java.lang.Object#toString()
135      */
136     @Override
137     public String toString() {
138         return Visitors.readable(this);
139     }
140 
141     /**
142      * {@inheritDoc}
143      * 
144      * @see java.lang.Object#hashCode()
145      */
146     @Override
147     public int hashCode() {
148         return hc;
149     }
150 
151     /**
152      * {@inheritDoc}
153      * 
154      * @see java.lang.Object#equals(java.lang.Object)
155      */
156     @Override
157     public boolean equals( Object obj ) {
158         if (obj == this) return true;
159         if (obj instanceof Between) {
160             Between that = (Between)obj;
161             if (this.hc != that.hc) return false;
162             if (!this.operand.equals(that.operand)) return false;
163             if (!this.lowerBound.equals(that.lowerBound)) return false;
164             if (!this.upperBound.equals(that.upperBound)) return false;
165             if (this.includeLowerBound != that.includeLowerBound) return false;
166             if (this.includeUpperBound != that.includeUpperBound) return false;
167             return true;
168         }
169         return false;
170     }
171 
172     /**
173      * {@inheritDoc}
174      * 
175      * @see org.modeshape.graph.query.model.Visitable#accept(org.modeshape.graph.query.model.Visitor)
176      */
177     public void accept( Visitor visitor ) {
178         visitor.visit(this);
179     }
180 }