001 package net.sf.tacos.seam.annotations;
002
003 import java.lang.reflect.Method;
004
005 import net.sf.tacos.seam.Bijection;
006
007 import org.apache.hivemind.Location;
008 import org.apache.hivemind.service.BodyBuilder;
009 import org.apache.tapestry.annotations.AnnotationUtils;
010 import org.apache.tapestry.annotations.MethodAnnotationEnhancementWorker;
011 import org.apache.tapestry.enhance.EnhanceUtils;
012 import org.apache.tapestry.enhance.EnhancementOperation;
013 import org.apache.tapestry.event.PageDetachListener;
014 import org.apache.tapestry.spec.IComponentSpecification;
015 import org.jboss.seam.ScopeType;
016 import org.jboss.seam.Seam;
017 import org.jboss.seam.annotations.Out;
018
019 /**
020 * Outjects a Seam component
021 *
022 * @author Igor Drobiazko
023 */
024 public class OutAnnotationWorker implements MethodAnnotationEnhancementWorker {
025
026 public void performEnhancement(EnhancementOperation op,
027 IComponentSpecification spec, Method method, Location location) {
028 outjectSeamComponent(op, method, location);
029 }
030
031 public void outjectSeamComponent(EnhancementOperation op,
032 Method method, Location location) {
033 String property = AnnotationUtils.getPropertyName(method);
034 Out annotation = method.getAnnotation(Out.class);
035 Class<?> propertyType = op.getPropertyType(property);
036 if (propertyType == null)
037 propertyType = Object.class;
038 String name = annotation.value();
039 if(name.equals("")){
040 name = property;
041 }
042 ScopeType scope = annotation.scope();
043 if(scope==ScopeType.UNSPECIFIED){
044 scope = Seam.getComponentScope(propertyType);
045 }
046 BodyBuilder builder = new BodyBuilder();
047 builder.add(Bijection.class.getName()+".outject({0},", method.getName()+"()");
048 builder.addQuoted(name);
049 builder.add(",");
050 builder.addQuoted(scope.toString());
051 builder.add(",");
052 builder.addQuoted(String.valueOf(annotation.required()));
053 builder.add(");");
054 op.extendMethodImplementation(PageDetachListener.class,
055 EnhanceUtils.PAGE_DETACHED_SIGNATURE, builder.toString());
056 }
057 }