AbstraceNotificationExtractor.java

package cn.home1.cloud.config.server.monitor;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.config.monitor.PropertyPathNotificationExtractor;

import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 2017/1/17 yanzhang153
 */
@Slf4j
public abstract class AbstraceNotificationExtractor implements PropertyPathNotificationExtractor {

    private static final Pattern PATH_PATTERN = Pattern.compile("^(https?)://(.+)/(.*)/commit/[a-zA-Z0-9]{7,40}");
    private static final String ALL_APPLICATION_STR = "application";

    @Value("${spring.cloud.config.server.common-config.prefix:home1-oss-common}")
    private String commonConfigPrefix;

    @Value("${spring.cloud.config.server.common-config.suffix:-common}")
    private String commonConfigSuffix;

    protected void addAllPaths(final Set<String> paths, final Map<String, Object> commit, final String name) {
        if (paths.contains(ALL_APPLICATION_STR)) {
            return;
        }
        // example:
        // http://gitlab/configserver/oss-todomvc-app-config/commit/929f67f2b38a6269e7ad63f606c9d89a7d8eb79f
        final String url = (String) commit.get("url");
        log.debug("config server monitor url:{}", url);
        if (StringUtils.isBlank(url)) {
            return;
        }
        final Matcher matcher = PATH_PATTERN.matcher(url);
        if (matcher.matches()) {
            final String repository = matcher.group(3);
            log.debug("will add application pattern, repository name :{}, current result:{}", repository, paths);
            final int lastIndex = repository.lastIndexOf('-');
            if (lastIndex <= 0) {
                log.info("the suffix of repository name is not ends with -xxx (-config), ignored.");
                return;
            }
            final String applicationName = repository.substring(0, lastIndex);
            String pattern = null;
            if (applicationName.startsWith(commonConfigPrefix)) {
                pattern = ALL_APPLICATION_STR;// to all application
            } else {
                pattern = applicationName;
                final int idx = applicationName.indexOf('-', 1);
                if (idx > 0) {
                    pattern = applicationName.substring(0, idx);
                }
                pattern = pattern + "*";
            }
            if (paths.add(pattern)) {
                log.info("add refresh pattern {}, applicationName:{}", pattern, applicationName);
            }
        }
    }
}