producer XML configuration support: Producers can be set up using an XML input
[mir.git] / source / mir / producer / reader / ScriptedProducerNodeDefinition.java
1 package mir.producer.reader;
2
3 import java.util.*;
4 import java.io.*;
5 import mir.producer.*;
6
7 public class ScriptedProducerNodeDefinition {
8   private Map parameters;               // name -> default value
9   private Set nodeParameters;
10   private ProducerNode body;
11   private String name;
12
13   public static String SCRIPTED_PRODUCERNODE_RUNTIMEDATA_KEY = "$SCRIPTRUNTIMEDATA";
14   public static String SCRIPTED_PRODUCERNODE_RUNTIMESTACK_KEY = "stack";
15
16   public ScriptedProducerNodeDefinition(String aName) {
17     name = aName;
18     parameters = new HashMap();
19     nodeParameters = new HashSet();
20     body = new CompositeProducerNode();
21   }
22
23   public void addParameter(String aName, String aDefaultValue) {
24     parameters.put(aName, aDefaultValue);
25   }
26
27   public void addNodeParameter(String aName) {
28     nodeParameters.add(aName);
29   }
30
31   public void setBody(ProducerNode aBody) {
32     body = aBody;
33   }
34
35   protected Map getParameters() {
36     return parameters;
37   }
38
39   protected Set getNodeParameters() {
40     return nodeParameters;
41   }
42
43   protected ProducerNode getBody() {
44     return body;
45   }
46
47   public String getName() {
48     return name;
49   }
50
51   public Set getRequiredAttributes() {
52     return getAttributesSelection(true);
53   }
54
55   public Set getOptionalAttributes() {
56     return getAttributesSelection(false);
57   }
58
59   public Set getAttributesSelection(boolean aRequired) {
60     Set result = new HashSet();
61     Iterator i = parameters.entrySet().iterator();
62
63     while (i.hasNext()) {
64       Map.Entry entry = (Map.Entry) i.next();
65
66       if (entry.getValue() == null && aRequired ) {
67         result.add(entry.getKey());
68       }
69     }
70
71     return result;
72   }
73
74
75   protected static class NodeParameterProducerNode implements ProducerNode {
76     private String parameterName;
77     private String definitionName;
78
79     public NodeParameterProducerNode(String aDefinitionName, String aParameterName) {
80       definitionName = aDefinitionName;
81       parameterName = aParameterName;
82     }
83
84     public void produce(Map aValues, String aVerb, PrintWriter aLogger) throws ProducerExc, ProducerFailure {
85       ProducerNode producerNode;
86
87       Map runTimeData = (Map) ((Map) aValues.get(SCRIPTED_PRODUCERNODE_RUNTIMEDATA_KEY)).get(definitionName);
88       Map parameters = (Map) ((Stack) runTimeData.get( SCRIPTED_PRODUCERNODE_RUNTIMESTACK_KEY )).peek();
89
90       producerNode = (ProducerNode) parameters.get(parameterName);
91
92       if (producerNode != null)
93         producerNode.produce(aValues, aVerb, aLogger);
94     }
95
96     public Set buildVerbSet() {
97       return new HashSet();
98     }
99   }
100 }