All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ars.invoke.channel.http.AbstractHttpChannel Maven / Gradle / Ivy

The newest version!
package ars.invoke.channel.http;

import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;
import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ars.util.Streams;
import ars.util.Strings;
import ars.invoke.Context;
import ars.invoke.convert.Converter;

/**
 * Http请求通道抽象实现
 *
 * @author wuyongqiang
 */
public abstract class AbstractHttpChannel implements HttpChannel {
    private Context context; // 应用上下文
    private Redirector[] redirectors = new Redirector[0]; // 请求重定向配置
    private Map renders = new HashMap(0); // 视图渲染配置
    private Map templates = new HashMap(0); // 模板映射
    private Map converters = new HashMap(0); // 数据转换映射

    public Redirector[] getRedirectors() {
        return redirectors;
    }

    public void setRedirectors(Redirector... redirectors) {
        this.redirectors = redirectors;
    }

    public Map getRenders() {
        return renders;
    }

    public void setRenders(Map renders) {
        this.renders = renders;
    }

    public Map getTemplates() {
        return templates;
    }

    public void setTemplates(Map templates) {
        this.templates = templates;
    }

    public Map getConverters() {
        return converters;
    }

    public void setConverters(Map converters) {
        this.converters = converters;
    }

    /**
     * 获取请求对象
     *
     * @param uri      资源地址
     * @param config   Servlet配置对象
     * @param request  Http请求对象
     * @param response Http响应对象
     * @return 请求对象
     * @throws IOException      IO操作异常
     * @throws IOException      IO操作异常
     * @throws ServletException Servlet操作异常
     */
    protected abstract HttpRequester getRequester(String uri, ServletConfig config, HttpServletRequest request,
                                                  HttpServletResponse response) throws IOException, ServletException;

    /**
     * 获取请求资源地址
     *
     * @param request Http请求对象
     * @return 资源地址
     */
    protected String getUri(HttpServletRequest request) {
        String uri = request.getRequestURI().trim();
        String context = request.getContextPath();
        if (context != null) {
            uri = uri.substring(context.length());
        }
        if (uri.isEmpty()) {
            uri = Https.ROOT_URI;
        } else if (!uri.equals(Https.ROOT_URI)) {
            uri = uri.substring(1);
        }
        return uri;
    }

    /**
     * 查找请求资源模板
     *
     * @param requester 请求对象
     * @return 模板路径
     */
    protected String lookupTemplate(HttpRequester requester) {
        String template = null;
        String uri = requester.getUri();
        if (uri.indexOf('.') >= 0) {
            template = uri;
        } else if (!this.templates.isEmpty()) {
            for (Entry entry : this.templates.entrySet()) {
                if (Strings.matches(uri, entry.getKey())) {
                    template = entry.getValue();
                    break;
                }
            }
        }
        if (template != null) {
            int index = template.indexOf('?');
            if (index > 0) {
                template = template.substring(0, index);
            }
        }
        return template;
    }

    /**
     * 查找请求转换处理对象
     *
     * @param requester 请求对象
     * @return 数据转换处理对象
     */
    protected Converter lookupConverter(HttpRequester requester) {
        if (!this.converters.isEmpty()) {
            for (Entry entry : this.converters.entrySet()) {
                if (Strings.matches(requester.getUri(), entry.getKey())) {
                    return entry.getValue();
                }
            }
        }
        return null;
    }

    /**
     * 请求重定向
     *
     * @param requester 请求对象
     * @param content   重定向内容
     * @return 是否重定向成功
     * @throws Exception 操作异常
     */
    protected boolean redirect(HttpRequester requester, Object content) throws Exception {
        for (Redirector redirector : this.redirectors) {
            String redirect = redirector.getRedirect(requester, content);
            if (redirect == null) {
                continue;
            }
            if (redirect.indexOf('.') > 0) {
                requester.render(redirect, content);
            } else {
                String context = requester.getHttpServletRequest().getContextPath();
                if (context != null && !context.isEmpty()) {
                    redirect = new StringBuilder(context).append(redirect).toString();
                }
                requester.getHttpServletResponse().sendRedirect(redirect);
            }
            return true;
        }
        return false;
    }

    @Override
    public Context getContext() {
        return this.context;
    }

    @Override
    public void setContext(Context context) {
        this.context = context;
    }

    @Override
    public void dispatch(ServletConfig config, HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        Object value = null;
        Converter converter = null;
        HttpRequester requester = this.getRequester(this.getUri(request), config, request, response);
        String template = this.lookupTemplate(requester);
        if (template == null) {
            try {
                value = requester.execute();
            } catch (Exception e) {
                value = e;
            }
            if (!Streams.isStream(value) && (converter = this.lookupConverter(requester)) != null) {
                value = converter.serialize(value);
            }
        } else if (Strings.isEmpty(request.getContentType()) || (converter = this.lookupConverter(requester)) == null) {
            try {
                requester.render(template, null);
            } catch (Exception e) {
                value = e;
            }
        } else {
            try {
                value = requester.view(template, null);
            } catch (Exception e) {
                value = e;
            }
            value = converter.serialize(value);
        }
        if (value != null && !this.redirect(requester, value)) {
            if (value instanceof Exception) {
                throw (Exception) value;
            }
            Https.response(response, value);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy