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              this.name = name;
49              this.defaultValue = defaultValue;
50          }
51  
52          /**
53           * @return the name of parameter
54           */
55          public String getName() {
56              return name;
57          }
58  
59          /**
60           * @return the defaultValue of parameter
61           */
62          public Object getDefaultValue() {
63              return defaultValue;
64          }
65  
66          /**
67           * Set the default value of parameter to the passed object.
68           * @return the defaultValue of parameter
69           */
70          public void setDefaultValue(Object defaultValue) {
71              this.defaultValue = defaultValue;
72          }
73  
74          @Override
75          public String toString() {
76              return getName() + "=" + Result.toLap(getDefaultValue());
77          }
78      }
79      private List<Parameter> parameters;
80  
81      protected FormalParameters() {
82          parameters = new ArrayList<Parameter>();
83      }
84  
85      @Override
86      public Parameter get(int index) {
87          return parameters.get(index);
88      }
89  
90      @Override
91      public int size() {
92          return parameters.size();
93      }
94  
95      @Override
96      public Parameter set(int index, Parameter element) {
97          for (Parameter param : parameters) {
98              if (param.getName().equals(element.getName()) && !param.equals(element)) {
99                  throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
100             }
101         }
102         return parameters.set(index, element);
103     }
104 
105     @Override
106     public void add(int index, Parameter element) {
107         //Check that parameter with same name hasn't already been inserted
108         for (Parameter param : parameters) {
109             if (param.getName().equals(element.getName())) {
110                 throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
111             }
112         }
113         parameters.add(index, element);
114     }
115 
116     @Override
117     public Parameter remove(int index) {
118         return parameters.remove(index);
119     }
120 
121     /**
122      * Does this list of formal parameters contains variable with name
123      * variableName?
124      * @param variableName variableName we are checking.
125      * @return true if it contais variable with same name.
126      */
127     public boolean containsVariable(String variableName) {
128         for (FormalParameters.Parameter param : parameters) {
129             if (param.getName().equals(variableName)) {
130                 return true;
131             }
132         }
133         return false;
134     }
135 
136 
137     @Override
138     public String toString() {
139         StringBuilder sb = new StringBuilder("");
140 
141         for (int i=0; i<parameters.size();++i) {
142             String parameterString = parameters.get(i).toString();
143             if (i==0) {
144                 sb.append(parameterString);
145             } else {
146                 sb.append(", " + parameterString);
147             }
148         }
149         return sb.toString();
150     }
151 }