package com.taobao.metamorphosis.utils; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.StringUtils; public abstract class Config { public Set<String> getFieldSet() { Class<? extends Config> clazz = this.getClass(); Field[] fields = clazz.getDeclaredFields(); Set<String> rt = new HashSet<String>(); for (Field f : fields) { String name = f.getName(); Ignore ignore = f.getAnnotation(Ignore.class); if (ignore != null) { continue; } Key key = f.getAnnotation(Key.class); if (key != null) { name = key.name(); if (!StringUtils.isBlank(name)) { rt.add(name); } else { rt.add(f.getName()); } } else if (name.length() > 0 && Character.isLowerCase(name.charAt(0))) { rt.add(name); } } return rt; } public String findBestMatchField(Set<String> fields, String value) { int minScore = Integer.MAX_VALUE; String matchedField = null; for (String f : fields) { int dis = StringUtils.getLevenshteinDistance(value, f); if (dis < minScore) { matchedField = f; minScore = dis; } } return matchedField; } public void checkConfigKeys(Set<String> configKeySet, Set<String> validKeySet) { for (String key : configKeySet) { if (!validKeySet.contains(key)) { String best = this.findBestMatchField(validKeySet, key); throw new IllegalArgumentException("Invalid config key:" + key + ",do you mean '" + best + "'?"); } } } }