1   /*
2    *  ParameterList.java
3    *
4    *  Copyright (c) 1998-2005, 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.7 2005/01/11 13:51:31 ian 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