+ assert aNames.length == aTypes.length;
+ names = aNames;
+ types = aTypes;
+ resetValues();
+ }
+
+ /**
+ * The types of the parameter values.
+ *
+ * @return Types.
+ */
+ public Class[] getTypes() {
+ return types;
+ }
+
+ /**
+ * Sets argument i to be optional, meaning that null is allowed to
+ * be passed in.
+ *
+ * @param aArg Argument to set.
+ *
+ * @return DOCUMENT ME!
+ */
+ public ParameterValues setOptional(int aArg) {
+ values[aArg] = new RequiredInterfaceProvider(new DefaultRequiredInterface(
+ "arg" + aArg, types[aArg], true));
+
+ return this;
+ }
+
+ /**
+ * Sets the argument i to a fixed value.
+ *
+ * @param aArg Argument to set.
+ * @param aValue Value.
+ *
+ * @return DOCUMENT ME!
+ */
+ public ParameterValues setValue(int aArg, Object aValue) {
+ values[aArg] = new FixedValueProvider(aValue);
+
+ return this;
+ }
+
+ /**
+ * Resets the values.
+ */
+ private void resetValues() {
+ values = new ValueProvider[types.length];
+
+ for (int i = 0; i < values.length; i++) {
+ values[i] = new RequiredInterfaceProvider(new DefaultRequiredInterface(
+ names[i], types[i]));
+ }
+ }
+
+ /**
+ * Gets the required interfaces to provide values that are not
+ * provided in another way.
+ *
+ * @return Required interfaces.
+ */
+ public List<RequiredInterface> getRequiredInterfaces() {
+ List<RequiredInterface> result = new ArrayList<RequiredInterface>();
+
+ for (ValueProvider provider : values) {
+ if (provider instanceof RequiredInterfaceProvider) {
+ result.add(((RequiredInterfaceProvider) provider)
+ .getRequiredInterface());
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns the values to use in the given scope.
+ *
+ * @param aScope Scope within which to retrieve the values.
+ *
+ * @return Values.
+ */
+ public Object[] values(Scope aScope) {
+ Object[] valueArray = new Object[values.length];
+
+ for (int i = 0; i < values.length; i++) {
+ valueArray[i] = values[i].getValue(aScope);
+ }
+
+ return valueArray;