2 * Copyright (C) 2001, 2002 The Mir-coders group
\r
4 * This file is part of Mir.
\r
6 * Mir is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either version 2 of the License, or
\r
9 * (at your option) any later version.
\r
11 * Mir is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with Mir; if not, write to the Free Software
\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
20 * In addition, as a special exception, The Mir-coders gives permission to link
\r
21 * the code of this program with the com.oreilly.servlet library, any library
\r
22 * licensed under the Apache Software License, The Sun (tm) Java Advanced
\r
23 * Imaging library (JAI), The Sun JIMI library (or with modified versions of
\r
24 * the above that use the same license as the above), and distribute linked
\r
25 * combinations including the two. You must obey the GNU General Public
\r
26 * License in all respects for all of the code used other than the above
\r
27 * mentioned libraries. If you modify this file, you may extend this exception
\r
28 * to your version of the file, but you are not obligated to do so. If you do
\r
29 * not wish to do so, delete this exception statement from your version.
\r
32 package mir.producer.reader;
\r
34 import java.io.File;
\r
35 import java.util.HashMap;
\r
36 import java.util.HashSet;
\r
37 import java.util.Iterator;
\r
38 import java.util.List;
\r
39 import java.util.Map;
\r
40 import java.util.Set;
\r
41 import java.util.Vector;
\r
43 import mir.producer.CompositeProducerNode;
\r
44 import mir.producer.ProducerFactory;
\r
45 import mir.producer.ProducerNode;
\r
46 import mir.producer.SimpleProducerVerb;
\r
47 import mir.util.XMLReader;
\r
48 import mir.util.XMLReaderTool;
\r
50 public class ProducerConfigReader {
\r
51 private ProducerNodeBuilderLibrary builderLibrary;
\r
52 private ProducerNodeBuilderLibrary scriptedNodeBuilderLibrary;
\r
54 public ProducerConfigReader() {
\r
58 public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories) throws ProducerConfigFailure {
\r
59 parseFile(aFileName, aBuilderLibrary, aProducerFactories, new Vector());
\r
62 public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories, List aUsedFiles) throws ProducerConfigFailure {
\r
64 XMLReader reader = new XMLReader();
\r
65 aUsedFiles.add(new File(aFileName));
\r
67 builderLibrary = aBuilderLibrary;
\r
68 scriptedNodeBuilderLibrary = new ProducerNodeBuilderLibrary();
\r
70 reader.parseFile(aFileName, new RootSectionHandler(aProducerFactories));
\r
73 catch (Throwable e) {
\r
74 if ((e instanceof XMLReader.XMLReaderExc) && ((XMLReader.XMLReaderExc) e).getHasLocation()) {
\r
75 XMLReader.XMLReaderExc f = (XMLReader.XMLReaderExc) e;
\r
76 throw new ProducerConfigFailure("'" + f.getMessage()+"' in " + f.getFilename()+"(line " + f.getLineNr()+", column " + f.getColumnNr() + ")", e);
\r
78 throw new ProducerConfigFailure( e );
\r
83 public class RootSectionHandler extends XMLReader.AbstractSectionHandler {
\r
84 private List producers;
\r
86 public RootSectionHandler(List aProducers) {
\r
87 producers = aProducers;
\r
90 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
91 if (aTag.equals("producers")) {
\r
92 return new ProducersSectionHandler(producers);
\r
95 throw new XMLReader.XMLReaderExc("Tag 'producers' expected, tag '"+aTag+"' found");
\r
98 public void endElement(XMLReader.SectionHandler aHandler) {
\r
101 public void finishSection() {
\r
106 private final static String PRODUCER_NAME_ATTRIBUTE = "name";
\r
107 private final static String[] PRODUCER_REQUIRED_ATTRIBUTES = { PRODUCER_NAME_ATTRIBUTE };
\r
108 private final static String[] PRODUCER_OPTIONAL_ATTRIBUTES = { };
\r
110 private final static String NODE_DEFINITION_NAME_ATTRIBUTE = "name";
\r
111 private final static String[] NODE_DEFINITION_REQUIRED_ATTRIBUTES = { NODE_DEFINITION_NAME_ATTRIBUTE };
\r
112 private final static String[] NODE_DEFINITION_OPTIONAL_ATTRIBUTES = { };
\r
114 public class ProducersSectionHandler extends XMLReader.AbstractSectionHandler {
\r
115 private List producers;
\r
116 private Set producerNames;
\r
117 private String name;
\r
119 public ProducersSectionHandler(List aProducers) {
\r
120 producers = aProducers;
\r
121 producerNames = new HashSet();
\r
124 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
125 if (aTag.equals("producer")) {
\r
126 XMLReaderTool.checkAttributes(anAttributes,
\r
127 PRODUCER_REQUIRED_ATTRIBUTES,
\r
128 PRODUCER_OPTIONAL_ATTRIBUTES);
\r
130 name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);
\r
131 XMLReaderTool.checkValidIdentifier(name);
\r
133 if (producerNames.contains(name))
\r
134 throw new XMLReader.XMLReaderExc("Duplicate producer name: '" +
\r
137 name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);
\r
139 return new ProducerSectionHandler(name);
\r
141 else if (aTag.equals("nodedefinition")) {
\r
142 XMLReaderTool.checkAttributes(anAttributes,
\r
143 NODE_DEFINITION_REQUIRED_ATTRIBUTES,
\r
144 NODE_DEFINITION_OPTIONAL_ATTRIBUTES);
\r
146 name = (String) anAttributes.get(NODE_DEFINITION_NAME_ATTRIBUTE);
\r
147 XMLReaderTool.checkValidIdentifier(name);
\r
149 name = (String) anAttributes.get(NODE_DEFINITION_NAME_ATTRIBUTE);
\r
151 return new NodeDefinitionSectionHandler(name);
\r
153 throw new XMLReader.XMLReaderExc("Unexpected tag: " + aTag);
\r
156 public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {
\r
157 if (aHandler instanceof ProducerSectionHandler) {
\r
158 producers.add(((ProducerSectionHandler) aHandler).getProducerFactory());
\r
159 producerNames.add(((ProducerSectionHandler) aHandler).getProducerFactory().getName());
\r
161 else if (aHandler instanceof NodeDefinitionSectionHandler) {
\r
162 scriptedNodeBuilderLibrary.registerFactory(name,
\r
163 new DefaultProducerNodeBuilders.ScriptedProducerNodeBuilder.factory(
\r
164 ((NodeDefinitionSectionHandler) aHandler).getDefinition()));
\r
166 else throw new XMLReader.XMLReaderExc("ProducersSectionHandler.endElement Internal error: Unexpected handler: " + aHandler.getClass().getName());
\r
169 public void finishSection() {
\r
173 public class ProducerSectionHandler extends XMLReader.AbstractSectionHandler {
\r
174 private ProducerFactory producerFactory;
\r
175 private String factoryName;
\r
177 private ProducerNode body;
\r
178 private Map verbNodes;
\r
179 private List verbs;
\r
180 private String defaultVerb;
\r
182 public ProducerSectionHandler(String aName) {
\r
183 factoryName = aName;
\r
186 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
187 if (aTag.equals("verbs")) {
\r
189 throw new XMLReader.XMLReaderExc("Verbs already processed");
\r
191 throw new XMLReader.XMLReaderExc("Verbs should come before body");
\r
193 return new ProducerVerbsSectionHandler();
\r
195 else if (aTag.equals("body")) {
\r
197 return new ProducerNodeSectionHandler();
\r
199 throw new XMLReader.XMLReaderExc("Body already processed");
\r
201 throw new XMLReader.XMLReaderExc("Unexpected tag: '"+aTag+"'");
\r
204 public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {
\r
205 if (aHandler instanceof ProducerNodeSectionHandler) {
\r
206 body = ((ProducerNodeSectionHandler) aHandler).getProducerNode();
\r
208 else if (aHandler instanceof ProducerVerbsSectionHandler)
\r
210 verbs = ((ProducerVerbsSectionHandler) aHandler).getVerbs();
\r
211 verbNodes = ((ProducerVerbsSectionHandler) aHandler).getVerbNodes();
\r
212 defaultVerb = ((ProducerVerbsSectionHandler) aHandler).getDefaultVerb();
\r
214 else throw new XMLReader.XMLReaderExc("ProducerSectionHandler.endElement Internal error: Unexpected handler: " + aHandler.getClass().getName());
\r
217 public void finishSection() throws XMLReader.XMLReaderExc {
\r
219 throw new XMLReader.XMLReaderExc("No verbs defined");
\r
222 throw new XMLReader.XMLReaderExc("No body defined");
\r
224 producerFactory = new ScriptedProducerFactory(factoryName, verbs, verbNodes, body, defaultVerb);
\r
227 public ProducerFactory getProducerFactory() {
\r
228 return producerFactory;
\r
232 private final static String PRODUCER_VERB_NAME_ATTRIBUTE = "name";
\r
233 private final static String PRODUCER_VERB_DESCRIPTION_ATTRIBUTE = "description";
\r
234 private final static String PRODUCER_VERB_DEFAULT_ATTRIBUTE = "default";
\r
235 private final static String[] PRODUCER_VERB_REQUIRED_ATTRIBUTES = { PRODUCER_VERB_NAME_ATTRIBUTE };
\r
236 private final static String[] PRODUCER_VERB_OPTIONAL_ATTRIBUTES = { PRODUCER_VERB_DEFAULT_ATTRIBUTE, PRODUCER_VERB_DESCRIPTION_ATTRIBUTE };
\r
238 public class ProducerVerbsSectionHandler extends XMLReader.AbstractSectionHandler {
\r
239 private Map verbNodes;
\r
240 private List verbs;
\r
241 private String defaultVerb;
\r
242 private String currentVerb;
\r
243 private String currentVerbDescription;
\r
245 public ProducerVerbsSectionHandler() {
\r
246 verbNodes = new HashMap();
\r
247 verbs = new Vector();
\r
248 defaultVerb = null;
\r
251 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
252 if (aTag.equals("verb")) {
\r
253 XMLReaderTool.checkAttributes(anAttributes,
\r
254 PRODUCER_VERB_REQUIRED_ATTRIBUTES,
\r
255 PRODUCER_VERB_OPTIONAL_ATTRIBUTES);
\r
256 currentVerb = (String) anAttributes.get(PRODUCER_VERB_NAME_ATTRIBUTE);
\r
258 XMLReaderTool.checkValidIdentifier(currentVerb);
\r
260 if (verbNodes.containsKey(currentVerb))
\r
261 throw new XMLReader.XMLReaderExc("Duplicate definition of verb '" +
\r
262 currentVerb + "'");
\r
264 if (anAttributes.containsKey(PRODUCER_VERB_DEFAULT_ATTRIBUTE)) {
\r
265 if (defaultVerb != null)
\r
266 throw new XMLReader.XMLReaderExc("Default verb already declared");
\r
268 defaultVerb = currentVerb;
\r
271 if (anAttributes.containsKey(PRODUCER_VERB_DESCRIPTION_ATTRIBUTE))
\r
272 currentVerbDescription = (String) anAttributes.get(
\r
273 PRODUCER_VERB_DESCRIPTION_ATTRIBUTE);
\r
275 currentVerbDescription = "";
\r
277 return new ProducerNodeSectionHandler();
\r
280 throw new XMLReader.XMLReaderExc("Only 'verb' tags allowed here, '" +
\r
281 aTag + "' encountered.");
\r
284 public void endElement(XMLReader.SectionHandler aHandler) {
\r
285 verbNodes.put(currentVerb, ((ProducerNodeSectionHandler) aHandler).getProducerNode());
\r
286 verbs.add(new SimpleProducerVerb(currentVerb, currentVerbDescription));
\r
289 public void finishSection() {
\r
292 public String getDefaultVerb() {
\r
293 return defaultVerb;
\r
296 public List getVerbs() {
\r
300 public Map getVerbNodes() {
\r
305 public class EmptySectionHandler extends XMLReader.AbstractSectionHandler {
\r
306 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
307 throw new XMLReader.XMLReaderExc("No tags are allowed here");
\r
310 public void endElement(XMLReader.SectionHandler aHandler) {
\r
313 public void finishSection() {
\r
317 public class MultiProducerNodeSectionHandler extends XMLReader.AbstractSectionHandler {
\r
318 private Map nodeParameters;
\r
319 private Set validNodeParameters;
\r
320 private String currentNodeParameter;
\r
321 private String scriptedNodeName;
\r
322 private Set allowedNodeParameterReferences;
\r
324 public MultiProducerNodeSectionHandler(String aScriptedNodeName, Set anAllowedNodeParameterReferences, Set aValidNodeParameters) {
\r
325 allowedNodeParameterReferences = anAllowedNodeParameterReferences;
\r
326 scriptedNodeName = aScriptedNodeName;
\r
327 validNodeParameters = aValidNodeParameters;
\r
328 nodeParameters = new HashMap();
\r
330 public MultiProducerNodeSectionHandler(Set aValidNodeParameters) {
\r
331 this("", new HashSet(), aValidNodeParameters);
\r
334 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
335 if (!validNodeParameters.contains(aTag))
\r
336 throw new XMLReader.XMLReaderExc("Invalid node parameter: '" + aTag + "'");
\r
337 else if (nodeParameters.containsKey(aTag))
\r
338 throw new XMLReader.XMLReaderExc("Node parameter: '" + aTag + "' already specified");
\r
339 else if (anAttributes.size()>0)
\r
340 throw new XMLReader.XMLReaderExc("No parameters are allowed here");
\r
342 currentNodeParameter = aTag;
\r
344 return new ProducerNodeSectionHandler(scriptedNodeName, validNodeParameters);
\r
347 public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {
\r
348 if (aHandler instanceof ProducerNodeSectionHandler) {
\r
349 nodeParameters.put(currentNodeParameter, ((ProducerNodeSectionHandler) aHandler).getProducerNode());
\r
352 throw new XMLReader.XMLReaderExc("Internal error: unknown section handler '" + aHandler.getClass().getName() + "'" );
\r
356 public Map getNodeParameters() {
\r
357 return nodeParameters;
\r
360 public void finishSection() {
\r
364 public class ProducerNodeSectionHandler extends XMLReader.AbstractSectionHandler {
\r
365 private CompositeProducerNode producerNode;
\r
366 private ProducerNodeBuilder currentBuilder;
\r
367 private String scriptedNodeName;
\r
368 private Set allowedNodeParameterReferences;
\r
370 public ProducerNodeSectionHandler(String aScriptedNodeName, Set anAllowedNodeParameterReferences) {
\r
371 producerNode = new CompositeProducerNode();
\r
372 scriptedNodeName = aScriptedNodeName;
\r
373 allowedNodeParameterReferences = anAllowedNodeParameterReferences;
\r
376 public ProducerNodeSectionHandler() {
\r
377 this("", new HashSet());
\r
380 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
382 if (allowedNodeParameterReferences.contains( (aTag))) {
\r
383 if (!anAttributes.isEmpty()) {
\r
384 throw new XMLReader.XMLReaderExc("No attributes allowed");
\r
387 currentBuilder = new DefaultProducerNodeBuilders.
\r
388 ScriptedProducerParameterNodeBuilder(scriptedNodeName, aTag);
\r
389 return new EmptySectionHandler();
\r
391 else if (scriptedNodeBuilderLibrary.hasBuilderForName(aTag) ||
\r
392 builderLibrary.hasBuilderForName( (aTag))) {
\r
394 if (scriptedNodeBuilderLibrary.hasBuilderForName(aTag))
\r
395 currentBuilder = scriptedNodeBuilderLibrary.constructBuilder(aTag);
\r
397 currentBuilder = builderLibrary.constructBuilder(aTag);
\r
399 currentBuilder.setAttributes(anAttributes);
\r
400 if (currentBuilder.getAvailableSubNodes().isEmpty()) {
\r
401 return new EmptySectionHandler();
\r
403 if (currentBuilder.getAvailableSubNodes().size() > 1)
\r
404 return new MultiProducerNodeSectionHandler(scriptedNodeName,
\r
405 allowedNodeParameterReferences,
\r
406 currentBuilder.getAvailableSubNodes());
\r
407 else if (currentBuilder.getAvailableSubNodes().size() < 1)
\r
408 return new EmptySectionHandler();
\r
410 return new ProducerNodeSectionHandler(scriptedNodeName,
\r
411 allowedNodeParameterReferences);
\r
415 throw new XMLReader.XMLReaderExc("Unknown producer node tag: '" +
\r
418 catch (Throwable t) {
\r
419 throw new XMLReader.XMLReaderFailure(t);
\r
423 public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {
\r
425 if (aHandler instanceof ProducerNodeSectionHandler) {
\r
426 currentBuilder.setSubNode(
\r
427 (String) (currentBuilder.getAvailableSubNodes().iterator().next()),
\r
428 ((ProducerNodeSectionHandler) aHandler).getProducerNode());
\r
430 else if (aHandler instanceof MultiProducerNodeSectionHandler) {
\r
432 Map nodeParameters;
\r
435 nodeParameters = ( (MultiProducerNodeSectionHandler) aHandler).
\r
436 getNodeParameters();
\r
437 i = nodeParameters.entrySet().iterator();
\r
438 while (i.hasNext()) {
\r
439 entry = (Map.Entry) i.next();
\r
440 currentBuilder.setSubNode( (String) entry.getKey(),
\r
441 (ProducerNode) entry.getValue());
\r
444 else if (aHandler instanceof EmptySectionHandler) {
\r
445 // deliberately empty: nothing expected, so nothing to process
\r
448 throw new XMLReader.XMLReaderExc(
\r
449 "Internal error: unknown section handler '" +
\r
450 aHandler.getClass().getName() + "'");
\r
453 producerNode.addSubNode(currentBuilder.constructNode());
\r
454 currentBuilder = null;
\r
456 catch (Throwable t) {
\r
457 throw new XMLReader.XMLReaderFailure(t);
\r
461 public ProducerNode getProducerNode() {
\r
462 if (producerNode.getNrSubNodes()==1) {
\r
463 return producerNode.getSubNode(0);
\r
466 return producerNode;
\r
470 public void finishSection() {
\r
474 public class NodeDefinitionSectionHandler extends XMLReader.AbstractSectionHandler {
\r
475 private ScriptedProducerNodeDefinition nodeDefinition;
\r
476 private ProducerNode body;
\r
477 private Map stringParameters;
\r
478 private Map integerParameters;
\r
479 private Map nodeParameters;
\r
480 private String name;
\r
482 public NodeDefinitionSectionHandler(String aName) {
\r
484 nodeParameters = null;
\r
485 stringParameters = null;
\r
486 integerParameters = null;
\r
490 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
491 if (aTag.equals("parameters")) {
\r
492 if (!anAttributes.isEmpty()) {
\r
493 throw new XMLReader.XMLReaderExc( "No attributes allowed for tag 'parameters'" );
\r
495 if (nodeParameters!=null) {
\r
496 throw new XMLReader.XMLReaderExc( "Parameters have already been declared" );
\r
499 throw new XMLReader.XMLReaderExc( "Parameters should come before definition in nodedefinition '" + name +"'" );
\r
502 return new NodeDefinitionParametersSectionHandler();
\r
504 else if (aTag.equals("definition")) {
\r
505 if (nodeParameters==null)
\r
506 throw new XMLReader.XMLReaderExc( "Parameters should come before definition in nodedefinition '" + name +"'" );
\r
508 return new ProducerNodeSectionHandler(name, nodeParameters.keySet());
\r
510 else throw new XMLReader.XMLReaderExc("Only 'definition' or 'parameters' tags allowed here, '" + aTag + "' encountered.");
\r
513 public void endElement(XMLReader.SectionHandler aHandler) {
\r
514 if (aHandler instanceof NodeDefinitionParametersSectionHandler) {
\r
515 stringParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getStringParameters();
\r
516 integerParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getIntegerParameters();
\r
517 nodeParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getNodeParameters();
\r
519 else if (aHandler instanceof ProducerNodeSectionHandler) {
\r
520 body = ((ProducerNodeSectionHandler) aHandler).getProducerNode();
\r
524 public void finishSection() throws XMLReader.XMLReaderExc {
\r
527 throw new XMLReader.XMLReaderExc( "Definition missing" );
\r
529 nodeDefinition = new ScriptedProducerNodeDefinition(name);
\r
531 nodeDefinition.setBody(body);
\r
533 i = nodeParameters.keySet().iterator();
\r
534 while (i.hasNext()) {
\r
535 nodeDefinition.addNodeParameter((String) i.next());
\r
538 i = stringParameters.entrySet().iterator();
\r
539 while (i.hasNext()) {
\r
540 Map.Entry entry = (Map.Entry) i.next();
\r
541 nodeDefinition.addStringParameter((String) entry.getKey(), (String) entry.getValue());
\r
544 i = integerParameters.entrySet().iterator();
\r
545 while (i.hasNext()) {
\r
546 Map.Entry entry = (Map.Entry) i.next();
\r
547 nodeDefinition.addIntegerParameter((String) entry.getKey(), (String) entry.getValue());
\r
551 public ScriptedProducerNodeDefinition getDefinition() {
\r
552 return nodeDefinition;
\r
556 private final static String NODE_DEFINITION_PARAMETER_NAME_ATTRIBUTE = "name";
\r
557 private final static String NODE_DEFINITION_PARAMETER_DEFAULTVALUE_ATTRIBUTE = "defaultvalue";
\r
558 private final static String[] NODE_DEFINITION_PARAMETER_REQUIRED_ATTRIBUTES = { NODE_DEFINITION_PARAMETER_NAME_ATTRIBUTE };
\r
559 private final static String[] NODE_DEFINITION_PARAMETER_OPTIONAL_ATTRIBUTES = { NODE_DEFINITION_PARAMETER_DEFAULTVALUE_ATTRIBUTE };
\r
560 private final static String[] NODE_DEFINITION_NODE_PARAMETER_OPTIONAL_ATTRIBUTES = { };
\r
562 public class NodeDefinitionParametersSectionHandler extends XMLReader.AbstractSectionHandler {
\r
563 private Map nodeParameters;
\r
564 private Map stringParameters;
\r
565 private Map integerParameters;
\r
567 public NodeDefinitionParametersSectionHandler() {
\r
568 nodeParameters = new HashMap();
\r
569 stringParameters = new HashMap();
\r
570 integerParameters = new HashMap();
\r
573 public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {
\r
574 String parameterName;
\r
575 String defaultValue;
\r
577 if (aTag.equals("node")) {
\r
578 XMLReaderTool.checkAttributes(anAttributes,
\r
579 NODE_DEFINITION_PARAMETER_REQUIRED_ATTRIBUTES,
\r
580 NODE_DEFINITION_NODE_PARAMETER_OPTIONAL_ATTRIBUTES);
\r
581 parameterName = (String) anAttributes.get(
\r
582 NODE_DEFINITION_PARAMETER_NAME_ATTRIBUTE);
\r
584 if (nodeParameters.containsKey(parameterName))
\r
585 throw new XMLReader.XMLReaderExc("Duplicate parameter name: '" +
\r
586 parameterName + "'");
\r
588 XMLReaderTool.checkValidIdentifier(parameterName);
\r
590 nodeParameters.put(parameterName, parameterName);
\r
592 return new EmptySectionHandler();
\r
594 else if (aTag.equals("string") || aTag.equals("integer")) {
\r
595 XMLReaderTool.checkAttributes(anAttributes,
\r
596 NODE_DEFINITION_PARAMETER_REQUIRED_ATTRIBUTES,
\r
597 NODE_DEFINITION_PARAMETER_OPTIONAL_ATTRIBUTES);
\r
598 parameterName = (String) anAttributes.get(
\r
599 NODE_DEFINITION_PARAMETER_NAME_ATTRIBUTE);
\r
601 if (stringParameters.containsKey(parameterName) ||
\r
602 integerParameters.containsKey(parameterName))
\r
603 throw new XMLReader.XMLReaderExc("Duplicate parameter name: '" +
\r
604 parameterName + "'");
\r
606 XMLReaderTool.checkValidIdentifier(parameterName);
\r
608 defaultValue = (String) anAttributes.get(
\r
609 NODE_DEFINITION_PARAMETER_DEFAULTVALUE_ATTRIBUTE);
\r
611 if (aTag.equals("string"))
\r
612 stringParameters.put(parameterName, defaultValue);
\r
614 integerParameters.put(parameterName, defaultValue);
\r
616 return new EmptySectionHandler();
\r
619 throw new XMLReader.XMLReaderExc(
\r
620 "Only 'string', 'integer' and 'node' tags allowed here, '" + aTag + "' encountered.");
\r
623 public void endElement(XMLReader.SectionHandler aHandler) {
\r
626 public void finishSection() {
\r
629 public Map getNodeParameters() {
\r
630 return nodeParameters;
\r
633 public Map getStringParameters() {
\r
634 return stringParameters;
\r
637 public Map getIntegerParameters() {
\r
638 return integerParameters;
\r