package cn.lihu.jh.framework.desensitize.core.slider.handler; 
 | 
  
 | 
import cn.lihu.jh.framework.desensitize.core.base.handler.DesensitizationHandler; 
 | 
  
 | 
import java.lang.annotation.Annotation; 
 | 
  
 | 
/** 
 | 
 * 滑动脱敏处理器抽象类,已实现通用的方法 
 | 
 * 
 | 
 * @author gaibu 
 | 
 */ 
 | 
public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> 
 | 
        implements DesensitizationHandler<T> { 
 | 
  
 | 
    @Override 
 | 
    public String desensitize(String origin, T annotation) { 
 | 
        int prefixKeep = getPrefixKeep(annotation); 
 | 
        int suffixKeep = getSuffixKeep(annotation); 
 | 
        String replacer = getReplacer(annotation); 
 | 
        int length = origin.length(); 
 | 
  
 | 
        // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换 
 | 
        if (prefixKeep >= length || suffixKeep >= length) { 
 | 
            return buildReplacerByLength(replacer, length); 
 | 
        } 
 | 
  
 | 
        // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换 
 | 
        if ((prefixKeep + suffixKeep) >= length) { 
 | 
            return buildReplacerByLength(replacer, length); 
 | 
        } 
 | 
  
 | 
        // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串 
 | 
        int interval = length - prefixKeep - suffixKeep; 
 | 
        return origin.substring(0, prefixKeep) + 
 | 
                buildReplacerByLength(replacer, interval) + 
 | 
                origin.substring(prefixKeep + interval); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 根据长度循环构建替换符 
 | 
     * 
 | 
     * @param replacer 替换符 
 | 
     * @param length   长度 
 | 
     * @return 构建后的替换符 
 | 
     */ 
 | 
    private String buildReplacerByLength(String replacer, int length) { 
 | 
        StringBuilder builder = new StringBuilder(); 
 | 
        for (int i = 0; i < length; i++) { 
 | 
            builder.append(replacer); 
 | 
        } 
 | 
        return builder.toString(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 前缀保留长度 
 | 
     * 
 | 
     * @param annotation 注解信息 
 | 
     * @return 前缀保留长度 
 | 
     */ 
 | 
    abstract Integer getPrefixKeep(T annotation); 
 | 
  
 | 
    /** 
 | 
     * 后缀保留长度 
 | 
     * 
 | 
     * @param annotation 注解信息 
 | 
     * @return 后缀保留长度 
 | 
     */ 
 | 
    abstract Integer getSuffixKeep(T annotation); 
 | 
  
 | 
    /** 
 | 
     * 替换符 
 | 
     * 
 | 
     * @param annotation 注解信息 
 | 
     * @return 替换符 
 | 
     */ 
 | 
    abstract String getReplacer(T annotation); 
 | 
  
 | 
} 
 |