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 to store parameters that were declared in plan during
9    * call of C/AP/Sense/Action
10   * @author Honza
11   */
12  public class Arguments extends AbstractList<Arguments.Argument> {
13  
14      public static abstract class Argument {
15          final private String parameterName;
16  
17          /**
18           * Create paramter with name.
19           * @param parameterName
20           */
21          protected Argument(String parameterName) {
22              this.parameterName = parameterName;
23          }
24  
25          /**
26           * Retrieve value of parameter.
27           * @return
28           */
29          public abstract Object getValue();
30  
31          /**
32           * Is value of this parameter retrieved from variable or value?
33           * @return null if this is a value, string with name of parameter variable else
34           */
35          public abstract String getParameterVariable();
36  
37          public String getParameterName() {
38              return parameterName;
39          }
40  
41          @Override
42          public abstract String toString();
43      }
44  
45      /**
46       * This parameter is dependant on value of some kind of variable.
47       */
48      protected static final class VariableArgument extends Arguments.Argument {
49          protected final String variableName;
50  
51          protected VariableArgument(int index, String variableName) {
52              super(Integer.toString(index));
53              this.variableName = variableName;
54          }
55  
56          /**
57           * New call parameter.
58           * @param parameterName name of parameter of called primitive
59           * @param variableName variable where is stored the value passed to primitive
60           */
61          protected VariableArgument(String parameterName, String variableName) {
62              super(parameterName);
63              this.variableName = variableName;
64          }
65  
66          @Override
67          public String getValue() {
68              throw new UnsupportedOperationException("Not yet implemented");
69          }
70  
71          @Override
72          public String getParameterVariable() {
73              return variableName;
74          }
75  
76          @Override
77          public String toString() {
78              if (getParameterName().startsWith("$"))
79                  return getParameterName() + "=" + variableName;
80              return variableName;
81          }
82      }
83  
84      /**
85       * This parameter is static value, neverchanging.
86       */
87      protected static final class ValueArgument extends Arguments.Argument {
88          private final Object value;
89  
90          /**
91           * Create a value parameter that represents fixed value.
92           * <p>
93           * Sequence number is used as name of this parameter. Since normal variables
94           * starts with $, it won't mix.
95           * 
96           * @param sequenceNumber number of this parameter in sequence of all parameters. Starting from 0.
97           * @param value value of parameter.
98           */
99          protected ValueArgument(int sequenceNumber, Object value) {
100             super(Integer.toString(sequenceNumber));
101             this.value = value;
102         }
103 
104         protected ValueArgument(String parameterName, Object value) {
105             super(parameterName);
106             this.value = value;
107         }
108 
109         @Override
110         public Object getValue() {
111             return value;
112         }
113 
114         @Override
115         public String getParameterVariable() {
116             return null;
117         }
118 
119         @Override
120         public String toString() {
121             if (getParameterName().startsWith("$"))
122                 return getParameterName() + "=" + Result.toLap(value);
123             return Result.toLap(value);
124         }
125 
126     }
127 
128     
129     private List<Arguments.Argument> parameters = new ArrayList<Argument>();
130 
131     /**
132      * Create a new list of call parameters.
133      * <p>
134      * Every added variable parameter has to be checked against list of formal
135      * parameters.
136      */
137     protected Arguments() {
138     }
139 
140     /**
141      * Copy constructor. Beware, this doesn't copy reference to the formal parameters.
142      * @param parameters orginal
143      */
144     protected Arguments(Arguments parameters) {
145         for (int i=0; i<parameters.size();++i) {
146             this.parameters.add(parameters.get(i));
147         }
148     }
149 
150 
151     @Override
152     public synchronized Arguments.Argument get(int index) {
153         return parameters.get(index);
154     }
155 
156     @Override
157     public synchronized int size() {
158         return parameters.size();
159     }
160 
161     public synchronized boolean addFormal(Arguments.Argument element, FormalParameters formalParams) {
162         // check if variable is defined in the context
163         String parameterVariable = element.getParameterVariable();
164         if (parameterVariable != null) {
165             if (!formalParams.containsVariable(parameterVariable)) {
166                 throw new IllegalArgumentException("Variable \"" + parameterVariable + "\" is not defined in formal parameters (" + formalParams.toString() + ").");
167             }
168         }
169 
170         // next check that named parameter isn't duplicated
171         for (int i=0; i<parameters.size();++i) {
172             String parameterName = parameters.get(i).getParameterName();
173             // check if there isn't already variable name with same name
174             if (parameterName != null && parameterName.equals(element.getParameterName())) {
175                 throw new IllegalArgumentException("Named parameter \"" + element.getParameterName() + "\" has already been defined.");
176             }
177         }
178         return parameters.add(element);
179     }
180 
181     /**
182      * Get string representation of arguments (comma separated arguments, compatible with lap).
183      * @return arguments separated with comma (e.g. |"Friends of peace.", $when=now, $who=just_first_player|)
184      */
185     @Override
186     public String toString() {
187         StringBuilder sb = new StringBuilder();
188         for (int argumentIndex = 0; argumentIndex < parameters.size(); ++argumentIndex) {
189             if (argumentIndex != 0) {
190                 sb.append(',');
191             }
192             Argument argument = parameters.get(argumentIndex);
193             sb.append(argument.toString());
194         }
195         return sb.toString();
196     }
197 }