1 package org.example.antbook.xdoclet; 2 3 import java.util.ArrayList ; 4 import java.util.Collection ; 5 import java.util.HashMap ; 6 import java.util.Iterator ; 7 import java.util.List ; 8 import java.util.Map ; 9 import java.util.Properties ; 10 import java.util.LinkedHashMap ; 11 12 import xdoclet.XDocletException; 13 import xdoclet.tagshandler.AbstractProgramElementTagsHandler; 14 import xdoclet.tagshandler.MethodTagsHandler; 15 import xjavadoc.XClass; 16 import xjavadoc.XMethod; 17 import xjavadoc.XParameter; 18 19 public class FormTagsHandler extends AbstractProgramElementTagsHandler { 20 21 private final static List supportedTypes = new ArrayList (); 22 private String curFieldName; 23 private String curType; 24 private boolean curFieldIsIdorVersion = false; 25 private boolean curFieldIsBoolean = false; 26 private boolean curFieldIsDate = false; 27 private boolean lastField = false; 28 29 static { 30 supportedTypes.add("java.lang.String"); 31 supportedTypes.add("java.lang.Integer"); 32 supportedTypes.add("int"); 33 supportedTypes.add("java.lang.Float"); 34 supportedTypes.add("float"); 35 supportedTypes.add("java.lang.Long"); 36 supportedTypes.add("long"); 37 supportedTypes.add("java.lang.Double"); 38 supportedTypes.add("double"); 39 supportedTypes.add("java.lang.Boolean"); 40 supportedTypes.add("boolean"); 41 supportedTypes.add("java.util.Date"); 42 supportedTypes.add("java.sql.Timestamp"); 43 } 44 45 49 public String parentPackageName() { 50 String packageName = getCurrentPackage().getName(); 51 return packageName.substring(0, packageName.lastIndexOf(".")); 52 } 53 54 58 public String parentPackageDir() { 59 return parentPackageName().replace('.', '/'); 60 } 61 62 69 public void forAllFields(String template, Properties attributes) throws XDocletException { 70 XClass clazz = getCurrentClass(); 71 Map setters = new LinkedHashMap (getFields(clazz)); 72 73 for (Iterator iterator = setters.keySet().iterator(); iterator.hasNext();) { 74 curFieldName = (String ) iterator.next(); 75 76 XMethod field = (XMethod) setters.get(curFieldName); 77 78 XMethod getter = field.getAccessor(); 79 setCurrentMethod(getter); 80 curFieldIsIdorVersion = false; 81 Properties prop = new Properties (); 82 prop.setProperty("tagName", "hibernate.id"); 83 84 if (hasTag(prop, FOR_METHOD)) { 85 prop.setProperty("paramName", "generator-class"); 86 String generatorClass = methodTagValue(prop); 87 System.out.println("generatorClass: " + generatorClass); 88 if (generatorClass != null && generatorClass.equals("assigned")) { 89 curFieldIsIdorVersion = false; 90 } else { 91 curFieldIsIdorVersion = true; 92 } 93 } else { 94 curFieldIsIdorVersion = false; 95 } 96 97 prop.setProperty("tagName", "hibernate.version"); 98 99 if (hasTag(prop, FOR_METHOD)) { 100 curFieldIsIdorVersion = true; 101 } 102 103 String typename = field.getPropertyType().getType().getQualifiedName(); 104 curFieldIsBoolean = typename.equals("boolean") || typename.equals("java.lang.Boolean"); 105 curFieldIsDate = typename.equals("java.util.Date") || typename.equals("java.sql.Timestamp"); 106 107 curType = typename; 108 setCurrentMethod(field); 109 110 if (!iterator.hasNext()) { 111 lastField = true; 112 } else { 113 lastField = false; 114 } 115 116 generate(template); 117 } 118 } 119 120 129 public void ifIsBooleanField(String template, Properties attributes) throws XDocletException { 130 if (curFieldIsBoolean) 131 generate(template); 132 } 133 134 143 public void ifIsNotBooleanField(String template, Properties attributes) throws XDocletException { 144 if (!curFieldIsBoolean) 145 generate(template); 146 } 147 148 155 public void ifIsDateField(String template, Properties attributes) throws XDocletException { 156 if (curFieldIsDate) 157 generate(template); 158 } 159 160 169 public void ifIsNotDateField(String template, Properties attributes) throws XDocletException { 170 if (!curFieldIsDate) 171 generate(template); 172 } 173 174 175 183 public void ifIsIdOrVersionField(String template, Properties attributes) throws XDocletException { 184 if (curFieldIsIdorVersion) { 185 generate(template); 186 } 187 } 188 189 public void ifIsNotLastField(String template, Properties attributes) throws XDocletException { 190 if (lastField == false) { 191 generate(template); 192 } 193 } 194 195 203 public void ifIsNotIdOrVersionField(String template, Properties attributes) throws XDocletException { 204 if (!curFieldIsIdorVersion) { 205 generate(template); 206 } 207 } 208 209 217 public void ifFieldNameEquals(String template, Properties attributes) throws XDocletException{ 218 String name = attributes.getProperty("name"); 219 220 if ((name != null) && name.equals(curFieldName)) { 221 generate(template); 222 } 223 } 224 225 233 public void ifFieldNameNotEquals(String template, Properties attributes) throws XDocletException { 234 String name = attributes.getProperty("name"); 235 236 if ((name != null) && !name.equals(curFieldName)) { 237 generate(template); 238 } 239 } 240 241 247 public String methodTagValue(Properties attributes) throws XDocletException { 248 XMethod method = getCurrentMethod(); 249 setCurrentMethod(method.getAccessor()); 250 String value = getTagValue(attributes, FOR_METHOD); 251 setCurrentMethod(method); 252 return value; 253 } 254 255 261 public String columnName(Properties attributes) throws XDocletException { 262 Properties prop = new Properties (); 263 264 prop.setProperty("tagName", "hibernate.property"); 265 prop.setProperty("paramName", "column"); 266 267 String column = methodTagValue(prop); 268 269 if ((column == null) || (column.trim().length() < 1)) { 270 prop.setProperty("tagName", "hibernate.id"); 271 column = methodTagValue(prop); 272 } 273 274 return column; 275 } 276 277 283 public String fieldName(Properties props) { 284 return curFieldName; 285 } 286 287 292 public String javaType(Properties props) { 293 return curType; 294 } 295 296 301 public String jdbcType(Properties props) { 302 String jdbcType = "VARCHAR"; 303 304 if (curType != null) { 305 String javaType = curType.toLowerCase(); 306 307 if (javaType.indexOf("date") > 0) { 308 jdbcType = "TIMESTAMP"; 309 } else if (javaType.indexOf("timestamp") > 0) { 310 jdbcType = "TIMESTAMP"; 311 } else if ((javaType.indexOf("int") > 0) || (javaType.indexOf("long") > 0) || (javaType.indexOf("short") > 0)) { 312 jdbcType = "INTEGER"; 313 } else if (javaType.indexOf("double") > 0) { 314 jdbcType = "DOUBLE"; 315 } else if (javaType.indexOf("float") > 0) { 316 jdbcType = "FLOAT"; 317 } 318 } 319 320 return jdbcType; 321 } 322 323 326 public String classNameLower() { 327 String name = getCurrentClass().getName(); 328 return Character.toLowerCase(name.charAt(0)) + name.substring(1); 329 } 330 331 public String className() { 332 return getCurrentClass().getName(); 333 } 334 335 339 public String classNameUpper() { 340 String name = getCurrentClass().getName(); 341 return name.toUpperCase(); 342 } 343 344 public String fieldDescription(Properties props) { 345 StringBuffer buffer = new StringBuffer (); 346 boolean nextUpper = false; 347 for (int i = 0; i < curFieldName.length(); i++) { 348 char c = curFieldName.charAt(i); 349 350 if (i == 0) { 351 buffer.append(Character.toUpperCase(c)); 352 continue; 353 } 354 355 if (Character.isUpperCase(c)) { 356 buffer.append(' '); 357 buffer.append(c); 358 continue; 359 } 360 361 if (c == '.') { 362 buffer.delete(0, buffer.length()); 363 nextUpper = true; 364 continue; 365 } 366 367 char x = nextUpper ? Character.toUpperCase(c) : c; 368 buffer.append(x); 369 nextUpper = false; 370 } 371 372 return buffer.toString(); 373 } 374 375 private Map getFields(XClass clazz) throws XDocletException { 376 return getFields(clazz, ""); 377 } 378 379 private Map getFields(XClass clazz, String prefix) throws XDocletException { 380 Map fields = new LinkedHashMap (); 381 382 Collection curFields = clazz.getMethods(true); 383 384 for (Iterator iterator = curFields.iterator(); iterator.hasNext();) { 385 XMethod setter = (XMethod) iterator.next(); 386 387 if (MethodTagsHandler.isSetterMethod(setter)) { 388 String name = MethodTagsHandler.getPropertyNameFor(setter); 389 XParameter param = (XParameter) setter.getParameters().iterator().next(); 390 String type = param.getType().getQualifiedName(); 391 XMethod getter = setter.getAccessor(); 392 393 setCurrentClass(setter.getContainingClass()); 394 super.setCurrentMethod(getter); 395 Properties pro = new Properties (); 396 pro.setProperty("tagName", "hibernate.component"); 397 398 if (super.hasTag(pro, FOR_METHOD)) { 399 name += "Form"; 400 fields.putAll(getFields(param.getType(), prefix + name + ".")); 401 } else { 402 fields.put(prefix + name, setter); 403 } 404 } 405 } 406 407 return fields; 408 } 409 } 410 | Popular Tags |