Java tutorial
/* * Copyright 2007-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.laxser.blitz.web.paramresolver; import java.lang.reflect.Method; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.TypeConverter; import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import org.springframework.validation.FieldError; import com.laxser.blitz.web.Invocation; import com.laxser.blitz.web.annotation.DefValue; import com.laxser.blitz.web.annotation.Param; import com.laxser.blitz.web.impl.validation.ParameterBindingResult; /** *@author laxser Date 2012-3-23 ?4:50:10 *@contact [duqifan@gmail.com] *@MethodParameterResolver.java */ public final class MethodParameterResolver { private static Log logger = LogFactory.getLog(MethodParameterResolver.class); // --------------------------------------------------------- private final Method method; private final String[] parameterNames; private final ParamResolver[] resolvers; private final ParamMetaData[] paramMetaDatas; public MethodParameterResolver(Class<?> controllerClazz, Method method, ParameterNameDiscovererImpl parameterNameDiscoverer, ResolverFactory resolverFactory) { this.method = method; Class<?>[] parameterTypes = method.getParameterTypes(); parameterNames = parameterNameDiscoverer.getParameterNames(method); resolvers = new ParamResolver[parameterTypes.length]; paramMetaDatas = new ParamMetaData[parameterTypes.length]; // for (int i = 0; i < parameterTypes.length; i++) { ParamMetaDataImpl paramMetaData = new ParamMetaDataImpl(controllerClazz, method, parameterTypes[i], parameterNames[i], i); paramMetaDatas[i] = paramMetaData; resolvers[i] = resolverFactory.supports(paramMetaData); } } public ParamMetaData[] getParamMetaDatas() { return paramMetaDatas; } public String[] getParameterNames() { return parameterNames; } public Method getMethod() { return method; } public Param getParamAnnotationAt(int index) { return this.paramMetaDatas[index].getAnnotation(Param.class); } // --------------------------------------------------------- public Object[] resolve(final Invocation inv, final ParameterBindingResult parameterBindingResult) throws Exception { Object[] parameters = new Object[paramMetaDatas.length]; for (int i = 0; i < resolvers.length; i++) { if (resolvers[i] == null) { continue; } try { if (logger.isDebugEnabled()) { logger.debug("Resolves parameter " + paramMetaDatas[i].getParamType().getSimpleName() + " using " + resolvers[i].getClass().getName()); } parameters[i] = resolvers[i].resolve(inv, paramMetaDatas[i]); // afterPropertiesSet if (parameters[i] instanceof InitializingBean) { ((InitializingBean) parameters[i]).afterPropertiesSet(); } } catch (TypeMismatchException e) { // ???bean??? logger.debug("", e); // ??? if (paramMetaDatas[i].getParamType().isPrimitive()) { DefValue defValudeAnnotation = paramMetaDatas[i].getAnnotation(DefValue.class); if (defValudeAnnotation == null || DefValue.NATIVE_DEFAULT.equals(defValudeAnnotation.value())) { // ?if-else?converter??? if (paramMetaDatas[i].getParamType() == int.class) { parameters[i] = Integer.valueOf(0); } else if (paramMetaDatas[i].getParamType() == long.class) { parameters[i] = Long.valueOf(0); } else if (paramMetaDatas[i].getParamType() == boolean.class) { parameters[i] = Boolean.FALSE; } else if (paramMetaDatas[i].getParamType() == double.class) { parameters[i] = Double.valueOf(0); } else if (paramMetaDatas[i].getParamType() == float.class) { parameters[i] = Float.valueOf(0); } else { TypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter(); parameters[i] = typeConverter.convertIfNecessary("0", paramMetaDatas[i].getParamType()); } } else { TypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter(); parameters[i] = typeConverter.convertIfNecessary(defValudeAnnotation.value(), paramMetaDatas[i].getParamType()); } } // String paramName = parameterNames[i]; if (paramName == null) { for (String name : paramMetaDatas[i].getParamNames()) { if ((paramName = name) != null) { break; } } } Assert.isTrue(paramName != null); FieldError fieldError = new FieldError(// "method", // ????method paramName, // ?????? inv.getParameter(paramName), // ? true, //whether this error represents a binding failure (like a type mismatch); else, it is a validation failure new String[] { e.getErrorCode() }, // "typeMismatch" new String[] { inv.getParameter(paramName) }, //the array of arguments to be used to resolve this message null // the default message to be used to resolve this message ); parameterBindingResult.addError(fieldError); } catch (Exception e) { // ???? logger.error("", e); throw e; } } return parameters; } }