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 import java.util.HashMap;
19 import java.util.Map;
20 import java.util.Set;
21
22 /**
23 * Base class for all the parsing stages. A parsing stage is composed of a name
24 * and a set of named transitions. This way we can configure the parser as a
25 * state machine.
26 *
27 * @author Massimiliano Ziccardi
28 */
29 abstract class Stage {
30 /**
31 * The stage name.
32 */
33 private final String name;
34
35 /**
36 * The sets of stage transitions.
37 */
38 private Map<String, Stage> nextStagesMap = new HashMap<String, Stage>();
39
40 /**
41 * @param stageName
42 * The stage name
43 */
44 protected Stage(final String stageName) {
45 name = stageName;
46 }
47
48 /**
49 * Adds a possible transition to this stage.
50 *
51 * @param stage
52 * The transition
53 */
54 public void addTransition(final Stage stage) {
55 nextStagesMap.put(stage.name, stage);
56 }
57
58 /**
59 * Returns the name of this stage.
60 *
61 * @return The name of this stage
62 */
63 public String getName() {
64 return name;
65 }
66
67 /**
68 * Returns a named transition of this stage.
69 *
70 * @param stageName
71 * The requested transition
72 * @return The transition if found. Null otherwise.
73 */
74 public Stage getTransition(final String stageName) {
75 return nextStagesMap.get(stageName);
76 }
77
78 /**
79 * Returns the list of the possible transitions from this stage.
80 *
81 * @return the list of the possible transitions from this stage
82 */
83 public Set<String> getTransitionNames() {
84 return nextStagesMap.keySet();
85 }
86
87 /**
88 * A stage is a leaf if no transition are possible from here..
89 *
90 * @return <code>true</code> if no transitions are available from here.
91 */
92 public boolean isLeaf() {
93 return this.nextStagesMap.isEmpty();
94 }
95
96 /**
97 * Consumes a part of the threshold and configure the
98 * {@link RangeConfig} object according to the swallowed part of the
99 * threshold.
100 *
101 * @param threshold
102 * The threshold to consume.
103 * @param tc
104 * The threshold configuration object
105 * @return The remaining unparsed part of the threshold
106 * @throws RangeException
107 * -
108 */
109 public abstract String parse(final String threshold, RangeConfig tc)
110 throws RangeException;
111
112 /**
113 * Tells if the current stage is able to parse the given threshold.
114 * @param threshold The threshold to be parsed
115 * @return The remaining tokens
116 */
117 public abstract boolean canParse(String threshold);
118
119 /**
120 * @return The list of tokens expected by this stage.
121 */
122 public abstract String expects();
123 }