46249ef50aa3d10fc5e7120b376ea6565b121519
[mir.git] / source / mir / producer / reader / ProducerConfigReader.java
1 /*\r
2  * Copyright (C) 2001, 2002  The Mir-coders group\r
3  *\r
4  * This file is part of Mir.\r
5  *\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
10  *\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
15  *\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
19  *\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
30  */\r
31 \r
32 package  mir.producer.reader;\r
33 \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
42 \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
49 \r
50 public class ProducerConfigReader {\r
51   private ProducerNodeBuilderLibrary builderLibrary;\r
52   private ProducerNodeBuilderLibrary scriptedNodeBuilderLibrary;\r
53 \r
54   public ProducerConfigReader() {\r
55     super();\r
56   };\r
57 \r
58   public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories) throws ProducerConfigFailure {\r
59     parseFile(aFileName, aBuilderLibrary, aProducerFactories, new Vector());\r
60   }\r
61 \r
62   public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories, List aUsedFiles) throws ProducerConfigFailure {\r
63     try {\r
64       XMLReader reader = new XMLReader();\r
65       aUsedFiles.add(new File(aFileName));\r
66 \r
67       builderLibrary = aBuilderLibrary;\r
68       scriptedNodeBuilderLibrary = new ProducerNodeBuilderLibrary();\r
69 \r
70       reader.parseFile(aFileName, new RootSectionHandler(aProducerFactories));\r
71 \r
72     }\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
77       }\r
78       throw new ProducerConfigFailure( e );\r
79     }\r
80   }\r
81 \r
82 \r
83   public class RootSectionHandler extends XMLReader.AbstractSectionHandler {\r
84     private List producers;\r
85 \r
86     public RootSectionHandler(List aProducers) {\r
87       producers = aProducers;\r
88     }\r
89 \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
93       }\r
94       else\r
95         throw new XMLReader.XMLReaderExc("Tag 'producers' expected, tag '"+aTag+"' found");\r
96     }\r
97 \r
98     public void endElement(XMLReader.SectionHandler aHandler) {\r
99     }\r
100 \r
101     public void finishSection() {\r
102     }\r
103   }\r
104 \r
105 \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
109 \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
113 \r
114   public class ProducersSectionHandler extends XMLReader.AbstractSectionHandler {\r
115     private List producers;\r
116     private Set producerNames;\r
117     private String name;\r
118 \r
119     public ProducersSectionHandler(List aProducers) {\r
120       producers = aProducers;\r
121       producerNames = new HashSet();\r
122     }\r
123 \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
129 \r
130         name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);\r
131         XMLReaderTool.checkValidIdentifier(name);\r
132 \r
133         if (producerNames.contains(name))\r
134           throw new XMLReader.XMLReaderExc("Duplicate producer name: '" +\r
135                                            name + "'");\r
136 \r
137         name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);\r
138 \r
139         return new ProducerSectionHandler(name);\r
140       }\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
145 \r
146         name = (String) anAttributes.get(NODE_DEFINITION_NAME_ATTRIBUTE);\r
147         XMLReaderTool.checkValidIdentifier(name);\r
148 \r
149         name = (String) anAttributes.get(NODE_DEFINITION_NAME_ATTRIBUTE);\r
150 \r
151         return new NodeDefinitionSectionHandler(name);\r
152       }\r
153       throw new XMLReader.XMLReaderExc("Unexpected tag: " + aTag);\r
154     }\r
155 \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
160       }\r
161       else if (aHandler instanceof NodeDefinitionSectionHandler) {\r
162         scriptedNodeBuilderLibrary.registerFactory(name,\r
163             new DefaultProducerNodeBuilders.ScriptedProducerNodeBuilder.factory(\r
164                 ((NodeDefinitionSectionHandler) aHandler).getDefinition()));\r
165       }\r
166       else throw new XMLReader.XMLReaderExc("ProducersSectionHandler.endElement Internal error: Unexpected handler: " + aHandler.getClass().getName());\r
167     }\r
168 \r
169     public void finishSection() {\r
170     }\r
171   }\r
172 \r
173   public class ProducerSectionHandler extends XMLReader.AbstractSectionHandler {\r
174     private ProducerFactory producerFactory;\r
175     private String factoryName;\r
176 \r
177     private ProducerNode body;\r
178     private Map verbNodes;\r
179     private List verbs;\r
180     private String defaultVerb;\r
181 \r
182     public ProducerSectionHandler(String aName) {\r
183       factoryName = aName;\r
184     }\r
185 \r
186     public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {\r
187       if (aTag.equals("verbs")) {\r
188         if (verbs!=null)\r
189           throw new XMLReader.XMLReaderExc("Verbs already processed");\r
190         if (body!=null)\r
191           throw new XMLReader.XMLReaderExc("Verbs should come before body");\r
192         else\r
193           return new ProducerVerbsSectionHandler();\r
194       }\r
195       else if (aTag.equals("body")) {\r
196         if (body==null)\r
197           return new ProducerNodeSectionHandler();\r
198         else\r
199           throw new XMLReader.XMLReaderExc("Body already processed");\r
200       }\r
201       throw new XMLReader.XMLReaderExc("Unexpected tag: '"+aTag+"'");\r
202     }\r
203 \r
204     public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {\r
205       if (aHandler instanceof ProducerNodeSectionHandler) {\r
206         body = ((ProducerNodeSectionHandler) aHandler).getProducerNode();\r
207       }\r
208       else if (aHandler instanceof ProducerVerbsSectionHandler)\r
209       {\r
210         verbs = ((ProducerVerbsSectionHandler) aHandler).getVerbs();\r
211         verbNodes = ((ProducerVerbsSectionHandler) aHandler).getVerbNodes();\r
212         defaultVerb = ((ProducerVerbsSectionHandler) aHandler).getDefaultVerb();\r
213       }\r
214       else throw new XMLReader.XMLReaderExc("ProducerSectionHandler.endElement Internal error: Unexpected handler: " + aHandler.getClass().getName());\r
215     }\r
216 \r
217     public void finishSection() throws XMLReader.XMLReaderExc {\r
218       if (verbs==null)\r
219         throw new XMLReader.XMLReaderExc("No verbs defined");\r
220 \r
221       if (body==null)\r
222         throw new XMLReader.XMLReaderExc("No body defined");\r
223 \r
224       producerFactory = new ScriptedProducerFactory(factoryName, verbs, verbNodes, body, defaultVerb);\r
225     }\r
226 \r
227     public ProducerFactory getProducerFactory() {\r
228       return producerFactory;\r
229     }\r
230   }\r
231 \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
237 \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
244 \r
245     public ProducerVerbsSectionHandler() {\r
246       verbNodes = new HashMap();\r
247       verbs = new Vector();\r
248       defaultVerb = null;\r
249     }\r
250 \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
257 \r
258         XMLReaderTool.checkValidIdentifier(currentVerb);\r
259 \r
260         if (verbNodes.containsKey(currentVerb))\r
261           throw new XMLReader.XMLReaderExc("Duplicate definition of verb '" +\r
262                                            currentVerb + "'");\r
263 \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
267 \r
268           defaultVerb = currentVerb;\r
269         }\r
270 \r
271         if (anAttributes.containsKey(PRODUCER_VERB_DESCRIPTION_ATTRIBUTE))\r
272           currentVerbDescription = (String) anAttributes.get(\r
273               PRODUCER_VERB_DESCRIPTION_ATTRIBUTE);\r
274         else\r
275           currentVerbDescription = "";\r
276 \r
277         return new ProducerNodeSectionHandler();\r
278       }\r
279       else\r
280         throw new XMLReader.XMLReaderExc("Only 'verb' tags allowed here, '" +\r
281                                          aTag + "' encountered.");\r
282     }\r
283 \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
287     }\r
288 \r
289     public void finishSection() {\r
290     }\r
291 \r
292     public String getDefaultVerb() {\r
293       return defaultVerb;\r
294     }\r
295 \r
296     public List getVerbs() {\r
297       return verbs;\r
298     }\r
299 \r
300     public Map getVerbNodes() {\r
301       return verbNodes;\r
302     }\r
303   }\r
304 \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
308     }\r
309 \r
310     public void endElement(XMLReader.SectionHandler aHandler) {\r
311     }\r
312 \r
313     public void finishSection() {\r
314     }\r
315   }\r
316 \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
323 \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
329     }\r
330     public MultiProducerNodeSectionHandler(Set aValidNodeParameters) {\r
331       this("", new HashSet(), aValidNodeParameters);\r
332     }\r
333 \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
341 \r
342       currentNodeParameter = aTag;\r
343 \r
344       return new ProducerNodeSectionHandler(scriptedNodeName, validNodeParameters);\r
345     }\r
346 \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
350       }\r
351       else {\r
352         throw new XMLReader.XMLReaderExc("Internal error: unknown section handler '" + aHandler.getClass().getName() + "'" );\r
353       }\r
354     }\r
355 \r
356     public Map getNodeParameters() {\r
357       return nodeParameters;\r
358     }\r
359 \r
360     public void finishSection() {\r
361     }\r
362   }\r
363 \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
369 \r
370     public ProducerNodeSectionHandler(String aScriptedNodeName, Set anAllowedNodeParameterReferences) {\r
371       producerNode = new CompositeProducerNode();\r
372       scriptedNodeName = aScriptedNodeName;\r
373       allowedNodeParameterReferences = anAllowedNodeParameterReferences;\r
374     }\r
375 \r
376     public ProducerNodeSectionHandler() {\r
377       this("", new HashSet());\r
378     }\r
379 \r
380     public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {\r
381       try {\r
382         if (allowedNodeParameterReferences.contains( (aTag))) {\r
383           if (!anAttributes.isEmpty()) {\r
384             throw new XMLReader.XMLReaderExc("No attributes allowed");\r
385           }\r
386 \r
387           currentBuilder = new DefaultProducerNodeBuilders.\r
388               ScriptedProducerParameterNodeBuilder(scriptedNodeName, aTag);\r
389           return new EmptySectionHandler();\r
390         }\r
391         else if (scriptedNodeBuilderLibrary.hasBuilderForName(aTag) ||\r
392                  builderLibrary.hasBuilderForName( (aTag))) {\r
393 \r
394           if (scriptedNodeBuilderLibrary.hasBuilderForName(aTag))\r
395             currentBuilder = scriptedNodeBuilderLibrary.constructBuilder(aTag);\r
396           else\r
397             currentBuilder = builderLibrary.constructBuilder(aTag);\r
398 \r
399           currentBuilder.setAttributes(anAttributes);\r
400           if (currentBuilder.getAvailableSubNodes().isEmpty()) {\r
401             return new EmptySectionHandler();\r
402           }\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
409           else {\r
410             return new ProducerNodeSectionHandler(scriptedNodeName,\r
411                 allowedNodeParameterReferences);\r
412           }\r
413         }\r
414         else\r
415           throw new XMLReader.XMLReaderExc("Unknown producer node tag: '" +\r
416                                            aTag + "'");\r
417       }\r
418       catch (Throwable t) {\r
419         throw new XMLReader.XMLReaderFailure(t);\r
420       }\r
421     }\r
422 \r
423     public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc  {\r
424       try {\r
425         if (aHandler instanceof ProducerNodeSectionHandler) {\r
426           currentBuilder.setSubNode(\r
427                 (String) (currentBuilder.getAvailableSubNodes().iterator().next()),\r
428                 ((ProducerNodeSectionHandler) aHandler).getProducerNode());\r
429         }\r
430         else if (aHandler instanceof MultiProducerNodeSectionHandler) {\r
431           Iterator i;\r
432           Map nodeParameters;\r
433           Map.Entry entry;\r
434 \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
442           }\r
443         }\r
444         else if (aHandler instanceof EmptySectionHandler) {\r
445           // deliberately empty: nothing expected, so nothing to process\r
446         }\r
447         else {\r
448           throw new XMLReader.XMLReaderExc(\r
449               "Internal error: unknown section handler '" +\r
450               aHandler.getClass().getName() + "'");\r
451         }\r
452 \r
453         producerNode.addSubNode(currentBuilder.constructNode());\r
454         currentBuilder = null;\r
455       }\r
456       catch (Throwable t) {\r
457         throw new XMLReader.XMLReaderFailure(t);\r
458       }\r
459     }\r
460 \r
461     public ProducerNode getProducerNode() {\r
462       if (producerNode.getNrSubNodes()==1) {\r
463         return producerNode.getSubNode(0);\r
464       }\r
465       else {\r
466         return producerNode;\r
467       }\r
468     }\r
469 \r
470     public void finishSection() {\r
471     }\r
472   }\r
473 \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
481 \r
482     public NodeDefinitionSectionHandler(String aName) {\r
483       body = null;\r
484       nodeParameters = null;\r
485       stringParameters = null;\r
486       integerParameters = null;\r
487       name = aName;\r
488     }\r
489 \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
494         }\r
495         if (nodeParameters!=null) {\r
496           throw new XMLReader.XMLReaderExc( "Parameters have already been declared" );\r
497         }\r
498         if (body!=null) {\r
499           throw new XMLReader.XMLReaderExc( "Parameters should come before definition in nodedefinition '" + name +"'" );\r
500         }\r
501 \r
502         return new NodeDefinitionParametersSectionHandler();\r
503       }\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
507 \r
508         return new ProducerNodeSectionHandler(name, nodeParameters.keySet());\r
509       }\r
510       else throw new XMLReader.XMLReaderExc("Only 'definition' or 'parameters' tags allowed here, '" + aTag + "' encountered.");\r
511     }\r
512 \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
518       }\r
519       else if (aHandler instanceof ProducerNodeSectionHandler) {\r
520         body = ((ProducerNodeSectionHandler) aHandler).getProducerNode();\r
521       }\r
522     }\r
523 \r
524     public void finishSection() throws XMLReader.XMLReaderExc {\r
525       Iterator i;\r
526       if (body == null)\r
527         throw new XMLReader.XMLReaderExc( "Definition missing" );\r
528 \r
529       nodeDefinition = new ScriptedProducerNodeDefinition(name);\r
530 \r
531       nodeDefinition.setBody(body);\r
532 \r
533       i = nodeParameters.keySet().iterator();\r
534       while (i.hasNext()) {\r
535         nodeDefinition.addNodeParameter((String) i.next());\r
536       }\r
537 \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
542       }\r
543 \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
548       }\r
549     }\r
550 \r
551     public ScriptedProducerNodeDefinition getDefinition() {\r
552       return nodeDefinition;\r
553     }\r
554   }\r
555 \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
561 \r
562   public class NodeDefinitionParametersSectionHandler extends XMLReader.AbstractSectionHandler {\r
563     private Map nodeParameters;\r
564     private Map stringParameters;\r
565     private Map integerParameters;\r
566 \r
567     public NodeDefinitionParametersSectionHandler() {\r
568       nodeParameters = new HashMap();\r
569       stringParameters = new HashMap();\r
570       integerParameters = new HashMap();\r
571     }\r
572 \r
573     public XMLReader.SectionHandler startElement(String aTag, Map anAttributes) throws XMLReader.XMLReaderExc {\r
574       String parameterName;\r
575       String defaultValue;\r
576 \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
583 \r
584         if (nodeParameters.containsKey(parameterName))\r
585           throw new XMLReader.XMLReaderExc("Duplicate parameter name: '" +\r
586                                            parameterName + "'");\r
587 \r
588         XMLReaderTool.checkValidIdentifier(parameterName);\r
589 \r
590         nodeParameters.put(parameterName, parameterName);\r
591 \r
592         return new EmptySectionHandler();\r
593       }\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
600 \r
601         if (stringParameters.containsKey(parameterName) ||\r
602             integerParameters.containsKey(parameterName))\r
603           throw new XMLReader.XMLReaderExc("Duplicate parameter name: '" +\r
604                                            parameterName + "'");\r
605 \r
606         XMLReaderTool.checkValidIdentifier(parameterName);\r
607 \r
608         defaultValue = (String) anAttributes.get(\r
609             NODE_DEFINITION_PARAMETER_DEFAULTVALUE_ATTRIBUTE);\r
610 \r
611         if (aTag.equals("string"))\r
612           stringParameters.put(parameterName, defaultValue);\r
613         else\r
614           integerParameters.put(parameterName, defaultValue);\r
615 \r
616         return new EmptySectionHandler();\r
617       }\r
618       else\r
619         throw new XMLReader.XMLReaderExc(\r
620             "Only 'string', 'integer' and 'node' tags allowed here, '" + aTag + "' encountered.");\r
621     }\r
622 \r
623     public void endElement(XMLReader.SectionHandler aHandler) {\r
624     }\r
625 \r
626     public void finishSection() {\r
627     }\r
628 \r
629     public Map getNodeParameters() {\r
630       return nodeParameters;\r
631     }\r
632 \r
633     public Map getStringParameters() {\r
634       return stringParameters;\r
635     }\r
636 \r
637     public Map getIntegerParameters() {\r
638       return integerParameters;\r
639     }\r
640   }\r
641 }\r