+ * 详情见: https://redkale.org + * + * + * @author zhangjx + * + * @since 2.8.0 + */ +public interface CombinedKey { + + public String keyFor(Object... args); + + /** + * 生成Key, paramTypes与paramNames长度必须一致 + * + * @param paramTypes 参数类型 + * @param paramNames 参数名 + * @param key key表达式 + * + * @return CombinedKey + */ + public static CombinedKey create(Class[] paramTypes, String[] paramNames, String key) { + return CombinedKeys.create(paramTypes, paramNames, key); + } +} diff --git a/src/main/java/org/redkale/util/CombinedKeys.java b/src/main/java/org/redkale/util/CombinedKeys.java new file mode 100644 index 000000000..337b2be13 --- /dev/null +++ b/src/main/java/org/redkale/util/CombinedKeys.java @@ -0,0 +1,87 @@ +/* + * + */ +package org.redkale.util; + +import java.util.Objects; + +/** + * + * @author zhangjx + */ +class CombinedKeys { + + public static CombinedKey create(Class[] paramTypes, String[] paramNames, String key) { + Objects.requireNonNull(key, "key for " + CombinedKey.class.getSimpleName() + " is null"); + if ((paramTypes != null && paramNames != null && paramTypes.length != paramNames.length) + || (paramTypes == null && paramNames != null) + || (paramTypes != null && paramNames == null)) { + throw new IllegalArgumentException("paramTypes.length and paramNames.length is inconsistent"); + } + if (key.indexOf('{') < 0) { + return new StringDynamicKey(key); + } else { + if (paramNames != null) { + for (int i = 0; i < paramNames.length; i++) { + if (key.equalsIgnoreCase("#{" + paramNames[i] + "}")) { + return new ParamDynamicKey(i); + } + } + } + return new CombinedDynamicKey(paramTypes, paramNames, key); + } + } + + static class CombinedDynamicKey implements CombinedKey { + + private final CombinedKey[] keys; + + public CombinedDynamicKey(Class[] paramTypes, String[] paramNames, String key) { + this.keys = new CombinedKey[0]; + } + + @Override + public String keyFor(Object... args) { + StringBuilder sb = new StringBuilder(); + for (CombinedKey key : keys) { + sb.append(key.keyFor(args)); + } + return sb.toString(); + } + + } + + static class ParamDynamicKey implements CombinedKey { + + private final int index; + + public ParamDynamicKey(int index) { + this.index = index; + } + + @Override + public String keyFor(Object... args) { + return String.valueOf(args[index]); + } + + } + + static class StringDynamicKey implements CombinedKey { + + private final String key; + + public StringDynamicKey(String key) { + this.key = key; + } + + @Override + public String keyFor(Object... args) { + return key; + } + } + + private CombinedKeys() { + //do nothing + } + +}