| ParameterList.java |
1 /*
2 * ParameterList.java
3 *
4 * Copyright (c) 1998-2004, The University of Sheffield.
5 *
6 * This file is part of GATE (see http://gate.ac.uk/), and is free
7 * software, licenced under the GNU Library General Public License,
8 * Version 2, June 1991 (in the distribution as file licence.html,
9 * and also available at http://gate.ac.uk/gate/licence.html).
10 *
11 * Hamish Cunningham, 15/Nov/2000
12 *
13 * $Id: ParameterList.java,v 1.6 2004/07/21 17:10:03 akshay Exp $
14 */
15
16 package gate.creole;
17
18 import java.io.Serializable;
19 import java.util.*;
20
21 import gate.Factory;
22 import gate.FeatureMap;
23 import gate.util.Out;
24 import gate.util.Strings;
25
26 /** Models resource parameters lists as described in their
27 * <TT>creole.xml</TT> metadata. Parameters are stored as lists
28 * of disjunctions (<TT>OR'd</TT> sets in the metadata).
29 */
30 public class ParameterList implements Serializable
31 {
32 /** Debug flag */
33 private static final boolean DEBUG = false;
34
35 /** The runtime parameters */
36 protected List runtimeParameters = new ArrayList();
37
38 /** Get the list of runtime parameters
39 * (as a list of parameter disjunctions).
40 */
41 public List getRuntimeParameters() {
42 return runtimeParameters;
43 } // getRuntimeParameters()
44
45 /** The initialisation time parameters */
46 protected List initimeParameters = new ArrayList();
47
48 /** Get the list of initialisation-time parameters
49 * (as a list of parameter disjunctions).
50 */
51 public List getInitimeParameters() {
52 return initimeParameters;
53 } // getInitimeParameters()
54
55 /** Add a parameter disjunction.
56 * It is assumed that the parameters in a disjunction are all runtime
57 * or all init-time, never a mix of the two.
58 * @exception NoSuchElementException disjunction has no more elements.
59 */
60 public boolean add(List disjunction) {
61 boolean status = false;
62 Iterator iter = disjunction.iterator();
63 Parameter param = (Parameter) iter.next();
64
65 if(param.isRuntime()) {
66 status = runtimeParameters.add(disjunction);
67 } else {
68 status = initimeParameters.add(disjunction);
69 }
70
71 return status;
72 } // add(param)
73
74 /** Add all the members of a parameter list (as individual disjunctions) */
75 public boolean addAll(List c) {
76 boolean status = false;
77 Iterator iter = c.iterator();
78 while(iter.hasNext()) {
79 List disj = new ArrayList();
80 Parameter param = (Parameter) iter.next();
81 disj.add(param);
82 status = add(disj);
83 }
84
85 return status;
86 } // addAll(Collection)
87
88 /** Get default runtime parameter value set.
89 * Calls <TT>getDefaults(List)</TT>.
90 * @see #getDefaults(List)
91 */
92 public FeatureMap getRuntimeDefaults() throws ParameterException {
93 return getDefaults(runtimeParameters);
94 } // getRuntimeDefaults()
95
96 /** Get default initime parameter value set.
97 * Calls <TT>getDefaults(List)</TT>.
98 * @see #getDefaults(List)
99 */
100 public FeatureMap getInitimeDefaults() throws ParameterException {
101 return getDefaults(initimeParameters);
102 } // getInitimeDefaults()
103
104 /** Get default parameter value set. Where more than one default
105 * is possible amongst disjunctive parameters, only the first will be set.
106 * To check if the default set is comprehensive,
107 * use <TT>isFullyDefaulted()</TT>.
108 * @see #isFullyDefaulted()
109 */
110 public FeatureMap getDefaults(List parameters) throws ParameterException {
111 FeatureMap defaults = Factory.newFeatureMap();
112
113 // each element of the parameters list is a list of (disjunctive) params
114 Iterator disjIter = parameters.iterator();
115
116 // for each parameter disjunction in parameters
117 disjIterLoop:
118 while(disjIter.hasNext()) {
119 boolean optional = false; // were any of this disj optional?
120
121 // get an iterator for this disjunction of parameters
122 List paramDisj = (List) disjIter.next();
123 Iterator paramsIter = paramDisj.iterator();
124
125 // for each parameter in the disjunction
126 while(paramsIter.hasNext()) {
127 Parameter param = (Parameter) paramsIter.next();
128 if(DEBUG) Out.prln("Examining " + param);
129 if(!optional)
130 optional = param.isOptional();
131
132 // try and find a default value
133 Object defaultValue = param.calculateDefaultValue();
134
135 // no default found
136 if(defaultValue == null) {
137 // if none of this disj were optional, and we're the last, then
138 // we've got at least one non-optional param unset
139 if(!optional && !paramsIter.hasNext()) {
140 fullyDefaulted = false;
141 }
142
143 // valid default found - set it and continue with the next disj
144 } else {
145 defaults.put(param.getName(), defaultValue);
146 continue disjIterLoop;
147 }
148 } // paramsIter
149
150 } // disjIter
151
152 return defaults;
153 } // getDefaults()
154
155
156 // this stuff is for if we decide to do more thorough checking
157 // of parameterisation in Factory.createResource... but at present
158 // the gui checks pretty well so...
159 //
160 // /** Analyse a parameter-value feature map and return a list
161 // * of init time parameter disjunctions that are unset.
162 // */
163 // public List getUnsetInitimeParameters(FeatureMap paramValues) {
164 // List unsetDisj = new ArrayList();
165 //
166 // // for each init disj,
167 // // for each param,
168 // // if there's no value in paramValues
169 // // add this disj to rtnValue,
170 // // continue disjLoop
171 // } // getUnsetInitimeParameters(paramValues)
172 //
173 // /** Analyse a parameter-value feature map and return a list
174 // * of runtime parameter disjunctions that are unset.
175 // */
176 // public List getUnsetRuntimeParameters(FeatureMap paramValues) {
177 // } // getUnsetRuntimeParameters(paramValues)
178 //
179 // public List getUnsetInitimeParameters(
180 // FeatureMap paramValues, boolean includeOptional
181 // ) {
182 // } // getUnsetInitimeParameters(paramValues, includeOptional)
183 //
184 // public List getUnsetRuntimeParameters(
185 // FeatureMap paramValues, boolean includeOptional
186 // ) {
187 // } // getUnsetRuntimeParameters(paramValues, includeOptional)
188 //
189
190 /** Status of the last run of <TT>getDefaults(List)</TT>. */
191 protected boolean fullyDefaulted = false;
192
193 /** Get the status of the last run of <TT>getDefaults(List)</TT>.
194 * If the last run managed to find a default for all parameters
195 * that are part of a disjunction of which none are optional, then
196 * this status is true; else it is false.
197 * @see #getDefaults(List)
198 */
199 public boolean isFullyDefaulted() { return fullyDefaulted; }
200
201
202 /** String representation */
203 public String toString() {
204 StringBuffer s = new StringBuffer(Strings.getNl() + " ParameterList:");
205
206 Iterator iter = getRuntimeParameters().iterator();
207 if(iter.hasNext()) s.append(Strings.getNl() + " runtime params=");
208 while(iter.hasNext()) {
209 s.append(Strings.getNl() + " ");
210 List paramDisj = (List) iter.next();
211 Iterator iter2 = paramDisj.iterator();
212
213 while(iter2.hasNext())
214 s.append( (Parameter) iter2.next() + Strings.getNl() + " " );
215 }
216
217 iter = getInitimeParameters().iterator();
218 if(iter.hasNext()) s.append(Strings.getNl() + " initime params=");
219 while(iter.hasNext()) {
220 s.append(Strings.getNl() + " ");
221 List paramDisj = (List) iter.next();
222 Iterator iter2 = paramDisj.iterator();
223
224 while(iter2.hasNext())
225 s.append( (Parameter) iter2.next() + Strings.getNl() + " " );
226 }
227
228 return s.toString();
229 } // toString()
230
231 } // class ParameterList
232
233
234