1 /***
2 * Jetrix TetriNET Server
3 * Copyright (C) 2001-2004 Emmanuel Bourg
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 package net.jetrix.config;
21
22 import org.apache.commons.digester.Digester;
23 import org.apache.commons.digester.RuleSetBase;
24 import org.apache.commons.digester.Rule;
25
26 /***
27 * RuleSet for processing the content of a channel configuration file.
28 *
29 * @author Emmanuel Bourg
30 * @version $Revision: 860 $, $Date: 2010-05-06 13:21:05 +0200 (jeu., 06 mai 2010) $
31 */
32 class ChannelsRuleSet extends RuleSetBase
33 {
34
35 public void addRuleInstances(Digester digester)
36 {
37 digester.addCallMethod("tetrinet-channels/motd", "setMessageOfTheDay", 0);
38
39
40 digester.addObjectCreate("tetrinet-channels/default-settings", "net.jetrix.config.Settings");
41 digester.addSetNext("tetrinet-channels/default-settings", "setDefaultSettings", "net.jetrix.config.Settings");
42
43
44 digester.addObjectCreate("*/channel/settings", "net.jetrix.config.Settings");
45 digester.addSetNext("*/channel/settings", "setSettings", "net.jetrix.config.Settings");
46
47
48 digester.addCallMethod("*/starting-level", "setStartingLevel", 0, new Class[] {Integer.TYPE});
49 digester.addCallMethod("*/lines-per-level", "setLinesPerLevel", 0, new Class[] {Integer.TYPE});
50 digester.addCallMethod("*/level-increase", "setLevelIncrease", 0, new Class[] {Integer.TYPE});
51 digester.addCallMethod("*/lines-per-special", "setLinesPerSpecial", 0, new Class[] {Integer.TYPE});
52 digester.addCallMethod("*/special-added", "setSpecialAdded", 0, new Class[] {Integer.TYPE});
53 digester.addCallMethod("*/special-capacity", "setSpecialCapacity", 0, new Class[] {Integer.TYPE});
54 digester.addCallMethod("*/classic-rules", "setClassicRules", 0, new Class[] {Boolean.TYPE});
55 digester.addCallMethod("*/average-levels", "setAverageLevels", 0, new Class[] {Boolean.TYPE});
56 digester.addCallMethod("*/same-blocks", "setSameBlocks", 0, new Class[] {Boolean.TYPE});
57
58 for (Block block : Block.values())
59 {
60 digester.addRule("*/block-occurancy/" + block.getCode(), new OccurancyRule(digester, block));
61 }
62
63 digester.addCallMethod("*/block-occurancy", "normalizeBlockOccurancy", 0, (Class[]) null);
64
65 for (Special special : Special.values())
66 {
67 digester.addRule("*/special-occurancy/" + special.getCode(), new OccurancyRule(digester, special));
68 }
69
70 digester.addCallMethod("*/special-occurancy", "normalizeSpecialOccurancy", 0, (Class[]) null);
71
72 digester.addCallMethod("*/sudden-death/time", "setSuddenDeathTime", 0, new Class[] { Integer.TYPE });
73 digester.addCallMethod("*/sudden-death/message", "setSuddenDeathMessage", 0);
74 digester.addCallMethod("*/sudden-death/delay", "setSuddenDeathDelay", 0, new Class[] { Integer.TYPE });
75 digester.addCallMethod("*/sudden-death/lines-added", "setSuddenDeathLinesAdded", 0, new Class[] { Integer.TYPE });
76
77
78 digester.addObjectCreate("*/channel", "net.jetrix.config.ChannelConfig");
79 digester.addSetNext("*/channel", "addChannel", "net.jetrix.config.ChannelConfig");
80 digester.addCallMethod("*/channel", "setName", 1);
81 digester.addCallParam("*/channel", 0, "name");
82 digester.addRule("*/channel/speed", new Rule(digester) {
83 public void body(String text) throws Exception
84 {
85 getDigester().push(Speed.valueOf(text.toUpperCase()));
86 }
87
88 public void end() throws Exception
89 {
90 getDigester().pop();
91 }
92 });
93 digester.addSetNext("*/channel/speed", "setSpeed");
94 digester.addCallMethod("*/channel/password", "setPassword", 0);
95 digester.addCallMethod("*/channel/access-level", "setAccessLevel", 0, new Class[] {Integer.TYPE});
96 digester.addCallMethod("*/channel/idle", "setIdleAllowed", 0, new Class[] {Boolean.TYPE});
97 digester.addCallMethod("*/channel/visible", "setVisible", 0, new Class[] {Boolean.TYPE});
98 digester.addCallMethod("*/channel/description", "setDescription", 0);
99 digester.addCallMethod("*/channel/topic", "setTopic", 0);
100 digester.addCallMethod("*/channel/max-players", "setMaxPlayers", 0, new Class[] {Integer.TYPE});
101 digester.addCallMethod("*/channel/max-spectators", "setMaxSpectators", 0, new Class[] {Integer.TYPE});
102 digester.addCallMethod("*/channel/winlist", "setWinlistId", 1);
103 digester.addCallParam("*/channel/winlist", 0, "name");
104
105
106 digester.addObjectCreate("*/filter", "net.jetrix.config.FilterConfig");
107 digester.addSetNext("*/filter", "addFilter", "net.jetrix.config.FilterConfig");
108 digester.addCallMethod("*/filter", "setName", 1);
109 digester.addCallParam("*/filter", 0, "name");
110 digester.addCallMethod("*/filter", "setClassname", 1);
111 digester.addCallParam("*/filter", 0, "class");
112 digester.addCallMethod("*/filter/param", "setParameter", 2);
113 digester.addCallParam("*/filter/param", 0, "name");
114 digester.addCallParam("*/filter/param", 1, "value");
115
116
117 digester.addCallMethod("tetrinet-channels/filter-definitions/alias", "addFilterAlias", 2);
118 digester.addCallParam("tetrinet-channels/filter-definitions/alias", 0, "name");
119 digester.addCallParam("tetrinet-channels/filter-definitions/alias", 1, "class");
120
121
122 digester.addObjectCreate("tetrinet-channels/winlists/winlist", "net.jetrix.config.WinlistConfig");
123 digester.addSetNext("tetrinet-channels/winlists/winlist", "addWinlist", "net.jetrix.config.WinlistConfig");
124 digester.addCallMethod("tetrinet-channels/winlists/winlist", "setName", 1);
125 digester.addCallParam("tetrinet-channels/winlists/winlist", 0, "name");
126 digester.addCallMethod("tetrinet-channels/winlists/winlist", "setClassname", 1);
127 digester.addCallParam("tetrinet-channels/winlists/winlist", 0, "class");
128 digester.addCallMethod("tetrinet-channels/winlists/winlist/param", "setParameter", 2);
129 digester.addCallParam("tetrinet-channels/winlists/winlist/param", 0, "name");
130 digester.addCallParam("tetrinet-channels/winlists/winlist/param", 1, "value");
131 }
132
133 /***
134 * Custom rule to set the block and special occurancies.
135 */
136 private class OccurancyRule extends Rule
137 {
138 private Block block;
139 private Special special;
140
141 public OccurancyRule(Digester digester, Block block)
142 {
143 super(digester);
144 this.block = block;
145 }
146
147 public OccurancyRule(Digester digester, Special special)
148 {
149 super(digester);
150 this.special = special;
151 }
152
153 public void body(String body) throws Exception
154 {
155
156 Settings settings = (Settings) digester.peek();
157
158
159 int value = Integer.parseInt(body);
160
161
162 if (special == null)
163 {
164 settings.setOccurancy(block, value);
165 }
166 else
167 {
168 settings.setOccurancy(special, value);
169 }
170 }
171 }
172
173 }