com.iflytek.edu.cloud.frame.spring.rest.ServiceMethodInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.iflytek.edu.cloud.frame.spring.rest.ServiceMethodInfo.java

Source

/**
 * 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 javax.servlet.http.HttpServletRequest;

import org.springframework.web.servlet.mvc.condition.RequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;

public class ServiceMethodInfo implements RequestCondition<ServiceMethodInfo> {

    private final ServiceMethodRequestCondition serviceMethodCondition;

    private final RequestMethodsRequestCondition methodsCondition;

    /**
     * Creates a new instance with the given request conditions.
     */
    public ServiceMethodInfo(ServiceMethodRequestCondition patterns, RequestMethodsRequestCondition methods) {
        this.serviceMethodCondition = (patterns != null ? patterns : new ServiceMethodRequestCondition());
        this.methodsCondition = (methods != null ? methods : new RequestMethodsRequestCondition());
    }

    /**
     * Re-create a RequestMappingInfo with the given custom request condition.
     */
    public ServiceMethodInfo(ServiceMethodInfo info) {
        this(info.serviceMethodCondition, info.methodsCondition);
    }

    /**
     * Returns the URL patterns of this {@link RequestMappingInfo};
     * or instance with 0 patterns, never {@code null}.
     */
    public ServiceMethodRequestCondition getServiceMethodCondition() {
        return this.serviceMethodCondition;
    }

    /**
     * Returns the HTTP request methods of this {@link RequestMappingInfo};
     * or instance with 0 request methods, never {@code null}.
     */
    public RequestMethodsRequestCondition getMethodsCondition() {
        return this.methodsCondition;
    }

    /**
     * Combines "this" request mapping info (i.e. the current instance) with another request mapping info instance.
     * <p>Example: combine type- and method-level request mappings.
     * @return a new request mapping info instance; never {@code null}
     */
    @Override
    public ServiceMethodInfo combine(ServiceMethodInfo other) {
        ServiceMethodRequestCondition patterns = this.serviceMethodCondition.combine(other.serviceMethodCondition);
        RequestMethodsRequestCondition methods = this.methodsCondition.combine(other.methodsCondition);

        return new ServiceMethodInfo(patterns, methods);
    }

    /**
     * Checks if all conditions in this request mapping info match the provided request and returns
     * a potentially new request mapping info with conditions tailored to the current request.
     * <p>For example the returned instance may contain the subset of URL patterns that match to
     * the current request, sorted with best matching patterns on top.
     * @return a new instance in case all conditions match; or {@code null} otherwise
     */
    @Override
    public ServiceMethodInfo getMatchingCondition(HttpServletRequest request) {
        RequestMethodsRequestCondition methods = this.methodsCondition.getMatchingCondition(request);

        if (methods == null) {
            return null;
        }

        ServiceMethodRequestCondition patterns = this.serviceMethodCondition.getMatchingCondition(request);
        if (patterns == null) {
            return null;
        }

        return new ServiceMethodInfo(patterns, methods);
    }

    /**
     * Compares "this" info (i.e. the current instance) with another info in the context of a request.
     * <p>Note: It is assumed both instances have been obtained via
     * {@link #getMatchingCondition(HttpServletRequest)} to ensure they have conditions with
     * content relevant to current request.
     */
    @Override
    public int compareTo(ServiceMethodInfo other, HttpServletRequest request) {
        int result = this.serviceMethodCondition.compareTo(other.getServiceMethodCondition(), request);
        if (result != 0) {
            return result;
        }
        result = this.methodsCondition.compareTo(other.getMethodsCondition(), request);
        if (result != 0) {
            return result;
        }
        return 0;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj instanceof ServiceMethodInfo) {
            ServiceMethodInfo other = (ServiceMethodInfo) obj;
            return (this.serviceMethodCondition.equals(other.serviceMethodCondition)
                    && this.methodsCondition.equals(other.methodsCondition));
        }
        return false;
    }

    @Override
    public int hashCode() {
        return (this.serviceMethodCondition.hashCode() * 31 + // primary differentiation
                this.methodsCondition.hashCode());
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder("{");
        builder.append(this.serviceMethodCondition);
        builder.append(",methods=").append(this.methodsCondition);
        builder.append('}');
        return builder.toString();
    }

}