1 package org.andromda.core.translation; 2 3 import org.andromda.core.common.ExceptionUtils; 4 import org.andromda.core.common.Introspector; 5 import org.apache.commons.lang.ObjectUtils; 6 import org.apache.commons.lang.StringUtils; 7 8 /** 9 * Contains translation utilities. 10 * 11 * @author Chad Brandon 12 */ 13 public class TranslationUtils 14 { 15 /** 16 * <p> 17 * <code>TranslationUtils</code> instances should NOT be constructed in standard programming. Instead, the class 18 * should be used as <code>TranslationUtils.replacePattern(" some pattern ");</code>. </p> 19 * <p> 20 * This constructor is public to permit tools that require a JavaBean instance to operate. </p> 21 */ 22 public TranslationUtils() 23 { 24 // Here for documentation purposes 25 } 26 27 /** 28 * Searches for and replaces the specified pattern with braces around it, like so: "{pattern}" every time it 29 * occurs in the string. 30 * 31 * @param string the string to to perform replacement on. 32 * @param pattern the pattern to find 33 * @param replaceWith the pattern to place the existing one with. 34 * @return String the string will all replacements 35 */ 36 public static String replacePattern( 37 String string, 38 final String pattern, 39 final String replaceWith) 40 { 41 if (string != null) 42 { 43 ExceptionUtils.checkNull("pattern", pattern); 44 ExceptionUtils.checkNull("replaceWith", replaceWith); 45 string = StringUtils.replace(string, '{' + pattern + '}', replaceWith); 46 } 47 return string; 48 } 49 50 /** 51 * Searches for and replaces the specified pattern with braces around it, like so: "{pattern}" the first time it 52 * occurs in the string 53 * 54 * @param string the string to to perform replacement on. 55 * @param pattern the pattern to find 56 * @param replaceWith the pattern to place the existing one with. 57 * @return String the string will all replacements 58 */ 59 public static String replaceFirstPattern( 60 String string, 61 final String pattern, 62 final String replaceWith) 63 { 64 if (string != null) 65 { 66 ExceptionUtils.checkNull("pattern", pattern); 67 ExceptionUtils.checkNull("replaceWith", replaceWith); 68 string = StringUtils.replaceOnce(string, '{' + pattern + '}', replaceWith); 69 } 70 return string; 71 } 72 73 /** 74 * Returns true if the specified pattern with braces around it, like so: "{pattern}" exists in the string. 75 * 76 * @param string the string to to perform replacement on. 77 * @param pattern the pattern to find 78 * @return boolean true if the string contains the pattern, false otherwise 79 */ 80 public static boolean containsPattern( 81 final String string, 82 final String pattern) 83 { 84 boolean containsPattern = string != null && pattern != null; 85 if (containsPattern) 86 { 87 containsPattern = StringUtils.contains(string, '{' + pattern + '}'); 88 } 89 return containsPattern; 90 } 91 92 /** 93 * Calls the object's toString method and trims the value. Returns and empty string if null is given. 94 * 95 * @param object the object to use. 96 * @return String 97 */ 98 public static String trimToEmpty(final Object object) 99 { 100 return StringUtils.trimToEmpty(ObjectUtils.toString(object)); 101 } 102 103 /** 104 * Calls the object's toString method and deletes any whitespace from the value. Returns and empty string if null is 105 * given. 106 * 107 * @param object the object to deleteWhite space from. 108 * @return String 109 */ 110 public static String deleteWhitespace(final Object object) 111 { 112 return StringUtils.deleteWhitespace(ObjectUtils.toString(object)); 113 } 114 115 /** 116 * Retrieves the "starting" property name from one that is nested, for example, will return ' <name1>' from the 117 * string <name1>. <name2>. <name3>. If the property isn't nested, then just return the name that is passed in. 118 * 119 * @param property the property. 120 * @return String 121 */ 122 public static String getStartingProperty(String property) 123 { 124 StringUtils.trimToEmpty(property); 125 int dotIndex = property.indexOf('.'); 126 if (dotIndex != -1) 127 { 128 property = property.substring(0, dotIndex); 129 } 130 return property; 131 } 132 133 /** 134 * Removes any extra whitespace. Does not remove the spaces between the words. Only removes tabs and newline 135 * characters. This is to allow everything to be on one line while keeping the spaces between words. 136 * 137 * @param string the string 138 * @return String the string with the removed extra spaces. 139 */ 140 public static String removeExtraWhitespace(final String string) 141 { 142 return string == null ? "" : string.replaceAll("[$\\s]+", " ").trim(); 143 } 144 145 /** 146 * Just retrieves properties from a bean, but gives a more informational error when the property can't be 147 * retrieved, it also cleans the resulting property from any excess white space 148 * 149 * @param bean the bean from which to retrieve the property 150 * @param property the property name 151 * @return Object the value of the property 152 */ 153 public static Object getProperty( 154 final Object bean, 155 final String property) 156 { 157 final String methodName = "TranslationUtils.getProperty"; 158 try 159 { 160 return Introspector.instance().getProperty(bean, property); 161 } 162 catch (final Exception exception) 163 { 164 throw new TranslatorException( 165 "Error performing " + methodName + " with bean '" + bean + "' and property '" + property + '\'', 166 exception); 167 } 168 } 169 170 /** 171 * Just retrieves properties from a bean, but gives a more informational error when the property can't be 172 * retrieved, it also cleans the resulting property from any excess white space 173 * 174 * @param bean the bean from which to retrieve the property 175 * @param property the property name 176 * @return Object the value of the property 177 */ 178 public static String getPropertyAsString( 179 final Object bean, 180 final String property) 181 { 182 return TranslationUtils.trimToEmpty(TranslationUtils.getProperty(bean, property)); 183 } 184 }