/**
* Copyright 2013-2014 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.iflytek.edu.cloud.frame.spring.rest;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import com.iflytek.edu.cloud.frame.Constants;
import com.iflytek.edu.cloud.frame.annotation.ServiceMethod;
public class ServiceMethodHandlerMapping extends ServiceMethodInfoHandlerMapping {
@Override
protected boolean isHandler(Class<?> beanType) {
return ((AnnotationUtils.findAnnotation(beanType, Controller.class) != null) ||
(AnnotationUtils.findAnnotation(beanType, ServiceMethod.class) != null));
}
@Override
protected ServiceMethodInfo getMappingForMethod(Method method,
Class<?> handlerType) {
ServiceMethodInfo info = null;
ServiceMethod methodAnnotation = AnnotationUtils.findAnnotation(
method, ServiceMethod.class);
if (methodAnnotation != null) {
info = createServiceMethodInfo(methodAnnotation);
ServiceMethod typeAnnotation = AnnotationUtils.findAnnotation(
handlerType, ServiceMethod.class);
if (typeAnnotation != null) {
info = createServiceMethodInfo(typeAnnotation).combine(info);
}
}
return info;
}
protected ServiceMethodInfo createServiceMethodInfo(ServiceMethod annotation) {
return new ServiceMethodInfo(new ServiceMethodRequestCondition(annotation.value(), annotation.version()),
new RequestMethodsRequestCondition(annotation.method()));
}
@Override
protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {
String lookupPath = request.getParameter(Constants.SYS_PARAM_KEY_METHOD);
if (logger.isDebugEnabled()) {
logger.debug("Looking up handler method for path " + lookupPath);
}
HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request);
if (logger.isDebugEnabled()) {
if (handlerMethod != null) {
logger.debug("Returning handler method [" + handlerMethod + "]");
}
else {
logger.debug("Did not find handler method for [" + lookupPath + "]");
}
}
return (handlerMethod != null ? handlerMethod.createWithResolvedBean() : null);
}
}