package com.hwlcn.security.crypto.hash.format; import com.hwlcn.security.util.StringUtils; import com.hwlcn.security.util.UnknownClassException; import com.hwlcn.security.util.ClassUtils; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class DefaultHashFormatFactory implements HashFormatFactory { private Map<String, String> formatClassNames; private Set<String> searchPackages; public DefaultHashFormatFactory() { this.searchPackages = new HashSet<String>(); this.formatClassNames = new HashMap<String, String>(); } public Map<String, String> getFormatClassNames() { return formatClassNames; } public void setFormatClassNames(Map<String, String> formatClassNames) { this.formatClassNames = formatClassNames; } public Set<String> getSearchPackages() { return searchPackages; } public void setSearchPackages(Set<String> searchPackages) { this.searchPackages = searchPackages; } public HashFormat getInstance(String in) { if (in == null) { return null; } HashFormat hashFormat = null; Class clazz = null; if (in.startsWith(ModularCryptFormat.TOKEN_DELIMITER)) { String test = in.substring(ModularCryptFormat.TOKEN_DELIMITER.length()); String[] tokens = test.split("\\" + ModularCryptFormat.TOKEN_DELIMITER); String possibleMcfId = (tokens != null && tokens.length > 0) ? tokens[0] : null; if (possibleMcfId != null) { clazz = getHashFormatClass(possibleMcfId); } } if (clazz == null) { clazz = getHashFormatClass(in); } if (clazz != null) { hashFormat = newHashFormatInstance(clazz); } return hashFormat; } protected Class getHashFormatClass(String token) { Class clazz = null; if (this.formatClassNames != null) { String value = this.formatClassNames.get(token); if (value != null) { clazz = lookupHashFormatClass(value); } } if (clazz == null) { ProvidedHashFormat provided = ProvidedHashFormat.byId(token); if (provided != null) { clazz = provided.getHashFormatClass(); } } if (clazz == null) { clazz = lookupHashFormatClass(token); } if (clazz == null) { if (this.searchPackages != null) { for (String packageName : this.searchPackages) { clazz = getHashFormatClass(packageName, token); if (clazz != null) { break; } } } } if (clazz != null) { assertHashFormatImpl(clazz); } return clazz; } protected Class getHashFormatClass(String packageName, String token) { String test = token; Class clazz = null; String pkg = packageName == null ? "" : packageName; clazz = lookupHashFormatClass(test); if (clazz == null) { test = pkg + "." + token; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + StringUtils.uppercaseFirstChar(token) + "Format"; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + token + "Format"; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + StringUtils.uppercaseFirstChar(token) + "HashFormat"; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + token + "HashFormat"; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + StringUtils.uppercaseFirstChar(token) + "CryptFormat"; clazz = lookupHashFormatClass(test); } if (clazz == null) { test = pkg + "." + token + "CryptFormat"; clazz = lookupHashFormatClass(test); } if (clazz == null) { return null; } assertHashFormatImpl(clazz); return clazz; } protected Class lookupHashFormatClass(String name) { try { return ClassUtils.forName(name); } catch (UnknownClassException ignored) { } return null; } protected final void assertHashFormatImpl(Class clazz) { if (!HashFormat.class.isAssignableFrom(clazz) || clazz.isInterface()) { throw new IllegalArgumentException("Discovered class [" + clazz.getName() + "] is not a " + HashFormat.class.getName() + " implementation."); } } protected final HashFormat newHashFormatInstance(Class clazz) { assertHashFormatImpl(clazz); return (HashFormat) ClassUtils.newInstance(clazz); } }