¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.springblade.core.tool.utils; |
| | | |
| | | import java.util.Map; |
| | | import java.util.Properties; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Stream; |
| | | |
| | | /** |
| | | * å ä½ç¬¦è§£æå¨ |
| | | * |
| | | * @author meilin.huang, chill |
| | | */ |
| | | public class PlaceholderUtil { |
| | | /** |
| | | * é»è®¤åç¼å ä½ç¬¦ |
| | | */ |
| | | public static final String DEFAULT_PLACEHOLDER_PREFIX = "${"; |
| | | |
| | | /** |
| | | * é»è®¤åç¼å ä½ç¬¦ |
| | | */ |
| | | public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}"; |
| | | |
| | | /** |
| | | * é»è®¤åä¾è§£æå¨ |
| | | */ |
| | | private static final PlaceholderUtil DEFAULT_RESOLVER = new PlaceholderUtil(); |
| | | |
| | | /** |
| | | * å ä½ç¬¦åç¼ |
| | | */ |
| | | private String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX; |
| | | |
| | | /** |
| | | * å ä½ç¬¦åç¼ |
| | | */ |
| | | private String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX; |
| | | |
| | | |
| | | private PlaceholderUtil() { |
| | | } |
| | | |
| | | private PlaceholderUtil(String placeholderPrefix, String placeholderSuffix) { |
| | | this.placeholderPrefix = placeholderPrefix; |
| | | this.placeholderSuffix = placeholderSuffix; |
| | | } |
| | | |
| | | /** |
| | | * è·åé»è®¤çå ä½ç¬¦è§£æå¨ï¼å³å ä½ç¬¦åç¼ä¸º"${", åç¼ä¸º"}" |
| | | * |
| | | * @return PlaceholderUtil |
| | | */ |
| | | public static PlaceholderUtil getDefaultResolver() { |
| | | return DEFAULT_RESOLVER; |
| | | } |
| | | |
| | | public static PlaceholderUtil getResolver(String placeholderPrefix, String placeholderSuffix) { |
| | | return new PlaceholderUtil(placeholderPrefix, placeholderSuffix); |
| | | } |
| | | |
| | | /** |
| | | * è§£æå¸¦ææå®å ä½ç¬¦ç模æ¿å符串ï¼é»è®¤å ä½ç¬¦ä¸ºåç¼ï¼${ åç¼ï¼}<br/><br/> |
| | | * å¦ï¼template = category:${}:product:${}<br/> |
| | | * values = {"1", "2"}<br/> |
| | | * è¿å category:1:product:2<br/> |
| | | * |
| | | * @param content è¦è§£æç带æå ä½ç¬¦ç模æ¿å符串 |
| | | * @param values æç
§æ¨¡æ¿å ä½ç¬¦ç´¢å¼ä½ç½®è®¾ç½®å¯¹åºçå¼ |
| | | * @return {String} |
| | | */ |
| | | public String resolve(String content, String... values) { |
| | | int start = content.indexOf(this.placeholderPrefix); |
| | | if (start == -1) { |
| | | return content; |
| | | } |
| | | //å¼ç´¢å¼ |
| | | int valueIndex = 0; |
| | | StringBuilder result = new StringBuilder(content); |
| | | while (start != -1) { |
| | | int end = result.indexOf(this.placeholderSuffix); |
| | | String replaceContent = values[valueIndex++]; |
| | | result.replace(start, end + this.placeholderSuffix.length(), replaceContent); |
| | | start = result.indexOf(this.placeholderPrefix, start + replaceContent.length()); |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è§£æå¸¦ææå®å ä½ç¬¦ç模æ¿å符串ï¼é»è®¤å ä½ç¬¦ä¸ºåç¼ï¼${ åç¼ï¼}<br/><br/> |
| | | * å¦ï¼template = category:${}:product:${}<br/> |
| | | * values = {"1", "2"}<br/> |
| | | * è¿å category:1:product:2<br/> |
| | | * |
| | | * @param content è¦è§£æç带æå ä½ç¬¦ç模æ¿å符串 |
| | | * @param values æç
§æ¨¡æ¿å ä½ç¬¦ç´¢å¼ä½ç½®è®¾ç½®å¯¹åºçå¼ |
| | | * @return {String} |
| | | */ |
| | | public String resolve(String content, Object[] values) { |
| | | return resolve(content, Stream.of(values).map(String::valueOf).toArray(String[]::new)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¿æ¢è§åæ¥æ¿æ¢æå®æ¨¡æ¿ä¸çå ä½ç¬¦å¼ |
| | | * |
| | | * @param content è¦è§£æçå符串 |
| | | * @param rule è§£æè§ååè° |
| | | * @return {String} |
| | | */ |
| | | public String resolveByRule(String content, Function<String, String> rule) { |
| | | int start = content.indexOf(this.placeholderPrefix); |
| | | if (start == -1) { |
| | | return content; |
| | | } |
| | | StringBuilder result = new StringBuilder(content); |
| | | while (start != -1) { |
| | | int end = result.indexOf(this.placeholderSuffix, start + 1); |
| | | //è·åå ä½ç¬¦å±æ§å¼ï¼å¦${id}, å³è·åid |
| | | String placeholder = result.substring(start + this.placeholderPrefix.length(), end); |
| | | //æ¿æ¢æ´ä¸ªå ä½ç¬¦å
容ï¼å³å°${id}弿¿æ¢ä¸ºæ¿æ¢è§ååè°ä¸çå
容 |
| | | String replaceContent = placeholder.trim().isEmpty() ? "" : rule.apply(placeholder); |
| | | result.replace(start, end + this.placeholderSuffix.length(), replaceContent); |
| | | start = result.indexOf(this.placeholderPrefix, start + replaceContent.length()); |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | /** |
| | | * æ¿æ¢æ¨¡æ¿ä¸å ä½ç¬¦å
容ï¼å ä½ç¬¦çå
容å³ä¸ºmap key对åºçå¼ï¼key为å ä½ç¬¦ä¸çå
容ã<br/><br/> |
| | | * å¦ï¼content = product:${id}:detail:${did}<br/> |
| | | * valueMap = id -> 1; pid -> 2<br/> |
| | | * ç»è¿è§£æè¿å product:1:detail:2<br/> |
| | | * |
| | | * @param content 模æ¿å
容 |
| | | * @param valueMap 弿 å° |
| | | * @return æ¿æ¢å®æåçå符串 |
| | | */ |
| | | public String resolveByMap(String content, final Map<String, Object> valueMap) { |
| | | return resolveByRule(content, placeholderValue -> String.valueOf(valueMap.get(placeholderValue))); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®propertiesæä»¶æ¿æ¢å ä½ç¬¦å
容 |
| | | * |
| | | * @param content 模æ¿å
容 |
| | | * @param properties é
ç½® |
| | | * @return {String} |
| | | */ |
| | | public String resolveByProperties(String content, final Properties properties) { |
| | | return resolveByRule(content, properties::getProperty); |
| | | } |
| | | |
| | | } |