package org.objectstyle.wolips.wodclipse.core.refactoring; import java.util.HashSet; import java.util.Set; import org.objectstyle.wolips.baseforplugins.util.StringUtilities; import org.objectstyle.wolips.bindings.wod.IWodElement; import org.objectstyle.wolips.bindings.wod.IWodModel; public class ElementRename { private String _oldName; private String _newName; public ElementRename(String oldName, String newName) { _oldName = oldName; _newName = newName; } public String getOldName() { return _oldName; } public String getNewName() { return _newName; } public static ElementRename newUniqueName(IWodModel wodModel, IWodElement wodElement, boolean forceRename) { return ElementRename.newUniqueName(wodModel, wodElement, new HashSet<String>(), forceRename); } public static ElementRename newUniqueName(IWodModel wodModel, IWodElement wodElement, Set<String> elementNames, boolean forceRename) { ElementRename elementRename = null; String typeName = wodElement.getElementType(); String shortTypeName = typeName; if (typeName.startsWith("WO")) { shortTypeName = typeName.substring("WO".length()); } String elementName = wodElement.getElementName(); if (forceRename || (elementName.startsWith(shortTypeName) && StringUtilities.isDigitsOnly(elementName.substring(shortTypeName.length())))) { String newName = null; boolean forceAppendNumber = false; if ("TBConditional".equals(typeName)) { String conditionValue = wodElement.getBindingsMap().get("condition"); String negateValue = wodElement.getBindingsMap().get("negate"); String prefix = null; if (negateValue != null && (negateValue.equalsIgnoreCase("true") || negateValue.equalsIgnoreCase("yes"))) { prefix = "Not"; } newName = newNameFromBindingValue(prefix, conditionValue, null); } else if ("TBString".equals(typeName)) { String value = wodElement.getBindingsMap().get("value"); newName = newNameFromBindingValue(null, value, null); } else if ("TBWLocalizedString".equals(typeName)) { String value = wodElement.getBindingsMap().get("value"); newName = newNameFromBindingValue(null, value, null); } else if ("WOSubmitButton".equals(typeName)) { String action = wodElement.getBindingsMap().get("action"); if (action != null) { newName = newNameFromBindingValue(null, action + "Button", null); } else { newName = "Button"; } } else if ("TBHyperlink".equals(typeName)) { String action = wodElement.getBindingsMap().get("action"); if (action != null) { newName = newNameFromBindingValue(null, action + "Link", null); } else { newName = "Link"; } } else if ("WORepetition".equals(typeName)) { String list = wodElement.getBindingsMap().get("list"); newName = newNameFromBindingValue(null, list, null); } else if ("TBGenericContainer".equals(typeName) || "TBGenericElement".equals(typeName)) { String genericElementName = wodElement.getBindingsMap().get("elementName"); newName = newNameFromBindingValue(null, genericElementName, null); forceAppendNumber = true; } else if (forceRename) { newName = typeName; } if (newName != null) { String uniqueNewName = newName; int counter = 1; while ((counter == 1 && forceAppendNumber) || wodModel.getElementNamed(uniqueNewName) != null || elementNames.contains(uniqueNewName)) { uniqueNewName = newName + String.valueOf(counter++); } elementRename = new ElementRename(elementName, uniqueNewName); elementNames.add(uniqueNewName); } } return elementRename; } public static String newNameFromBindingValue(String prefix, String value, String suffix) { String newName = null; if (value != null && !value.startsWith("\"~")) { value = value.replaceAll(" ", "_"); value = value.replaceAll("[\"^]", ""); value = value.replaceAll("[@,]", "."); String[] keys = value.split("\\."); StringBuffer newNameBuffer = new StringBuffer(); if (prefix != null) { newNameBuffer.append(prefix); } for (int i = 0; i < keys.length; i++) { if (keys[i].length() > 0) { newNameBuffer.append(keys[i].substring(0, 1).toUpperCase()); newNameBuffer.append(keys[i].substring(1)); } } if (suffix != null) { newNameBuffer.append(suffix); } newName = newNameBuffer.toString(); } return newName; } }