62a796d67a77e00cb4939afc0c14f49bc32a2e3d
[mir.git] / source / mir / producer / reader / ScriptedProducerNodeDefinition.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License, 
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library 
23  * (or with modified versions of the above that use the same license as the above), 
24  * and distribute linked combinations including the two.  You must obey the 
25  * GNU General Public License in all respects for all of the code used other than 
26  * the above mentioned libraries.  If you modify this file, you may extend this 
27  * exception to your version of the file, but you are not obligated to do so.  
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mir.producer.reader;
31
32 import java.util.HashMap;
33 import java.util.HashSet;
34 import java.util.Iterator;
35 import java.util.Map;
36 import java.util.Set;
37 import java.util.Stack;
38
39 import mir.log.LoggerWrapper;
40 import mir.producer.CompositeProducerNode;
41 import mir.producer.ProducerExc;
42 import mir.producer.ProducerFailure;
43 import mir.producer.ProducerNode;
44
45 public class ScriptedProducerNodeDefinition {
46   private Map integerParameters;               // name -> default value
47   private Map stringParameters;               // name -> default value
48   private Set nodeParameters;
49   private ProducerNode body;
50   private String name;
51
52   public static String SCRIPTED_PRODUCERNODE_RUNTIMEDATA_KEY = "$SCRIPTRUNTIMEDATA";
53   public static String SCRIPTED_PRODUCERNODE_RUNTIMESTACK_KEY = "stack";
54
55   public ScriptedProducerNodeDefinition(String aName) {
56     name = aName;
57     integerParameters = new HashMap();
58     stringParameters = new HashMap();
59     nodeParameters = new HashSet();
60     body = new CompositeProducerNode();
61   }
62
63   public void addStringParameter(String aName, String aDefaultValue) {
64     stringParameters.put(aName, aDefaultValue);
65   }
66
67   public void addIntegerParameter(String aName, String aDefaultValue) {
68     integerParameters.put(aName, aDefaultValue);
69   }
70
71   public void addNodeParameter(String aName) {
72     nodeParameters.add(aName);
73   }
74
75   public void setBody(ProducerNode aBody) {
76     body = aBody;
77   }
78
79   protected Map getStringParameters() {
80     return stringParameters;
81   }
82
83   protected Map getIntegerParameters() {
84     return integerParameters;
85   }
86
87   protected Set getNodeParameters() {
88     return nodeParameters;
89   }
90
91   protected ProducerNode getBody() {
92     return body;
93   }
94
95   public String getName() {
96     return name;
97   }
98
99   public Set getRequiredAttributes() {
100     return getAttributesSelection(true);
101   }
102
103   public Set getOptionalAttributes() {
104     return getAttributesSelection(false);
105   }
106
107   public Set getAttributesSelection(boolean aRequired) {
108     Set result = new HashSet();
109     Iterator i = stringParameters.entrySet().iterator();
110
111     while (i.hasNext()) {
112       Map.Entry entry = (Map.Entry) i.next();
113
114       if ((entry.getValue() == null) == aRequired ) {
115         result.add(entry.getKey());
116       }
117     }
118
119     i = integerParameters.entrySet().iterator();
120
121     while (i.hasNext()) {
122       Map.Entry entry = (Map.Entry) i.next();
123
124       if ((entry.getValue() == null) == aRequired ) {
125         result.add(entry.getKey());
126       }
127     }
128
129     return result;
130   }
131
132
133   protected static class NodeParameterProducerNode implements ProducerNode {
134     private String parameterName;
135     private String definitionName;
136
137     public NodeParameterProducerNode(String aDefinitionName, String aParameterName) {
138       definitionName = aDefinitionName;
139       parameterName = aParameterName;
140     }
141
142     public void produce(Map aValues, String aVerb, LoggerWrapper aLogger) throws ProducerExc, ProducerFailure {
143       ProducerNode producerNode;
144
145       Map runTimeData = (Map) ((Map) aValues.get(SCRIPTED_PRODUCERNODE_RUNTIMEDATA_KEY)).get(definitionName);
146       Map parameters = (Map) ((Stack) runTimeData.get( SCRIPTED_PRODUCERNODE_RUNTIMESTACK_KEY )).peek();
147
148       producerNode = (ProducerNode) parameters.get(parameterName);
149
150       if (producerNode != null)
151         producerNode.produce(aValues, aVerb, aLogger);
152     }
153
154     public Set buildVerbSet() {
155       return new HashSet();
156     }
157   }
158 }