View Javadoc

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          // default game settings
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          // channel settings
44          digester.addObjectCreate("*/channel/settings", "net.jetrix.config.Settings");
45          digester.addSetNext("*/channel/settings", "setSettings", "net.jetrix.config.Settings");
46  
47          // any game settings
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          // channel configuration
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         // filter configuration
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         // filter definitions
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         // winlists
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             // get the settings on the stack
156             Settings settings = (Settings) digester.peek();
157 
158             // get the value of the occurancy
159             int value = Integer.parseInt(body);
160 
161             // set the value
162             if (special == null)
163             {
164                 settings.setOccurancy(block, value);
165             }
166             else
167             {
168                 settings.setOccurancy(special, value);
169             }
170         }
171     }
172 
173 }