1 15 package org.apache.tapestry.annotations; 16 17 import java.lang.reflect.Method ; 18 import java.lang.reflect.Modifier ; 19 20 import org.apache.hivemind.ApplicationRuntimeException; 21 import org.apache.hivemind.Location; 22 import org.apache.hivemind.service.BodyBuilder; 23 import org.apache.hivemind.service.MethodSignature; 24 import org.apache.tapestry.Tapestry; 25 import org.apache.tapestry.enhance.EnhancementOperation; 26 import org.apache.tapestry.spec.IComponentSpecification; 27 28 34 public class MessageAnnotationWorker implements MethodAnnotationEnhancementWorker 35 { 36 37 public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, 38 Method method, Location location) 39 { 40 if (!method.getReturnType().equals(String .class)) 41 throw new ApplicationRuntimeException(AnnotationMessages.returnStringOnly(method 42 .getReturnType())); 43 44 Message message = method.getAnnotation(Message.class); 45 46 String keyName = message.value(); 47 48 if (keyName.equals("")) 49 keyName = convertMethodNameToKeyName(method.getName()); 50 51 BodyBuilder builder = new BodyBuilder(); 52 53 builder.begin(); 54 55 Class [] parameterTypes = method.getParameterTypes(); 56 int paramCount = Tapestry.size(parameterTypes); 57 58 if (paramCount > 0) 59 { 60 builder.addln("java.lang.Object[] params = new java.lang.Object[{0}];", paramCount); 61 for (int i = 0; i < paramCount; i++) 62 { 63 builder.add("params[{0}] = ", i); 64 65 if (parameterTypes[i].isPrimitive()) 66 builder.add("($w) "); 67 68 70 builder.addln("${0};", i + 1); 71 } 72 } 73 74 builder.add("return getMessages()."); 75 76 if (paramCount == 0) 77 builder.addln("getMessage(\"{0}\");", keyName); 78 else 79 builder.addln("format(\"{0}\", params);", keyName); 80 81 builder.end(); 82 83 op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder.toString()); 84 85 if (isGetter(method)) 86 op.claimProperty(AnnotationUtils.getPropertyName(method)); 87 } 88 89 boolean isGetter(Method method) 90 { 91 93 return method.getName().startsWith("get") && method.getParameterTypes().length == 0; 94 } 95 96 String convertMethodNameToKeyName(String methodName) 97 { 98 StringBuffer buffer = new StringBuffer (); 99 100 int cursorx = methodName.startsWith("get") ? 3 : 0; 101 int length = methodName.length(); 102 boolean atStart = true; 103 104 while (cursorx < length) 105 { 106 char ch = methodName.charAt(cursorx); 107 108 if (Character.isUpperCase(ch)) 109 { 110 if (!atStart) 111 buffer.append('-'); 112 buffer.append(Character.toLowerCase(ch)); 113 } 114 else 115 buffer.append(ch); 116 117 atStart = false; 118 119 cursorx++; 120 } 121 122 return buffer.toString(); 123 } 124 } 125 | Popular Tags |