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    * List of parameters for element. The only {@link PoshElement elements} that can have parameters are {@link Competence} and {@link ActionPattern}.
9    * 
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       * <p>
31       * Formal parameters are typeless variables that always have default value that
32       * is used when caller "forgets" to specify the parameter.
33       * @author Honza
34       */
35      final public static class Parameter {
36  
37          private final String name;
38          private Object defaultValue;
39  
40          /**
41           * Create new formal parameter for C or AP.
42           * @param name name of parameter, always start with "$"
43           * @param defaultValue value that is used when no value is passed for this parameter
44           */
45          public Parameter(String name, Object defaultValue) {
46              // XXX: this should test if same as VARIABLE token in posh parser.
47              assert name.startsWith("$");
48              assert !name.matches("\\s"); 
49              this.name = name;
50              this.defaultValue = defaultValue;
51          }
52  
53          /**
54           * @return the name of parameter, always starts with $.
55           */
56          public String getName() {
57              return name;
58          }
59  
60          /**
61           * @return the defaultValue of parameter, as parsed object.
62           */
63          public Object getDefaultValue() {
64              return defaultValue;
65          }
66  
67          /**
68           * Set the default value of parameter to the passed object.
69           * @return the defaultValue of parameter
70           */
71          public void setDefaultValue(Object defaultValue) {
72              this.defaultValue = defaultValue;
73          }
74  
75          @Override
76          public String toString() {
77              return getName() + "=" + Result.toLap(getDefaultValue());
78          }
79      }
80      private List<Parameter> parameters;
81  
82      public FormalParameters() {
83          parameters = new ArrayList<Parameter>();
84      }
85  
86      @Override
87      public Parameter get(int index) {
88          return parameters.get(index);
89      }
90  
91      @Override
92      public int size() {
93          return parameters.size();
94      }
95  
96      @Override
97      public Parameter set(int index, Parameter element) {
98          for (Parameter param : parameters) {
99              if (param.getName().equals(element.getName()) && !param.equals(element)) {
100                 throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
101             }
102         }
103         return parameters.set(index, element);
104     }
105 
106     @Override
107     public void add(int index, Parameter element) {
108         //Check that parameter with same name hasn't already been inserted
109         for (Parameter param : parameters) {
110             if (param.getName().equals(element.getName())) {
111                 throw new IllegalArgumentException("Parameter with name \"" + element.getName() + "\" has already been specified in formal parameters.");
112             }
113         }
114         parameters.add(index, element);
115     }
116 
117     @Override
118     public Parameter remove(int index) {
119         return parameters.remove(index);
120     }
121 
122     /**
123      * Does this list of formal parameters contains variable with name
124      * variableName?
125      * @param variableName variableName we are checking.
126      * @return true if it contais variable with same name.
127      */
128     public boolean containsVariable(String variableName) {
129         for (FormalParameters.Parameter param : parameters) {
130             if (param.getName().equals(variableName)) {
131                 return true;
132             }
133         }
134         return false;
135     }
136 
137 
138     @Override
139     public String toString() {
140         StringBuilder sb = new StringBuilder("");
141 
142         for (int i=0; i<parameters.size();++i) {
143             String parameterString = parameters.get(i).toString();
144             if (i==0) {
145                 sb.append(parameterString);
146             } else {
147                 sb.append(", " + parameterString);
148             }
149         }
150         return sb.toString();
151     }
152 }