001package gudusoft.gsqlparser.dlineage.graph.utils; 002 003import java.io.IOException; 004import java.io.Writer; 005import java.util.HashMap; 006import java.util.HashSet; 007import java.util.Map; 008import java.util.Set; 009 010public class LookupTranslator extends StringTranslator { 011 012 private final Map<String, String> lookupMap = new HashMap<>(); 013 private final Set<Character> prefixSet = new HashSet<>(); 014 private final int minLength; 015 private final int maxLength; 016 017 public LookupTranslator(CharSequence[]... lookupPairs) { 018 int min = Integer.MAX_VALUE; 019 int max = 0; 020 021 if (lookupPairs != null) { 022 for (CharSequence[] pair : lookupPairs) { 023 if (pair.length != 2) { 024 throw new IllegalArgumentException("每个查找对必须长度为2"); 025 } 026 String key = pair[0].toString(); 027 String value = pair[1].toString(); 028 029 lookupMap.put(key, value); 030 prefixSet.add(key.charAt(0)); 031 032 int keyLen = key.length(); 033 if (keyLen < min) min = keyLen; 034 if (keyLen > max) max = keyLen; 035 } 036 } 037 038 this.minLength = min; 039 this.maxLength = max; 040 } 041 042 @Override 043 public int translate(CharSequence input, int index, Writer out) throws IOException { 044 char currentChar = input.charAt(index); 045 if (!prefixSet.contains(currentChar)) return 0; 046 047 int maxCheckLen = Math.min(maxLength, input.length() - index); 048 049 for (int checkLen = maxCheckLen; checkLen >= minLength; checkLen--) { 050 String subSeq = input.subSequence(index, index + checkLen).toString(); 051 String replacement = lookupMap.get(subSeq); 052 if (replacement != null) { 053 out.write(replacement); 054 return checkLen; 055 } 056 } 057 058 return 0; 059 } 060}