001 package net.sf.tacos.seam;
002
003 import static org.jboss.seam.ScopeType.STATELESS;
004 import static org.jboss.seam.ScopeType.UNSPECIFIED;
005
006 import org.apache.hivemind.ApplicationRuntimeException;
007 import org.jboss.seam.Component;
008 import org.jboss.seam.ScopeType;
009 import org.jboss.seam.contexts.Context;
010 import org.jboss.seam.core.Expressions;
011
012 /**
013 * Class responsible for bijection of Seam components.
014 *
015 * @author Igor Drobiazko
016 */
017 public class Bijection {
018
019 public static void outject(Object obj, String name, String scopeName, String required){
020 ScopeType scope = ScopeType.valueOf(scopeName);
021 if (obj==null && Boolean.valueOf(required)){
022 throw new ApplicationRuntimeException("@Out requires non-null value: " +name);
023 }
024 if(scope==STATELESS){
025 throw new ApplicationRuntimeException(
026 "cannot specify explicit scope=STATELESS on @Out: " +name);
027 }
028 if(!scope.isContextActive())return;
029 Context context = scope.getContext();
030 if (obj==null){
031 context.remove(name);
032 }else{
033 context.set(name, obj);
034 }
035 }
036
037 public static Object inject(Class<?> clazz, String name, ScopeType scope, boolean required, boolean create){
038 if(name.startsWith("#")){
039 Expressions e = Expressions.instance();
040 return e.createValueExpression(name).getValue();
041 }
042 if(scope==STATELESS){
043 throw new ApplicationRuntimeException(
044 "cannot specify explicit scope=STATELESS on @In: " +name);
045 }
046 if(scope==UNSPECIFIED){
047 return Component.getInstance(clazz, create);
048 }
049 if(scope.isContextActive()){
050 Object result = scope.getContext().get(name);
051 if(result==null && required){
052 throw new ApplicationRuntimeException("@In requires non-null value: " +name);
053 }
054 return result;
055 }
056 return null;
057 }
058 }