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
9
10
11
12 public class Arguments extends AbstractList<Arguments.Argument> {
13
14 public static abstract class Argument {
15 final private String parameterName;
16
17
18
19
20
21 protected Argument(String parameterName) {
22 this.parameterName = parameterName;
23 }
24
25
26
27
28
29 public abstract Object getValue();
30
31
32
33
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
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
58
59
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
86
87 protected static final class ValueArgument extends Arguments.Argument {
88 private final Object value;
89
90
91
92
93
94
95
96
97
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
133
134
135
136
137 protected Arguments() {
138 }
139
140
141
142
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
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
171 for (int i=0; i<parameters.size();++i) {
172 String parameterName = parameters.get(i).getParameterName();
173
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
183
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 }