View Javadoc

1   /*******************************************************************************
2    * Copyright (c) 2007, 2014 Massimiliano Ziccardi
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *******************************************************************************/
16  package it.jnrpe.utils.thresholds;
17  
18  /**
19   * When the threshold parser is executing this stage it means it is expecting an
20   * open or closed bracket.
21   *
22   * @author Massimiliano Ziccardi
23   */
24  abstract class BracketStage extends Stage {
25  
26      /**
27       * The bracket to search for (open or closed).
28       */
29      private final String bracket;
30  
31      /**
32       * Builds the bracket stage.
33       *
34       * @param stageName
35       *            The name of the stage
36       * @param matchedBracket
37       *            The bracket to search for
38       */
39      protected BracketStage(final String stageName, final char matchedBracket) {
40          super(stageName);
41          bracket = "" + matchedBracket;
42      }
43  
44      /**
45       * Parses the threshold to remove the matched braket.
46       *
47       * No checks are performed against the passed in string: the object
48       * assumes that the string is correct since the {@link #canParse(String)}
49       * method <b>must</b> be called <b>before</b> this method.
50       *
51       * @param threshold
52       *            The threshold to parse
53       * @param tc
54       *            The threshold config object. This object will be populated
55       *            according to the passed in threshold.
56       * @return the remaining part of the threshold
57       */
58      @Override
59      public String parse(final String threshold, final RangeConfig tc) {
60          configure(tc);
61          return threshold.substring(1);
62      }
63  
64      /**
65       * Tells the parser if this stage is able to parse the current remaining
66       * threshold part.
67       *
68       * @param threshold
69       *            The threshold part to be parsed.
70       * @return <code>true</code> if this object can consume a part of the
71       *         threshold
72       */
73      @Override
74      public boolean canParse(final String threshold) {
75          if (threshold == null) {
76              return false;
77          }
78  
79          return threshold.startsWith(bracket);
80      }
81  
82      /**
83       * This method is used to generate the exception message.
84       *
85       * @return the token that this stage is waiting for.
86       */
87      @Override
88      public String expects() {
89          return bracket;
90      }
91  
92      /**
93       * Sets the {@link RangeConfig} object as not
94       * left/right inclusive.
95       *
96       * @param rc The range configuration
97       */
98      protected abstract void configure(final RangeConfig rc);
99  
100     /**
101      * This class implements a 'closed brace stage'. It consumes, if present, a
102      * closed brace at the beginning of the received threshold chunk.
103      *
104      * @author Massimiliano Ziccardi
105      */
106     public static class ClosedBracketStage extends BracketStage {
107 
108         /**
109          *
110          */
111         public ClosedBracketStage() {
112             super("closedbracket", ')');
113         }
114 
115         /**
116          * Closed bracket can be the end of the range.
117          * @return <code>true</code>
118          */
119         public final boolean isLeaf() {
120             return true;
121         }
122 
123         /**
124          * Sets the {@link RangeConfig} object as not
125          * right inclusive.
126          *
127          * @param rc The range configuration
128          */
129         protected final void configure(final RangeConfig rc) {
130             rc.setRightInclusive(false);
131         }
132     }
133 
134     /**
135      * This class implements a 'open brace stage'. It consumes, if present, an
136      * open brace at the beginning of the received threshold chunk.
137      *
138      * Example Input : (0..100
139      *
140      * Produced Output : 0..100 and calls the
141      * {@link RangeConfig#setLeftInclusive(boolean)} passing
142      * <code>true</code>
143      *
144      * @author Massimiliano Ziccardi
145      */
146     public static class OpenBracketStage extends BracketStage {
147 
148         /**
149          *
150          */
151         public OpenBracketStage() {
152             super("openbracket", '(');
153         }
154 
155         /**
156          * Sets the {@link RangeConfig} object as not
157          * left inclusive.
158          *
159          * @param rc The range configuration
160          */
161         protected final void configure(final RangeConfig rc) {
162             rc.setLeftInclusive(false);
163         }
164 
165     }
166 
167 }