1 5 package xdoclet.modules.ejb.entity; 6 7 9 import java.text.MessageFormat ; 10 import java.util.Properties ; 11 import java.util.StringTokenizer ; 12 13 import xjavadoc.XClass; 14 import xjavadoc.XMethod; 15 import xdoclet.DocletContext; 16 import xdoclet.DocletTask; 17 import xdoclet.XDocletException; 18 import xdoclet.modules.ejb.EjbTagsHandler; 19 import xdoclet.modules.ejb.home.HomeTagsHandler; 20 import xdoclet.tagshandler.MethodTagsHandler; 21 import xdoclet.tagshandler.PropertyTagsHandler; 22 import xdoclet.tagshandler.TypeTagsHandler; 23 24 import xdoclet.util.TypeConversionUtil; 25 26 34 public class PkTagsHandler extends EjbTagsHandler 35 { 36 44 public static String getPrimkeyFieldFor(XClass clazz) throws XDocletException 45 { 46 String pkField = clazz.getDoc().getTagAttributeValue("ejb:bean", "primkey-field", true); 49 50 60 return pkField; 61 } 62 63 72 public static boolean isMethodPrimkeyField(XClass clazz, XMethod method) 73 throws XDocletException 74 { 75 String pkField = getPrimkeyFieldFor(clazz); 76 String propertyName = MethodTagsHandler.getPropertyNameFor(method); 77 78 return propertyName.equals(pkField); 79 } 80 81 90 public static String getPrimkeyGetterFor(XClass clazz) throws XDocletException 91 { 92 if (!classHasPrimkeyField(clazz)) { 93 return null; 94 } 95 96 StringBuffer buffer = new StringBuffer (); 97 98 buffer.append("get"); 99 buffer.append(Character.toUpperCase(getPrimkeyFieldFor(clazz).charAt(0))); 100 buffer.append(getPrimkeyFieldFor(clazz).substring(1)); 101 102 String getterName = buffer.toString(); 103 104 if (MethodTagsHandler.hasMethod(clazz, getterName, null, false)) { 105 return getterName; 106 } 107 else { 108 return null; 109 } 110 } 111 112 121 public static String getPrimkeySetterFor(XClass clazz) throws XDocletException 122 { 123 if (!classHasPrimkeyField(clazz)) { 124 return null; 125 } 126 127 StringBuffer buffer = new StringBuffer (); 128 129 buffer.append("set"); 130 buffer.append(Character.toUpperCase(getPrimkeyFieldFor(clazz).charAt(0))); 131 buffer.append(getPrimkeyFieldFor(clazz).substring(1)); 132 133 String setterName = buffer.toString(); 134 135 if (MethodTagsHandler.hasMethod(clazz, setterName, null, false)) { 136 return setterName; 137 } 138 else { 139 return null; 140 } 141 } 142 143 153 public static String getPkClassFor(XClass clazz) throws XDocletException 154 { 155 if (classHasPrimkeyField(clazz)) { 156 String fieldName = getPrimkeyFieldFor(clazz); 157 String getter = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); 158 159 XMethod method = PropertyTagsHandler.getXMethodForMethodName(getter, true); 162 163 if (method == null) { 164 throw new XDocletException("Could not find method " + getter + " that is supposed to return the PrimKeyField."); 165 } 166 167 return method.getReturnType().getType().getQualifiedName(); 168 } 169 170 String fileName = clazz.getContainingPackage().getName(); 171 172 String pkClass = clazz.getDoc().getTagAttributeValue("ejb:pk", "class", false); 173 174 if (pkClass != null) { 175 return pkClass; 176 } 177 178 String namePattern = clazz.getDoc().getTagAttributeValue("ejb:pk", "pattern", false); 179 180 if (namePattern == null) { 181 namePattern = getEntityPkClassPattern(); 182 } 183 184 String package_pattern = clazz.getDoc().getTagAttributeValue("ejb:pk", "package", false); 185 186 String pkclass_name = null; 187 188 if (namePattern.indexOf("{0}") != -1) { 189 pkclass_name = MessageFormat.format(namePattern, new Object []{getShortEjbNameFor(clazz)}); 190 } 191 else { 192 pkclass_name = namePattern; 193 } 194 195 fileName = choosePackage(fileName, package_pattern, DocletTask.getSubTaskName(EntityPkSubTask.class)); 197 if (fileName.length() > 0) { 198 fileName += "."; 199 } 200 201 fileName += pkclass_name; 202 203 return fileName; 204 } 205 206 207 214 public static String getPkClassForEjbJarXmlFor(XClass clazz) throws XDocletException 215 { 216 XMethod createMethod = HomeTagsHandler.findFirstCreateMethodFor(clazz); 217 String createMethodReturnType = createMethod != null ? createMethod.getReturnType().getType().getQualifiedName() : null; 218 219 String generate_str = clazz.getDoc().getTagAttributeValue("ejb:pk", "generate", false); 220 boolean generate = TypeConversionUtil.stringToBoolean(generate_str, true); 221 222 if (isPkClassGenerateable(createMethodReturnType) == false) { 223 return createMethodReturnType; 224 } 225 226 if (generate == true) { 227 return getPkClassFor(clazz); 228 } 229 else { 230 return createMethodReturnType; 231 } 232 } 233 234 243 public static boolean classHasPrimkeyField(XClass clazz) throws XDocletException 244 { 245 String pkField = getPrimkeyFieldFor(clazz); 246 247 return (pkField != null); 248 } 249 250 256 protected static String getEntityPkClassPattern() 257 { 258 EntityPkSubTask entitypk_subtask = ((EntityPkSubTask) DocletContext.getInstance().getSubTaskBy(DocletTask.getSubTaskName(EntityPkSubTask.class))); 259 260 if (entitypk_subtask != null) { 261 return entitypk_subtask.getEntityPkClassPattern(); 262 } 263 else { 264 return EntityPkSubTask.DEFAULT_ENTITY_PK_CLASS_PATTERN; 265 } 266 } 267 268 274 private static boolean isPkClassGenerateable(String create_method_return_type) 275 { 276 if (create_method_return_type == null) { 277 return true; 278 } 279 280 if (create_method_return_type.equals("java.lang.Object") || TypeTagsHandler.isPrimitiveType(create_method_return_type)) { 281 return false; 282 } 283 else { 284 return true; 285 } 286 } 287 288 296 public void ifHasPrimkeyField(String template, Properties attributes) 297 throws XDocletException 298 { 299 if (classHasPrimkeyField(getCurrentClass())) { 300 generate(template); 301 } 302 } 303 304 312 public void ifIsPrimkeyField(String template, Properties attributes) 313 throws XDocletException 314 { 315 if (isMethodPrimkeyField(getCurrentClass(), getCurrentMethod())) { 316 generate(template); 317 } 318 } 319 320 328 public void ifIsNotPrimkeyField(String template, Properties attributes) 329 throws XDocletException 330 { 331 if (!isMethodPrimkeyField(getCurrentClass(), getCurrentMethod())) { 332 generate(template); 333 } 334 } 335 336 344 public void ifDoesntHavePrimkeyField(String template, Properties attributes) 345 throws XDocletException 346 { 347 if (!classHasPrimkeyField(getCurrentClass())) { 348 generate(template); 349 } 350 } 351 352 361 public String primkeyField(Properties attributes) 362 throws XDocletException 363 { 364 return getPrimkeyFieldFor(getCurrentClass()); 365 } 366 367 376 public String primkeyGetter(Properties attributes) 377 throws XDocletException 378 { 379 return getPrimkeyGetterFor(getCurrentClass()); 380 } 381 382 391 public String primkeySetter(Properties attributes) 392 throws XDocletException 393 { 394 return getPrimkeySetterFor(getCurrentClass()); 395 } 396 397 406 public void ifHasPrimkeySetter(String template, Properties attributes) 407 throws XDocletException 408 { 409 if (getPrimkeySetterFor(getCurrentClass()) != null) { 410 generate(template); 411 } 412 } 413 414 421 public String pkClass() throws XDocletException 422 { 423 return getPkClassFor(getCurrentClass()); 424 } 425 426 433 public String pkClassForEjbJarXml() throws XDocletException 434 { 435 return getPkClassForEjbJarXmlFor(getCurrentClass()); 436 } 437 438 447 public String pkfieldList() throws XDocletException 448 { 449 return PersistentTagsHandler.fieldList(getCurrentClass(), "ejb:pk-field", null, 0, null, true); 450 } 451 452 465 public String pkfieldListFrom(Properties attributes) throws XDocletException 466 { 467 String name = attributes.getProperty("name"); 468 String commaSep = PersistentTagsHandler.fieldList(getCurrentClass(), "ejb:pk-field", null, 2, null, true); 469 470 StringTokenizer st = new StringTokenizer (commaSep, ","); 471 String ret = ""; 472 473 while (st.hasMoreTokens()) { 474 String attr = st.nextToken(); 475 476 ret += name + "." + attr; 477 if (st.hasMoreTokens()) { 478 ret += ","; 479 } 480 } 481 return ret; 482 } 483 484 491 public String extendsFrom() throws XDocletException 492 { 493 return extendsFromFor(getCurrentClass(), "ejb:pk", null, "extends", "java.lang.Object"); 494 } 495 496 503 public void ifIsPkField(String template) throws XDocletException 504 { 505 if (PersistentTagsHandler.isPkField(getCurrentMethod())) { 506 generate(template); 507 } 508 } 509 510 518 protected String getDependentClassFor(XClass clazz, String type) throws XDocletException 519 { 520 return getPkClassFor(clazz); 521 } 522 } 523 | Popular Tags |