View Javadoc

1   package cz.cuni.amis.pogamut.sposh.elements;
2   
3   import java.util.AbstractList;
4   import java.util.ArrayList;
5   import java.util.List;
6   
7   /**
8    * This class is used as holder of all formal parameters for C or AP.
9    * <p>
10   * Specialized class is used instead of some Collection, because I want to
11   * keep order in which parameters were added, but also throw error on duplicates.
12   * 
13   * @author Honza
14   */
15  final public class FormalParameters extends AbstractList<FormalParameters.Parameter> {
16  
17      /**
18       * Copy constructor.
19       * @param parameters
20       */
21      FormalParameters(FormalParameters parameters) {
22          this.parameters = new ArrayList<Parameter>();
23          for (FormalParameters.Parameter param : parameters) {
24              this.add(param);
25          }
26      }
27  
28      /**
29       * This class represents one formal parameter of C or AP.
30       * Senses and actions don't have formal parameters per se, because they are not
31       * declared in the plan, but even they can be passed parameters.
32       * <p>
33       * Formal parameters are typeless variables that always have default value that
34       * is used when caller "forgets" to specify the parameter.
35       * @author Honza
36       */
37      final public static class Parameter {
38  
39          private final String name;
40          private Object defaultValue;
41  
42          /**
43           * Create new formal parameter for C or AP.
44           * @param name name of parameter, always start with "$"
45           * @param defaultValue value that is used when no value is passed for this parameter
46           */
47          public Parameter(String name, Object defaultValue) {
48              // XXX: this should test if same as VARIABLE token in posh parser.
49              assert name.startsWith("$");
50              assert !name.matches("\\s"); 
51              this.name = name;
52              this.defaultValue = defaultValue;
53          }
54  
55          /**
56           * @return the name of parameter
57           */
58          public String getName() {
59              return name;
60          }
61  
62          /**
63           * @return the defaultValue of parameter
64           */
65          public Object getDefaultValue() {
66              return defaultValue;
67          }
68  
69          /**
70           * Set the default value of parameter to the passed object.
71           * @return the defaultValue of parameter
72           */
73          public void setDefaultValue(Object defaultValue) {
74              this.defaultValue = defaultValue;
75          }
76  
77          @Override
78          public String toString() {
79              return getName() + "=" + Result.toLap(getDefaultValue());
80          }
81      }
82      private List<Parameter> parameters;
83  
84      public FormalParameters() {
85          parameters = new ArrayList<Parameter>();
86      }
87  
88      @Override
89      public Parameter get(int index) {
90          return parameters.get(index);
91      }
92  
93      @Override
94      public int size() {
95          return parameters.size();
96      }
97  
98      @Override
99      public Parameter set(int index, Parameter element) {
100         for (Parameter param : parameters) {
101             if (param.getName().equals(element.getName()) && !param.equals(element)) {
102                 throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
103             }
104         }
105         return parameters.set(index, element);
106     }
107 
108     @Override
109     public void add(int index, Parameter element) {
110         //Check that parameter with same name hasn't already been inserted
111         for (Parameter param : parameters) {
112             if (param.getName().equals(element.getName())) {
113                 throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
114             }
115         }
116         parameters.add(index, element);
117     }
118 
119     @Override
120     public Parameter remove(int index) {
121         return parameters.remove(index);
122     }
123 
124     /**
125      * Does this list of formal parameters contains variable with name
126      * variableName?
127      * @param variableName variableName we are checking.
128      * @return true if it contais variable with same name.
129      */
130     public boolean containsVariable(String variableName) {
131         for (FormalParameters.Parameter param : parameters) {
132             if (param.getName().equals(variableName)) {
133                 return true;
134             }
135         }
136         return false;
137     }
138 
139 
140     @Override
141     public String toString() {
142         StringBuilder sb = new StringBuilder("");
143 
144         for (int i=0; i<parameters.size();++i) {
145             String parameterString = parameters.get(i).toString();
146             if (i==0) {
147                 sb.append(parameterString);
148             } else {
149                 sb.append(", " + parameterString);
150             }
151         }
152         return sb.toString();
153     }
154 }