package org.javabuilders; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.javabuilders.util.JBStringUtils; /** * Encapsulates all the definitions for controls * auto-generated via naming conventions, i.e. prefixes */ public class PrefixControlDefinition { /** * Label from suffix, e.g. "btnSaveData" -> "Save Data" * Integrates with resource key lookup */ public static final String SUFFIX_LABEL = "${CONTROL_SUFFIX_LABEL}"; /** * Suffix in Pascal case, e.g. "btnSaveData" -> "saveData" */ public static final String SUFFIX_PASCAL_CASE = "${CONTROL_SUFFIX_PASCAL_CASE}"; private static Set<String> reservedPrefixes = new HashSet<String>(); /** * Lists a prefix as a reserved keyword, that will make any method names for it * get prefixed with "do", e.g. "new" -> "doNew()", "add" -> "doAdd()", etc. * @param prefix Prefix */ public static void addReservedPrefix(String prefix) { reservedPrefixes.add(prefix); } static { reservedPrefixes.add("new"); } private Class<?> clazz; private Map<String,String> defaults = new HashMap<String, String>(); /** * Gets the actual defaults * @param controlName Control name, e.g. "btnSaveData" * @param suffix The already parsed control suffix, e.g. "SaveData" */ public String getDefaultsAsYaml(BuildProcess process, String controlName, String suffix) { StringBuilder bld = new StringBuilder("{"); if (defaults != null && defaults.size() > 0) { String suffixPascal = (suffix.length() > 0) ? suffix.substring(0,1).toLowerCase() + suffix.substring(1) : suffix; for(Entry<String,String> entry : defaults.entrySet()) { if (bld.length() > 1) { bld.append(","); } String value = entry.getValue(); if (value.contains(SUFFIX_PASCAL_CASE)) { value = value.replace(SUFFIX_PASCAL_CASE, suffixPascal); //special handling for reserved Java keywords on methods if (reservedPrefixes.contains(value) && entry.getKey().matches("on[A-Z]+.*")) { value = "do" + suffix; } } else if (value.equals(SUFFIX_LABEL)) { value = JBStringUtils.getDisplayLabel(process, clazz, suffixPascal); } bld.append(entry.getKey()).append(" : ").append(value); } } //add default entry for name, if not defined if (defaults == null || !defaults.containsKey(Builder.NAME)) { if (bld.length() > 1) { bld.append(","); } bld.append("name : ").append(controlName); } bld.append("}"); return bld.toString(); } /** * @return the clazz */ public Class<?> getType() { return clazz; } /** * @param clazz the clazz to set */ public void setType(Class<?> clazz) { this.clazz = clazz; } /** * @return the defaults */ public Map<String, String> getDefaults() { return defaults; } /** * @param defaults the defaults to set */ public void setDefaults(Map<String, String> defaults) { this.defaults = defaults; } }