package com.webportals.commons.uri;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class UrlWriterFactory {
    private Log logger = LogFactory.getLog(UrlWriterFactory.class);

    private static final String FORWARD = "forward";

    private static final String REDIRECT = "redirect";

    private static final String DEFAULT_CONFIG_FILE_NAME = "urlrewrite.xml";

    private static String urlWriterConfigName;

    /**
     * 版本号
     */
    private Long version = System.currentTimeMillis();

    private static List<UrlWriter> urlPatternList = new ArrayList<UrlWriter>();

    public void init() {
        if (StringUtils.isBlank(urlWriterConfigName)) {
            urlWriterConfigName = DEFAULT_CONFIG_FILE_NAME;
        }
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(urlWriterConfigName);
        if (null == inputStream) {
            throw new RuntimeException("没有配置urlrewrite.xml");
        }
        urlPatternList = initUrlWriter(inputStream);
    }

    @SuppressWarnings("unchecked")
    private List<UrlWriter> initUrlWriter(InputStream inputStream) {
        List<UrlWriter> urlPatternList = new ArrayList<UrlWriter>();
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(inputStream);
            List<Element> nodes = doc.selectNodes("urlrewrite/rule");

            for (Element elm : nodes) {
                UrlWriter urlMapping = new UrlWriter();
                String from = elm.elementText("from");
                from = StringUtils.isBlank(from) ? "" : from;
                urlMapping.setFrom(from);

                String to = elm.elementText("to");
                to = StringUtils.isBlank(to) ? "" : to;
                urlMapping.setTo(to);

                Attribute attribute = elm.element("to").attribute("type");
                String type = FORWARD;
                if (null != attribute) {
                    if (StringUtils.isBlank(attribute.getValue())) {
                        type = attribute.getValue();
                    }
                }
                urlMapping.setType(type);
                urlPatternList.add(urlMapping);
            }
            return urlPatternList;
        } catch (DocumentException e) {

            logger.error("解析url.xml时发现异常:" + e);
        }
        return urlPatternList;

    }

    public static UrlResult getUrlResult(String url) {
        if (StringUtils.isEmpty(url)) {
            return null;
        }
        url = filterUrlStyle(url);
        UrlResult urlResult = new UrlResult(false, "");
        for (UrlWriter urlMapping : urlPatternList) {
            Pattern pattern = Pattern.compile(urlMapping.getFrom());
            Matcher matcher = pattern.matcher(url);
            if (matcher.find()) {
                urlResult.setUrl(matcher.replaceAll(urlMapping.getTo()));
                if (urlMapping.getType().equals(REDIRECT)) {
                    urlResult.setFlag(true);
                }
                return urlResult;
            }
        }
        return urlResult;
    }

    public static class UrlResult {
        private boolean flag = false;
        private String url = "";

        public UrlResult(boolean flag, String url) {
            super();
            this.flag = flag;
            this.url = url;
        }

        public boolean isFlag() {
            return flag;
        }

        public void setFlag(boolean flag) {
            this.flag = flag;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }

    public String getUrlWriterConfigName() {
        return urlWriterConfigName;
    }

    public void setUrlWriterConfigName(String urlWriterConfigName) {
        UrlWriterFactory.urlWriterConfigName = urlWriterConfigName;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }


    private static String filterUrlStyle(String url) {
        if (url.indexOf("://") != -1) {
            url = url.substring(url.indexOf("://") + 3);
        }
        if (url.length() > 1 && url.endsWith("/")) {
            url = url.substring(0, url.length() - 1);
        }
        return url;
    }

}
最近下载更多
hawear  LV1 2019年1月14日
mim哒哒哒  LV1 2018年9月3日
chengqiang  LV13 2018年5月27日
z_kkkkk  LV1 2017年9月15日
czczicheng  LV6 2017年9月14日
qijian0503  LV5 2017年3月1日
msl1010895047  LV12 2016年12月20日
yp_zhou  LV6 2016年7月12日
dengjianbin  LV2 2016年5月9日
a4w  LV1 2015年8月10日
最近浏览更多
xk9587  LV16 2月7日
lzl111213  LV1 2023年3月11日
janewinner  LV2 2021年10月20日
3072025443  LV1 2021年7月7日
RGB  LV1 2021年4月12日
维他奶111  LV1 2020年6月20日
admin_z  LV22 2020年5月22日
Taodaahu  LV2 2019年6月12日
hawear  LV1 2019年1月14日
种花家  LV9 2019年1月2日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友