001: /*
002: * Copyright 2004-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.springframework.binding.method;
017:
018: import org.springframework.binding.expression.EvaluationContext;
019: import org.springframework.binding.expression.Expression;
020: import org.springframework.core.style.ToStringCreator;
021: import org.springframework.util.Assert;
022: import org.springframework.util.ObjectUtils;
023:
024: /**
025: * A named method parameter. Each parameter has an identifying name and is of a
026: * specified type (class).
027: *
028: * @author Keith Donald
029: */
030: public class Parameter {
031:
032: /**
033: * The class of the parameter, e.g "springbank.AccountNumber".
034: */
035: private Class type;
036:
037: /**
038: * The name of the parameter as an evaluatable expression, e.g
039: * "accountNumber".
040: */
041: private Expression name;
042:
043: /**
044: * Create a new named parameter definition. Named parameters are capable of resolving
045: * parameter values (arguments) from argument sources.
046: * @param type the parameter type, may be null
047: * @param name the name the method argument expression (required)
048: */
049: public Parameter(Class type, Expression name) {
050: Assert.notNull(name,
051: "The parameter name expression is required");
052: this .type = type;
053: this .name = name;
054: }
055:
056: /**
057: * Returns the parameter type. Could be null if no parameter type
058: * was specified.
059: */
060: public Class getType() {
061: return type;
062: }
063:
064: /**
065: * Returns the parameter name.
066: */
067: public Expression getName() {
068: return name;
069: }
070:
071: /**
072: * Evaluate this method parameter against the provided argument source,
073: * returning a single method argument value.
074: * @param argumentSource the meyhod argument source
075: * @param context the evaluation context
076: * @return the method argument value
077: */
078: public Object evaluateArgument(Object argumentSource,
079: EvaluationContext context) {
080: return name.evaluate(argumentSource, context);
081: }
082:
083: public boolean equals(Object obj) {
084: if (!(obj instanceof Parameter)) {
085: return false;
086: }
087: Parameter other = (Parameter) obj;
088: return ObjectUtils.nullSafeEquals(type, other.type)
089: && name.equals(other.name);
090: }
091:
092: public int hashCode() {
093: return (type != null ? type.hashCode() : 0) + name.hashCode();
094: }
095:
096: public String toString() {
097: return new ToStringCreator(this ).append("type", type).append(
098: "name", name).toString();
099: }
100: }
|