1 15 package org.apache.tapestry.enhance; 16 17 import java.lang.reflect.Modifier ; 18 19 import org.apache.hivemind.ApplicationRuntimeException; 20 import org.apache.hivemind.Location; 21 import org.apache.hivemind.service.MethodSignature; 22 import org.apache.hivemind.util.Defense; 23 import org.apache.tapestry.services.InjectedValueProvider; 24 import org.apache.tapestry.spec.InjectSpecification; 25 26 33 public class InjectObjectWorker implements InjectEnhancementWorker 34 { 35 private InjectedValueProvider _provider; 36 37 public void performEnhancement(EnhancementOperation op, InjectSpecification is) 38 { 39 String name = is.getProperty(); 40 String objectReference = is.getObject(); 41 Location location = is.getLocation(); 42 43 injectObject(op, objectReference, name, location); 44 } 45 46 public void injectObject(EnhancementOperation op, String objectReference, String propertyName, 47 Location location) 48 { 49 Defense.notNull(op, "op"); 50 Defense.notNull(propertyName, "propertyName"); 51 Defense.notNull(objectReference, "objectReference"); 52 53 Class propertyType = op.getPropertyType(propertyName); 54 if (propertyType == null) 55 propertyType = Object .class; 56 57 op.claimProperty(propertyName); 58 59 Object injectedValue = _provider.obtainValue(objectReference, location); 60 61 if (injectedValue == null) 62 throw new ApplicationRuntimeException(EnhanceMessages 63 .locatedValueIsNull(objectReference), location, null); 64 65 if (!propertyType.isAssignableFrom(injectedValue.getClass())) 66 throw new ApplicationRuntimeException(EnhanceMessages.incompatibleInjectType( 67 objectReference, 68 injectedValue, 69 propertyType), location, null); 70 71 String fieldName = op.addInjectedField("_$" + propertyName, propertyType, injectedValue); 72 73 String methodName = EnhanceUtils.createAccessorMethodName(propertyName); 74 75 op.addMethod( 76 Modifier.PUBLIC, 77 new MethodSignature(propertyType, methodName, null, null), 78 "return " + fieldName + ";"); 79 } 80 81 public void setProvider(InjectedValueProvider provider) 82 { 83 _provider = provider; 84 } 85 } | Popular Tags |