[weld-commits] Weld SVN: r4753 - in core/trunk/impl/src/main/java/org/jboss/weld: bean/builtin and 11 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Sat Nov 7 16:50:44 EST 2009


Author: pete.muir at jboss.org
Date: 2009-11-07 16:50:44 -0500 (Sat, 07 Nov 2009)
New Revision: 4753

Added:
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacade.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/BeanManagerBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/CallableMethodHandler.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/FacadeBeanResolvableTransformer.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEEBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEECallable.java
Removed:
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ManagerBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/
   core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/
Modified:
   core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/DisposalMethod.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/ProducerMethod.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/SessionBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractBuiltInBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ExtensionBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorFactoryBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/EEResourceProducerField.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PersistenceContextProducerField.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PrincipalBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/UserTransactionBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/conversation/AbstractConversationManager.java
   core/trunk/impl/src/main/java/org/jboss/weld/event/EventImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/ConstructorInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/FieldInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/MethodInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/ParameterInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/WeldInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldClass.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldConstructor.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldMethod.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldParameter.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldCallable.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldClass.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldParameter.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/ConstructorSignatureImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/MethodSignatureImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldConstructorImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldMethodImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldParameterImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
   core/trunk/impl/src/main/java/org/jboss/weld/util/Proxies.java
Log:
WELD-214, WELD-64, WELD-250, WELD-227, WELD-231

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -101,8 +101,6 @@
    // The Bean manager
    protected BeanManagerImpl manager;
 
-   private boolean _serializable;
-
    private boolean initialized;
 
    
@@ -143,7 +141,6 @@
       log.trace(CREATING_BEAN, getType());
       initName();
       initScopeType();
-      initSerializable();
       initProxyable();
       checkDelegateInjectionPoints();
    }
@@ -492,18 +489,6 @@
       return primitive;
    }
 
-   public boolean isSerializable()
-   {
-      // TODO WTF - why are we not caching the serializability of injection
-      // points!
-      return _serializable && checkInjectionPointsAreSerializable();
-   }
-
-   protected void initSerializable()
-   {
-      _serializable = Reflections.isSerializable(type);
-   }
-
    @Override
    public boolean isProxyable()
    {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -22,15 +22,12 @@
 import static org.jboss.weld.logging.messages.BeanMessage.USING_SCOPE;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
-import javassist.util.proxy.ProxyFactory;
 import javassist.util.proxy.ProxyObject;
 
 import javax.enterprise.context.Dependent;
@@ -52,22 +49,23 @@
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.DefinitionException;
 import org.jboss.weld.DeploymentException;
-import org.jboss.weld.serialization.spi.helpers.SerializableContextualInstance;
-import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
-import org.jboss.weld.context.SerializableContextualInstanceImpl;
-import org.jboss.weld.context.SerializableContextualImpl;
-import org.jboss.weld.ejb.EJBApiAbstraction;
 import org.jboss.weld.bean.proxy.DecoratorProxyMethodHandler;
 import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
+import org.jboss.weld.context.SerializableContextualImpl;
+import org.jboss.weld.context.SerializableContextualInstanceImpl;
+import org.jboss.weld.ejb.EJBApiAbstraction;
 import org.jboss.weld.injection.FieldInjectionPoint;
 import org.jboss.weld.injection.MethodInjectionPoint;
 import org.jboss.weld.introspector.WeldClass;
 import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.metadata.cache.MetaAnnotationStore;
+import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
+import org.jboss.weld.serialization.spi.helpers.SerializableContextualInstance;
 import org.jboss.weld.util.Beans;
 import org.jboss.weld.util.Proxies;
 import org.jboss.weld.util.Reflections;
 import org.jboss.weld.util.Strings;
+import org.jboss.weld.util.Proxies.TypeInfo;
 import org.slf4j.cal10n.LocLogger;
 
 /**
@@ -173,14 +171,7 @@
 
    protected void initProxyClassForDecoratedBean()
    {
-      Set<Type> types = new LinkedHashSet<Type>(getTypes());
-      types.add(TargetInstanceProxy.class);
-      ProxyFactory proxyFactory = Proxies.getProxyFactory(types);
-
-      @SuppressWarnings("unchecked")
-      Class<T> proxyClass = proxyFactory.createClass();
-
-      this.proxyClassForDecorators = proxyClass;
+      this.proxyClassForDecorators = Proxies.createProxyClass(TypeInfo.of(getTypes()).add(TargetInstanceProxy.class));
    }
 
    protected T applyDecorators(T instance, CreationalContext<T> creationalContext, InjectionPoint originalInjectionPoint)

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -21,6 +21,7 @@
 import static org.jboss.weld.logging.messages.BeanMessage.USING_DEFAULT_SCOPE;
 import static org.jboss.weld.logging.messages.BeanMessage.USING_SCOPE;
 
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -65,6 +66,7 @@
    private static final LocLogger log = loggerFactory().getLogger(BEAN);
    
    private Producer<T> producer;
+   private boolean passivationCapable;
 
    /**
     * Constructor
@@ -152,9 +154,28 @@
       getDeclaringBean().initialize(environment);
       super.initialize(environment);
       checkProducerReturnType();
+      initPassivationCapable();
    }
    
+   private void initPassivationCapable()
+   {
+      if (getAnnotatedItem().isFinal() && !Serializable.class.isAssignableFrom(getAnnotatedItem().getJavaClass()))
+      {
+         this.passivationCapable = false;
+      }
+      else
+      {
+         this.passivationCapable = true;
+      }
+   }
+
    @Override
+   public boolean isPassivationCapable()
+   {
+      return passivationCapable;
+   }
+   
+   @Override
    public Set<InjectionPoint> getInjectionPoints()
    {
       return getProducer().getInjectionPoints();
@@ -183,7 +204,7 @@
          {
             return;
          }
-         if (!Reflections.isSerializable(instance.getClass()) && Beans.isPassivationCapableBean(injectionPoint.getBean()))
+         if (!Reflections.isSerializable(instance.getClass()) && Beans.isPassivatingScope(injectionPoint.getBean(), manager))
          {
             if (injectionPoint.getMember() instanceof Field)
             {
@@ -238,18 +259,6 @@
       }
    }
    
-   @Override
-   protected void initSerializable()
-   {
-      // No-op
-   }
-
-   @Override
-   public boolean isSerializable()
-   {
-      return true;
-   }
-   
    /**
     * This operation is *not* threadsafe, and should not be called outside bootstrap
     * 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/DisposalMethod.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/DisposalMethod.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/DisposalMethod.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -96,7 +96,7 @@
    {
       // At least 1 parameter exists, already checked in constructor
       this.bindings = new HashSet<Annotation>();
-      this.bindings.addAll(disposalMethodInjectionPoint.getWBParameters().get(0).getQualifiers());
+      this.bindings.addAll(disposalMethodInjectionPoint.getWeldParameters().get(0).getQualifiers());
       initDefaultBindings();
    }
 
@@ -144,7 +144,7 @@
    }
 
    @Override
-   public boolean isSerializable()
+   public boolean isPassivationCapable()
    {
       // Not relevant
       return false;
@@ -179,7 +179,7 @@
 
    private void checkDisposalMethod()
    {
-      if (!disposalMethodInjectionPoint.getWBParameters().get(0).isAnnotationPresent(Disposes.class))
+      if (!disposalMethodInjectionPoint.getWeldParameters().get(0).isAnnotationPresent(Disposes.class))
       {
          throw new DefinitionException(disposalMethodInjectionPoint.toString() + " doesn't have @Dispose as first parameter");
       }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -83,6 +83,8 @@
    private Set<WeldInjectionPoint<?, ?>> resourceInjectionPoints;
 
    private ManagedBean<?> specializedBean;
+   
+   private boolean passivationCapable;
 
    /**
     * Creates a simple, annotation defined Web Bean
@@ -186,6 +188,7 @@
          initPostConstruct();
          initPreDestroy();
          initEEInjectionPoints();
+         initPassivationCapable();
          if (isInterceptionCandidate())
          {
             initDirectlyDefinedInterceptors();
@@ -255,6 +258,18 @@
       }
    }
 
+   private void initPassivationCapable()
+   {
+      this.passivationCapable = Reflections.isSerializable(getAnnotatedItem().getJavaClass());
+      // TODO Add in interceptor and decorator checks
+   }
+   
+   @Override
+   public boolean isPassivationCapable()
+   {
+      return passivationCapable;
+   }
+
    private void initEEInjectionPoints()
    {
       this.ejbInjectionPoints = Beans.getEjbInjectionPoints(this, getAnnotatedItem(), getManager());
@@ -296,7 +311,7 @@
                DecoratorImpl<?> decoratorBean = (DecoratorImpl<?>) decorator;
                for (WeldMethod<?, ?> decoratorMethod : decoratorBean.getAnnotatedItem().getWeldMethods())
                {
-                  WeldMethod<?, ?> method = getAnnotatedItem().getWBMethod(decoratorMethod.getSignature());
+                  WeldMethod<?, ?> method = getAnnotatedItem().getWeldMethod(decoratorMethod.getSignature());
                   if (method != null && !method.isStatic() && !method.isPrivate() && method.isFinal())
                   {
                      throw new DefinitionException("Decorated bean method " + method + " (decorated by "+ decoratorMethod + ") cannot be declarted final");

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/ProducerMethod.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ProducerMethod.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/ProducerMethod.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -133,7 +133,7 @@
     */
    protected void initProducerMethodInjectableParameters()
    {
-      for (WeldParameter<?, ?> parameter : method.getWBParameters())
+      for (WeldParameter<?, ?> parameter : method.getWeldParameters())
       {
          addInjectionPoint(ParameterInjectionPoint.of(this, parameter));
       }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -85,6 +85,8 @@
    }
 
    public abstract boolean isProxyable();
+   
+   public abstract boolean isPassivationCapable();
 
    public boolean isProxyRequired()
    {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/SessionBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/SessionBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/SessionBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -24,13 +24,9 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
-import javassist.util.proxy.ProxyFactory;
-import javassist.util.proxy.ProxyObject;
-
 import javax.decorator.Decorator;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.spi.CreationalContext;
@@ -49,7 +45,6 @@
 import org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler;
 import org.jboss.weld.bean.proxy.Marker;
 import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
-import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
 import org.jboss.weld.ejb.InternalEjbDescriptor;
 import org.jboss.weld.ejb.api.SessionObjectReference;
 import org.jboss.weld.ejb.spi.BusinessInterfaceDescriptor;
@@ -58,8 +53,10 @@
 import org.jboss.weld.introspector.WeldClass;
 import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.resources.ClassTransformer;
+import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
 import org.jboss.weld.util.Beans;
 import org.jboss.weld.util.Proxies;
+import org.jboss.weld.util.Proxies.TypeInfo;
 
 /**
  * An enterprise bean representation
@@ -169,8 +166,7 @@
                {
                   T instance = proxyClass.newInstance();
                   ctx.push(instance);
-                  ((ProxyObject) instance).setHandler(new EnterpriseBeanProxyMethodHandler<T>(SessionBean.this, ctx));
-                  return instance;
+                  return Proxies.attachMethodHandler(instance, new EnterpriseBeanProxyMethodHandler<T>(SessionBean.this, ctx));
                }
                catch (InstantiationException e)
                {
@@ -211,15 +207,7 @@
 
    protected void initProxyClass()
    {
-      Set<Type> types = new LinkedHashSet<Type>(getTypes());
-      types.add(EnterpriseBeanInstance.class);
-      types.add(Serializable.class);
-      ProxyFactory proxyFactory = Proxies.getProxyFactory(types);
-
-      @SuppressWarnings("unchecked")
-      Class<T> proxyClass = proxyFactory.createClass();
-
-      this.proxyClass = proxyClass;
+      this.proxyClass = Proxies.createProxyClass(TypeInfo.of(getTypes()).add(EnterpriseBeanInstance.class).add(Serializable.class));
    }
 
    /**
@@ -351,16 +339,10 @@
    }
    
    @Override
-   protected void initSerializable()
+   public boolean isPassivationCapable()
    {
-      // No-op
+      return getEjbDescriptor().isStateful();
    }
-   
-   @Override
-   public boolean isSerializable()
-   {
-      return true;
-   }
 
    public InternalEjbDescriptor<T> getEjbDescriptor()
    {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractBuiltInBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractBuiltInBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractBuiltInBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -112,6 +112,12 @@
    }
    
    @Override
+   public boolean isPassivationCapable()
+   {
+      return true;
+   }
+   
+   @Override
    public String getDescription()
    {
       return "Built-in bean " + getClass().getSimpleName();

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacade.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/AbstractFacade.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacade.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacade.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,149 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.jboss.weld.BeanManagerImpl;
+
+/**
+ * Common implementation for binding-type-based helpers
+ * 
+ * @author Gavin King
+ * 
+ * @param <T>
+ */
+public abstract class AbstractFacade<T, X>
+{
+   
+   protected static Type getFacadeType(InjectionPoint injectionPoint)
+   {
+      Type genericType = injectionPoint.getType();
+      if (genericType instanceof ParameterizedType )
+      {
+         return ((ParameterizedType) genericType).getActualTypeArguments()[0];
+      }
+      else
+      {
+         throw new IllegalStateException("Must have concrete type argument " + injectionPoint);
+      }
+   }
+
+   private final BeanManagerImpl beanManager;
+   private final InjectionPoint injectionPoint;
+   private final Type type;
+   private final Annotation[] qualifiers;
+   
+   protected AbstractFacade(Type type, Annotation[] qualifiers, InjectionPoint injectionPoint, BeanManagerImpl beanManager)
+   {
+      this.beanManager = beanManager;
+      this.injectionPoint = injectionPoint;
+      this.type = type;
+      this.qualifiers = qualifiers;
+   }
+
+   protected BeanManagerImpl getBeanManager()
+   {
+      return beanManager.getCurrent();
+   }
+   
+   protected Annotation[] getQualifiers()
+   {
+      return qualifiers;
+   }
+   
+   protected Type getType()
+   {
+      return type;
+   }
+   
+   protected InjectionPoint getInjectionPoint()
+   {
+      return injectionPoint;
+   }
+   
+
+   /**
+    * Gets a string representation
+    * 
+    * @return A string representation
+    */
+   @Override
+   public String toString()
+   {
+      return "Abstract facade implmentation";
+   }
+
+   @Override
+   public boolean equals(Object obj)
+   {
+      if (obj instanceof AbstractFacade<?, ?>)
+      {
+         AbstractFacade<?, ?> that = (AbstractFacade<?, ?>) obj;
+         return this.getType().equals(that.getType()) && Arrays.equals(this.getQualifiers(), that.getQualifiers());
+      }
+      else
+      {
+         return false;
+      }
+   }
+   
+   @Override
+   public int hashCode()
+   {
+      int hashCode = 17;
+      hashCode += getType().hashCode() * 5;
+      hashCode += Arrays.hashCode(getQualifiers()) * 7;
+      return hashCode;
+   }
+   
+   // Serialization
+
+   protected static class AbstractFacadeSerializationProxy implements Serializable
+   {
+      
+      private static final long serialVersionUID = -9118965837530101152L;
+      
+      private final InjectionPoint injectionPoint;
+      private final BeanManagerImpl beanManager;
+      
+      protected AbstractFacadeSerializationProxy(AbstractFacade<?, ?> facade)
+      {
+         this.injectionPoint = facade.getInjectionPoint();
+         this.beanManager = facade.getBeanManager();
+      }
+      
+      protected BeanManagerImpl getBeanManager()
+      {
+         return beanManager;
+      }
+      
+      protected InjectionPoint getInjectionPoint()
+      {
+         return injectionPoint;
+      }
+      
+   }
+
+
+}
\ No newline at end of file


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacade.java
___________________________________________________________________
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/AbstractFacadeBean.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import static org.jboss.weld.logging.Category.BEAN;
+import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
+import static org.jboss.weld.logging.messages.BeanMessage.DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.slf4j.cal10n.LocLogger;
+
+public abstract class AbstractFacadeBean<T> extends AbstractBuiltInBean<T>
+{
+   
+   private static final LocLogger log = loggerFactory().getLogger(BEAN);
+
+   protected AbstractFacadeBean(String idSuffix, BeanManagerImpl manager)
+   {
+      super(idSuffix, manager);
+   }
+
+   public T create(CreationalContext<T> creationalContext)
+   {
+      InjectionPoint injectionPoint = this.getManager().getCurrentInjectionPoint();
+      if (injectionPoint != null)
+      {
+         return newInstance(injectionPoint);
+      }
+      else
+      {
+         log.warn(DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED, toString());
+         return null;
+      }
+   }
+   
+   public void destroy(T instance, CreationalContext<T> creationalContext)
+   {
+      // TODO Auto-generated method stub
+   }
+   
+   protected abstract T newInstance(InjectionPoint injectionPoint);
+   
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/BeanManagerBean.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ManagerBean.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/BeanManagerBean.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/BeanManagerBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.util.collections.Arrays2;
+
+public class BeanManagerBean extends AbstractBuiltInBean<BeanManagerImpl>
+{
+   
+   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, BeanManagerImpl.class, BeanManager.class);
+   
+   public BeanManagerBean(BeanManagerImpl manager)
+   {
+      super(BeanManager.class.getSimpleName(), manager);
+   }
+
+   public BeanManagerImpl create(CreationalContext<BeanManagerImpl> creationalContext)
+   {
+      return getManager().getCurrent();
+   }
+
+   @Override
+   public Class<BeanManagerImpl> getType()
+   {
+      return BeanManagerImpl.class;
+   }
+
+   public Set<Type> getTypes()
+   {
+      return TYPES;
+   }
+
+   public void destroy(BeanManagerImpl instance, CreationalContext<BeanManagerImpl> creationalContext)
+   {
+      // No-op
+   }
+   
+   @Override
+   public String toString()
+   {
+      return "Built-in javax.inject.manager.Manager bean";
+   }
+   
+   
+}
\ No newline at end of file


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/BeanManagerBean.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/CallableMethodHandler.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/CallableMethodHandler.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/CallableMethodHandler.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,62 @@
+package org.jboss.weld.bean.builtin;
+
+import static org.jboss.weld.logging.Category.BEAN;
+import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
+import static org.jboss.weld.logging.messages.BeanMessage.CALL_PROXIED_METHOD;
+
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+
+import javassist.util.proxy.MethodHandler;
+
+import org.slf4j.cal10n.LocLogger;
+
+public class CallableMethodHandler implements MethodHandler, Serializable
+{
+   
+   private static final long serialVersionUID = -1348302663981663427L;
+   private static final LocLogger log = loggerFactory().getLogger(BEAN);
+
+   private final Callable<?> callable;
+   
+   public CallableMethodHandler(Callable<?> callable)
+   {
+      super();
+      this.callable = callable;
+   }
+
+   public Object invoke(Object self, Method proxiedMethod, Method proceed, Object[] args) throws Throwable
+   {
+      // Ignore calls to finalize
+      if ("finalize".equals(proxiedMethod.getName()))
+      {
+         return null;
+      }
+      Object instance = callable.call();
+      if (instance == null)
+      {
+         throw new NullPointerException("Unable to obtain instance. Bean: " + callable);
+      }
+      try
+      {
+         Object returnValue = proxiedMethod.invoke(instance, args);
+         log.trace(CALL_PROXIED_METHOD, proxiedMethod, instance, args, returnValue == null ? null : returnValue);
+         return returnValue;
+      }
+      catch (InvocationTargetException e) 
+      {
+         // Unwrap the ITE
+         if (e.getCause() != null)
+         {
+            throw e.getCause();
+         }
+         else
+         {
+            throw e;
+         }
+      }
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/CallableMethodHandler.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/EventBean.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.enterprise.event.Event;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.util.TypeLiteral;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.event.EventImpl;
+import org.jboss.weld.literal.AnyLiteral;
+import org.jboss.weld.resolution.ResolvableTransformer;
+import org.jboss.weld.util.collections.Arrays2;
+
+public class EventBean extends AbstractFacadeBean<Event<?>>
+{
+
+   private static final Class<Event<?>> TYPE = new TypeLiteral<Event<?>>() {}.getRawType();
+   private static final Set<Type> DEFAULT_TYPES = Arrays2.<Type>asSet(TYPE, Object.class);
+   private static final Annotation ANY = new AnyLiteral();
+   private static final Set<Annotation> DEFAULT_BINDINGS = new HashSet<Annotation>(Arrays.asList(ANY));
+   public static final ResolvableTransformer TRANSFORMER = new FacadeBeanResolvableTransformer(TYPE);
+   
+   public EventBean(BeanManagerImpl manager)
+   {
+      super(Event.class.getSimpleName(), manager);
+   }
+
+   @Override
+   public Class<Event<?>> getType()
+   {
+      return TYPE;
+   }
+
+   @Override
+   public Class<?> getBeanClass()
+   {
+      return EventImpl.class;
+   }
+
+   public Set<Type> getTypes()
+   {
+      return DEFAULT_TYPES;
+   }
+   
+   @Override
+   public Set<Annotation> getQualifiers()
+   {
+      return DEFAULT_BINDINGS;
+   }
+
+   @Override
+   protected Event<?> newInstance(InjectionPoint injectionPoint)
+   {
+      return EventImpl.of(injectionPoint, getManager());
+   }
+   
+   @Override
+   public String toString()
+   {
+      return "Built-in implicit javax.event.Event bean";
+   }
+   
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ExtensionBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ExtensionBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ExtensionBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -26,11 +26,13 @@
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.introspector.WeldClass;
+import org.jboss.weld.util.Reflections;
 
 /**
  * @author pmuir
  *
  */
+// TODO Move out of built in
 public class ExtensionBean extends AbstractBuiltInBean<Extension>
 {
    
@@ -38,12 +40,14 @@
    
    private final WeldClass<Extension> clazz;
    private final Extension instance;
+   private final boolean passivationCapable;
    
    public ExtensionBean(BeanManagerImpl manager, WeldClass<Extension> clazz, Extension instance)
    {
       super(new StringBuilder().append(ID_PREFIX).append(BEAN_ID_SEPARATOR).append(clazz.getName()).toString(), manager);
       this.clazz = clazz;
       this.instance = instance;
+      this.passivationCapable = Reflections.isSerializable(clazz.getJavaClass());
    }
 
    @Override
@@ -62,6 +66,12 @@
    {
       return clazz.isProxyable();
    }
+   
+   @Override
+   public boolean isPassivationCapable()
+   {
+      return passivationCapable;
+   }
 
    public Extension create(CreationalContext<Extension> creationalContext)
    {

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/FacadeBeanResolvableTransformer.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/FacadeBeanResolvableTransformer.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/FacadeBeanResolvableTransformer.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/FacadeBeanResolvableTransformer.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,101 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.enterprise.inject.Any;
+
+import org.jboss.weld.literal.AnyLiteral;
+import org.jboss.weld.resolution.ForwardingResolvable;
+import org.jboss.weld.resolution.Resolvable;
+import org.jboss.weld.resolution.ResolvableTransformer;
+
+/**
+ * AnnotatedItem transformer which can be used for FacadeBeans
+ * 
+ * @author Pete Muir
+ *
+ */
+public class FacadeBeanResolvableTransformer implements ResolvableTransformer
+{
+
+   private static final Set<Annotation> bindings;
+   
+   static
+   {
+      bindings = new HashSet<Annotation>();
+      bindings.add(new AnyLiteral());
+   }
+
+   private final Class<?> clazz;
+   private final HashSet<Type> types;
+
+   public FacadeBeanResolvableTransformer(Class<?> clazz)
+   {
+      this.clazz = clazz;
+      this.types = new HashSet<Type>();
+      types.add(clazz);
+   }
+
+   public Resolvable transform(final Resolvable resolvable)
+   {
+      if (resolvable.isAssignableTo(clazz))
+      {
+         return new ForwardingResolvable()
+         {
+
+            @Override
+            protected Resolvable delegate()
+            {
+               return resolvable;
+            }
+
+            @Override
+            public Set<Annotation> getQualifiers()
+            {
+               return Collections.unmodifiableSet(bindings);
+            }
+
+            @Override
+            public Set<Type> getTypeClosure()
+            {
+               return Collections.unmodifiableSet(types);
+            }
+
+            @Override
+            public boolean isAssignableTo(Class<?> c)
+            {
+               return c.isAssignableFrom(clazz);
+            }
+
+            @Override
+            public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
+            {
+               return Any.class.equals(annotationType);
+            }
+
+         };
+      }
+      return resolvable;
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/FacadeBeanResolvableTransformer.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/InstanceBean.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,87 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.util.TypeLiteral;
+import javax.inject.Provider;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.literal.AnyLiteral;
+import org.jboss.weld.resolution.ResolvableTransformer;
+import org.jboss.weld.util.collections.Arrays2;
+
+public class InstanceBean extends AbstractFacadeBean<Instance<?>>
+{
+
+   private static final Class<Instance<?>> INSTANCE_TYPE = new TypeLiteral<Instance<?>>() {}.getRawType();
+   private static final Class<Provider<?>> PROVIDER_TYPE = new TypeLiteral<Provider<?>>() {}.getRawType();
+   private static final Set<Type> DEFAULT_TYPES = Arrays2.<Type>asSet(INSTANCE_TYPE, PROVIDER_TYPE, Object.class);
+   private static final Any ANY = new AnyLiteral();
+   private static final Set<Annotation> DEFAULT_BINDINGS = new HashSet<Annotation>(Arrays.asList(ANY));
+   public static final ResolvableTransformer INSTANCE_TRANSFORMER = new FacadeBeanResolvableTransformer(INSTANCE_TYPE);
+   public static final ResolvableTransformer PROVIDER_TRANSFORMER = new FacadeBeanResolvableTransformer(PROVIDER_TYPE);
+   
+   public InstanceBean(BeanManagerImpl manager)
+   {
+      super(Instance.class.getSimpleName(), manager);
+   }
+
+   @Override
+   public Class<Instance<?>> getType()
+   {
+      return INSTANCE_TYPE;
+   }
+
+   @Override
+   public Class<?> getBeanClass()
+   {
+      return InstanceImpl.class;
+   }
+
+   public Set<Type> getTypes()
+   {
+      return DEFAULT_TYPES;
+   }
+   
+   @Override
+   public Set<Annotation> getQualifiers()
+   {
+      return DEFAULT_BINDINGS;
+   }
+
+   @Override
+   protected Instance<?> newInstance(InjectionPoint injectionPoint)
+   {
+      return InstanceImpl.of(injectionPoint, getManager());
+   }
+   
+   @Override
+   public String toString()
+   {
+      return "Built-in implicit javax.inject.Instance bean";
+   }
+   
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/facade/InstanceImpl.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,175 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.bean.builtin;
+
+import static org.jboss.weld.util.Reflections.EMPTY_ANNOTATIONS;
+
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.util.TypeLiteral;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.resolution.ResolvableWeldClass;
+import org.jboss.weld.util.Beans;
+import org.jboss.weld.util.Names;
+
+/**
+ * Helper implementation for Instance for getting instances
+ * 
+ * @author Gavin King
+ * 
+ * @param <T>
+ */
+public class InstanceImpl<T> extends AbstractFacade<T, Instance<T>> implements Instance<T>, Serializable
+{
+
+   private static final long serialVersionUID = -376721889693284887L;
+
+   public static <I> Instance<I> of(InjectionPoint injectionPoint, BeanManagerImpl beanManager)
+   {
+      return new InstanceImpl<I>(getFacadeType(injectionPoint), injectionPoint.getQualifiers().toArray(EMPTY_ANNOTATIONS), injectionPoint, beanManager);
+   }
+   
+   private InstanceImpl(Type type, Annotation[] qualifiers, InjectionPoint injectionPoint, BeanManagerImpl beanManager)
+   {
+      super(type, qualifiers, injectionPoint, beanManager);
+   }
+   
+   public T get()
+   {
+      Bean<?> bean = getBeanManager().getBean(ResolvableWeldClass.of(getType(), getQualifiers(), getBeanManager()), getQualifiers());
+      // Push in an empty CC to ensure that we don't get the CC of whatever is injecting the bean containing the Instance injection point
+      try
+      {
+         getBeanManager().pushDummyInjectionPoint();
+         @SuppressWarnings("unchecked")
+         T instance = (T) getBeanManager().getReference(bean, getType(), getBeanManager().createCreationalContext(bean));
+         return instance;
+      }
+      finally
+      {
+         getBeanManager().popDummyInjectionPoint();
+      }
+   }
+
+   /**
+    * Gets a string representation
+    * 
+    * @return A string representation
+    */
+   @Override
+   public String toString()
+   {
+      return new StringBuilder().append(Names.annotationsToString(getQualifiers())).append(" Instance<").append(getType()).append(">").toString();
+   }
+   
+   private Set<Bean<?>> getBeans()
+   {
+      return getBeanManager().getBeans(getType(), getQualifiers());
+   }
+   
+   public Iterator<T> iterator()
+   {
+      Collection<T> instances = new ArrayList<T>();
+      for (Bean<?> bean : getBeans())
+      {
+         Object object = getBeanManager().getReference(bean, getType(), getBeanManager().createCreationalContext(bean));
+         
+         @SuppressWarnings("unchecked")
+         T instance = (T) object;
+         
+         instances.add(instance);
+      }
+      return instances.iterator();
+   }
+
+   public boolean isAmbiguous()
+   {
+      return getBeans().size() > 1;
+   }
+
+   public boolean isUnsatisfied()
+   {
+      return getBeans().size() == 0;
+   }
+
+   public Instance<T> select(Annotation... qualifiers)
+   {
+      return selectInstance(this.getType(), qualifiers);
+   }
+
+   public <U extends T> Instance<U> select(Class<U> subtype, Annotation... qualifiers)
+   {
+      return selectInstance(subtype, qualifiers);
+   }
+
+   public <U extends T> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers)
+   {
+      return selectInstance(subtype.getType(), qualifiers);
+   }
+   
+   private <U extends T> Instance<U> selectInstance(Type subtype, Annotation[] newQualifiers)
+   {
+      return new InstanceImpl<U>(
+            subtype,
+            Beans.mergeInQualifiers(getQualifiers(), newQualifiers), 
+            getInjectionPoint(),
+            getBeanManager());
+   }
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy extends AbstractFacadeSerializationProxy
+   {
+
+      private static final long serialVersionUID = 9181171328831559650L;
+
+      public SerializationProxy(InstanceImpl<?> instance)
+      {
+         super(instance);
+      }
+      
+      private Object readResolve()
+      {
+         return InstanceImpl.of(getInjectionPoint(), getBeanManager());
+      }
+      
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ManagerBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ManagerBean.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ManagerBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -1,66 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.weld.bean.builtin;
-
-import java.lang.reflect.Type;
-import java.util.Set;
-
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.spi.BeanManager;
-
-import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.util.collections.Arrays2;
-
-public class ManagerBean extends AbstractBuiltInBean<BeanManagerImpl>
-{
-   
-   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, BeanManagerImpl.class, BeanManager.class);
-   
-   public ManagerBean(BeanManagerImpl manager)
-   {
-      super(BeanManager.class.getSimpleName(), manager);
-   }
-
-   public BeanManagerImpl create(CreationalContext<BeanManagerImpl> creationalContext)
-   {
-      return getManager().getCurrent();
-   }
-
-   @Override
-   public Class<BeanManagerImpl> getType()
-   {
-      return BeanManagerImpl.class;
-   }
-
-   public Set<Type> getTypes()
-   {
-      return TYPES;
-   }
-
-   public void destroy(BeanManagerImpl instance, CreationalContext<BeanManagerImpl> creationalContext)
-   {
-      // No-op
-   }
-   
-   @Override
-   public String toString()
-   {
-      return "Built-in javax.inject.manager.Manager bean";
-   }
-   
-   
-}
\ No newline at end of file

Copied: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee (from rev 4715, core/trunk/impl/src/main/java/org/jboss/weld/bean/ee)

Added: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEEBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEEBean.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEEBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,67 @@
+package org.jboss.weld.bean.builtin.ee;
+
+import java.io.Serializable;
+import java.lang.reflect.Type;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import javax.enterprise.context.spi.CreationalContext;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.DefinitionException;
+import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
+import org.jboss.weld.bean.builtin.CallableMethodHandler;
+import org.jboss.weld.util.Proxies;
+import org.jboss.weld.util.Proxies.TypeInfo;
+
+public abstract class AbstractEEBean<T> extends AbstractBuiltInBean<T>
+{
+   
+   private final T proxy;
+   private final Class<T> type;
+   private final Set<Type> types;
+
+   protected AbstractEEBean(Class<T> type, Callable<T> callable, BeanManagerImpl beanManager)
+   {
+      super(type.getSimpleName(), beanManager);
+      this.type = type;
+      this.types = new HashSet<Type>();
+      this.types.add(Object.class);
+      this.types.add(type);
+      try
+      {
+         this.proxy = Proxies.<T>createProxy(new CallableMethodHandler(callable), TypeInfo.of(getTypes()).add(Serializable.class));
+      }
+      catch (InstantiationException e)
+      {
+         throw new DefinitionException("Could not instantiate client proxy for " + this, e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new DefinitionException("Could not access bean correctly when creating client proxy for " + this, e);
+      }
+   }
+
+   public T create(CreationalContext<T> creationalContext)
+   {
+      return proxy;
+   }
+   
+   public void destroy(T instance, CreationalContext<T> creationalContext) 
+   {
+      // no-op
+   }
+   
+   @Override
+   public Class<T> getType()
+   {
+      return type;
+   }
+   
+   public Set<Type> getTypes()
+   {
+      return types;
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEEBean.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEECallable.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEECallable.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEECallable.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -0,0 +1,25 @@
+package org.jboss.weld.bean.builtin.ee;
+
+import java.io.Serializable;
+import java.util.concurrent.Callable;
+
+import org.jboss.weld.BeanManagerImpl;
+
+public abstract class AbstractEECallable<V> implements Callable<V>, Serializable
+{
+   
+   private static final long serialVersionUID = 2685728358029843185L;
+   
+   private final BeanManagerImpl beanManager;
+   
+   protected AbstractEECallable(BeanManagerImpl beanManager)
+   {
+      this.beanManager = beanManager;
+   }
+
+   public BeanManagerImpl getBeanManager()
+   {
+      return beanManager;
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/AbstractEECallable.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/DefaultValidatorBean.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,60 +14,54 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
-import java.lang.reflect.Type;
-import java.util.Set;
-
-import javax.enterprise.context.spi.CreationalContext;
 import javax.validation.Validator;
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.Container;
-import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
-import org.jboss.weld.util.collections.Arrays2;
 import org.jboss.weld.validation.spi.ValidationServices;
 
 /**
  * @author pmuir
  *
  */
-public class DefaultValidatorBean extends AbstractBuiltInBean<Validator>
+public class DefaultValidatorBean extends AbstractEEBean<Validator>
 {
-
-   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, Validator.class);
    
-   public DefaultValidatorBean(BeanManagerImpl manager)
+   private static class ValidatorCallable extends AbstractEECallable<Validator>
    {
-      super(Validator.class.getSimpleName(), manager);
-   }
+      
+      private static final long serialVersionUID = 2455850340620002351L;
 
-   @Override
-   public Class<Validator> getType()
-   {
-      return Validator.class;
-   }
+      public ValidatorCallable(BeanManagerImpl beanManager)
+      {
+         super(beanManager);
+      }
 
-   public Set<Type> getTypes()
-   {
-      return TYPES;
-   }
-
-   public Validator create(CreationalContext<Validator> creationalContext)
-   {
-      if (getManager().getServices().contains(ValidationServices.class))
+      public Validator call() throws Exception
       {
-         return Container.instance().deploymentServices().get(ValidationServices.class).getDefaultValidatorFactory().getValidator();
+         if (getBeanManager().getServices().contains(ValidationServices.class))
+         {
+            return Container.instance().deploymentServices().get(ValidationServices.class).getDefaultValidatorFactory().getValidator();
+         }
+         else
+         {
+            throw new IllegalStateException("ValidationServices not available");
+         }
       }
-      else
+      
+      @Override
+      public String toString()
       {
-         throw new IllegalStateException("ValidationServices not available");
+         return "Built-in Validator bean";
       }
+      
    }
-
-   public void destroy(Validator instance, CreationalContext<Validator> creationalContext)
+   
+   public DefaultValidatorBean(BeanManagerImpl manager)
    {
-      // No-op      
+      super(Validator.class, new ValidatorCallable(manager), manager);
    }
 
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorFactoryBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/DefaultValidatorFactoryBean.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/DefaultValidatorFactoryBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,59 +14,53 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
-import java.lang.reflect.Type;
-import java.util.Set;
-
-import javax.enterprise.context.spi.CreationalContext;
 import javax.validation.ValidatorFactory;
 
 import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
-import org.jboss.weld.util.collections.Arrays2;
 import org.jboss.weld.validation.spi.ValidationServices;
 
 /**
  * @author pmuir
  *
  */
-public class DefaultValidatorFactoryBean extends AbstractBuiltInBean<ValidatorFactory>
+public class DefaultValidatorFactoryBean extends AbstractEEBean<ValidatorFactory>
 {
-
-   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, ValidatorFactory.class);
    
-   public DefaultValidatorFactoryBean(BeanManagerImpl manager)
+   private static class ValidatorFactoryCallable extends AbstractEECallable<ValidatorFactory>
    {
-      super(ValidatorFactory.class.getSimpleName(), manager);
-   }
+      
+      private static final long serialVersionUID = -8511087629930598385L;
 
-   @Override
-   public Class<ValidatorFactory> getType()
-   {
-      return ValidatorFactory.class;
-   }
+      public ValidatorFactoryCallable(BeanManagerImpl beanManager)
+      {
+         super(beanManager);
+      }
 
-   public Set<Type> getTypes()
-   {
-      return TYPES;
-   }
-
-   public ValidatorFactory create(CreationalContext<ValidatorFactory> creationalContext)
-   {
-      if (getManager().getServices().contains(ValidationServices.class))
+      public ValidatorFactory call() throws Exception
       {
-         return getManager().getServices().get(ValidationServices.class).getDefaultValidatorFactory();
+         if (getBeanManager().getServices().contains(ValidationServices.class))
+         {
+            return getBeanManager().getServices().get(ValidationServices.class).getDefaultValidatorFactory();
+         }
+         else
+         {
+            throw new IllegalStateException("ValidationServices not available");
+         }
       }
-      else
+      
+      @Override
+      public String toString()
       {
-         throw new IllegalStateException("ValidationServices not available");
+         return "Built-in ValidatorFactory bean";
       }
+      
    }
-
-   public void destroy(ValidatorFactory instance, CreationalContext<ValidatorFactory> creationalContext)
+   
+   public DefaultValidatorFactoryBean(BeanManagerImpl beanManager)
    {
-      // No-op      
+      super(ValidatorFactory.class, new ValidatorFactoryCallable(beanManager), beanManager);
    }
 
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/EEResourceProducerField.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/EEResourceProducerField.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/EEResourceProducerField.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,15 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
+import java.io.Serializable;
+
+import javax.enterprise.context.spi.Contextual;
+import javax.enterprise.context.spi.CreationalContext;
+
 import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.Container;
 import org.jboss.weld.bean.AbstractClassBean;
 import org.jboss.weld.bean.ProducerField;
+import org.jboss.weld.bean.builtin.CallableMethodHandler;
 import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
 import org.jboss.weld.ejb.EJBApiAbstraction;
 import org.jboss.weld.introspector.WeldField;
 import org.jboss.weld.persistence.PersistenceApiAbstraction;
+import org.jboss.weld.serialization.spi.ContextualStore;
+import org.jboss.weld.util.Proxies;
+import org.jboss.weld.util.Reflections;
+import org.jboss.weld.util.Proxies.TypeInfo;
 import org.jboss.weld.ws.WSApiAbstraction;
 
 /**
@@ -32,6 +43,49 @@
 public class EEResourceProducerField<X, T> extends ProducerField<X, T>
 {
    
+   
+   private static class EEResourceCallable<T> extends AbstractEECallable<T>
+   {
+      
+      private static final long serialVersionUID = 6287931036073200963L;
+      
+      private final String beanId;
+      private transient T instance;
+
+      public EEResourceCallable(BeanManagerImpl beanManager, ProducerField<?, T> producerField/*, CreationalContext<T> creationalContext*/)
+      {
+         super(beanManager);
+         this.beanId = producerField.getId();
+      }
+
+      public T call() throws Exception
+      {
+         if (instance == null)
+         {
+            Contextual<T> contextual = Container.instance().deploymentServices().get(ContextualStore.class).<Contextual<T>, T>getContextual(beanId);
+            if (contextual instanceof EEResourceProducerField<?, ?>)
+            {
+               @SuppressWarnings("unchecked")
+               EEResourceProducerField<?, T> bean = (EEResourceProducerField<?, T>) contextual;
+               
+               this.instance = bean.createUnderlying(getBeanManager().createCreationalContext(bean));
+            }
+            else
+            {
+               throw new IllegalStateException("Bean is not an EE resource producer field. Bean: " + contextual);
+            }
+         }
+         return instance;
+      }
+      
+      @Override
+      public String toString()
+      {
+         return beanId;
+      }
+      
+   }
+   
    /**
     * Creates an EE resource producer field
     * 
@@ -44,10 +98,31 @@
    {
       return new EEResourceProducerField<X, T>(field, declaringBean, manager);
    }
+   
+   private final T proxy;
 
    protected EEResourceProducerField(WeldField<T, X> field, AbstractClassBean<X> declaringBean, BeanManagerImpl manager)
    {
       super(field, declaringBean, manager);
+      try
+      {
+         if (Reflections.isFinal(field.getJavaClass()) || Serializable.class.isAssignableFrom(field.getJavaClass()))
+         {
+            this.proxy = null;
+         }
+         else
+         {
+            this.proxy = Proxies.<T>createProxy(new CallableMethodHandler(new EEResourceCallable<T>(getManager(), this)), TypeInfo.of(getTypes()).add(Serializable.class));
+         }
+      }
+      catch (InstantiationException e)
+      {
+         throw new RuntimeException("Error creating proxy for resource producer field. Field: " + this, e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException("Error creating proxy for resource field. Field: " + this, e);
+      }
    }
    
    @Override
@@ -70,5 +145,33 @@
          throw new IllegalStateException("Tried to create an EEResourceProducerField, but no @Resource, @PersistenceContext, @PersistenceUnit, @WebServiceRef or @EJB is present " + getAnnotatedItem());
       }
    }
+   
+   @Override
+   public T create(CreationalContext<T> creationalContext)
+   {
+      if (proxy == null)
+      {
+         return createUnderlying(creationalContext);
+      }
+      else
+      {
+         return proxy;
+      }
+   }
+   
+   /**
+    * Access to the underlying producer field
+    */
+   private T createUnderlying(CreationalContext<T> creationalContext)
+   {
+      return super.create(creationalContext);
+   }
+   
+   @Override
+   public boolean isPassivationCapable()
+   {
+      return true;
+   }
 
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PersistenceContextProducerField.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/PersistenceContextProducerField.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PersistenceContextProducerField.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
 import javax.persistence.EntityManager;
 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PrincipalBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/PrincipalBean.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/PrincipalBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,59 +14,53 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
-import java.lang.reflect.Type;
 import java.security.Principal;
-import java.util.Set;
 
-import javax.enterprise.context.spi.CreationalContext;
-
 import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
 import org.jboss.weld.security.spi.SecurityServices;
-import org.jboss.weld.util.collections.Arrays2;
 
 /**
  * @author pmuir
- *
+ * 
  */
-public class PrincipalBean extends AbstractBuiltInBean<Principal>
+public class PrincipalBean extends AbstractEEBean<Principal>
 {
 
-   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, Principal.class);
-   
-   public PrincipalBean(BeanManagerImpl manager)
+   private static class PrincipalCallable extends AbstractEECallable<Principal>
    {
-      super(Principal.class.getSimpleName(), manager);
-   }
 
-   @Override
-   public Class<Principal> getType()
-   {
-      return Principal.class;
-   }
+      private static final long serialVersionUID = -6603676793378907096L;
 
-   public Set<Type> getTypes()
-   {
-      return TYPES;
-   }
+      public PrincipalCallable(BeanManagerImpl beanManager)
+      {
+         super(beanManager);
+      }
 
-   public Principal create(CreationalContext<Principal> creationalContext)
-   {
-      if (getManager().getServices().contains(SecurityServices.class))
+      public Principal call() throws Exception
       {
-         return getManager().getServices().get(SecurityServices.class).getPrincipal();
+         if (getBeanManager().getServices().contains(SecurityServices.class))
+         {
+            return getBeanManager().getServices().get(SecurityServices.class).getPrincipal();
+         }
+         else
+         {
+            throw new IllegalStateException("SecurityServices not available");
+         }
       }
-      else
+      
+      @Override
+      public String toString()
       {
-         throw new IllegalStateException("SecurityServices not available");
+         return "Built-in Principal bean";
       }
+
    }
 
-   public void destroy(Principal instance, CreationalContext<Principal> creationalContext)
+   public PrincipalBean(BeanManagerImpl beanManager)
    {
-      // No-op      
+      super(Principal.class, new PrincipalCallable(beanManager), beanManager);
    }
 
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/UserTransactionBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ee/UserTransactionBean.java	2009-11-06 12:58:14 UTC (rev 4715)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/ee/UserTransactionBean.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -14,59 +14,53 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.weld.bean.ee;
+package org.jboss.weld.bean.builtin.ee;
 
-import java.lang.reflect.Type;
-import java.util.Set;
-
-import javax.enterprise.context.spi.CreationalContext;
 import javax.transaction.UserTransaction;
 
 import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
 import org.jboss.weld.transaction.spi.TransactionServices;
-import org.jboss.weld.util.collections.Arrays2;
 
 /**
  * @author pmuir
  *
  */
-public class UserTransactionBean extends AbstractBuiltInBean<UserTransaction>
+public class UserTransactionBean extends AbstractEEBean<UserTransaction>
 {
-
-   private static final Set<Type> TYPES = Arrays2.<Type>asSet(Object.class, UserTransaction.class);
    
-   public UserTransactionBean(BeanManagerImpl manager)
+   private static class UserTransactionCallable extends AbstractEECallable<UserTransaction>
    {
-      super(UserTransaction.class.getSimpleName(), manager);
-   }
+      
+      private static final long serialVersionUID = -6320641773968440920L;
 
-   @Override
-   public Class<UserTransaction> getType()
-   {
-      return UserTransaction.class;
-   }
+      public UserTransactionCallable(BeanManagerImpl beanManager)
+      {
+         super(beanManager);
+      }
 
-   public Set<Type> getTypes()
-   {
-      return TYPES;
-   }
-
-   public UserTransaction create(CreationalContext<UserTransaction> creationalContext)
-   {
-      if (getManager().getServices().contains(TransactionServices.class))
+      public UserTransaction call() throws Exception
       {
-         return getManager().getServices().get(TransactionServices.class).getUserTransaction();
+         if (getBeanManager().getServices().contains(TransactionServices.class))
+         {
+            return getBeanManager().getServices().get(TransactionServices.class).getUserTransaction();
+         }
+         else
+         {
+            throw new IllegalStateException("TransactionServices not available");
+         }
       }
-      else
+      
+      @Override
+      public String toString()
       {
-         throw new IllegalStateException("TransactionServices not available");
+         return "Built-in UserTransaction bean";
       }
+      
    }
-
-   public void destroy(UserTransaction instance, CreationalContext<UserTransaction> creationalContext)
+   
+   public UserTransactionBean(BeanManagerImpl beanManager)
    {
-      // No-op      
+      super(UserTransaction.class, new UserTransactionCallable(beanManager), beanManager);
    }
 
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -17,13 +17,8 @@
 package org.jboss.weld.bean.proxy;
 
 import java.io.Serializable;
-import java.lang.reflect.Type;
-import java.util.LinkedHashSet;
-import java.util.Set;
 import java.util.concurrent.Callable;
 
-import javassist.util.proxy.ProxyFactory;
-
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.BeanManagerImpl;
@@ -31,6 +26,7 @@
 import org.jboss.weld.DefinitionException;
 import org.jboss.weld.serialization.spi.ContextualStore;
 import org.jboss.weld.util.Proxies;
+import org.jboss.weld.util.Proxies.TypeInfo;
 import org.jboss.weld.util.collections.ConcurrentCache;
 
 /**
@@ -74,20 +70,9 @@
     */
    private static <T> T createClientProxy(Bean<T> bean, BeanManagerImpl manager, String id) throws RuntimeException
    {
-      
       try
       {
-         ClientProxyMethodHandler proxyMethodHandler = new ClientProxyMethodHandler(bean, manager, id);
-         Set<Type> classes = new LinkedHashSet<Type>(bean.getTypes());
-         classes.add(Serializable.class);
-         ProxyFactory proxyFactory = Proxies.getProxyFactory(classes);
-         proxyFactory.setHandler(proxyMethodHandler);
-         Class<?> clazz = proxyFactory.createClass();
-         
-         @SuppressWarnings("unchecked")
-         T instance = (T) clazz.newInstance();
-         
-         return instance;
+         return Proxies.<T>createProxy(new ClientProxyMethodHandler(bean, manager, id), TypeInfo.of(bean.getTypes()).add(Serializable.class));
       }
       catch (InstantiationException e)
       {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -73,19 +73,20 @@
     * 
     * @throws Throwable if the method invocation fails.
     */
+   @Override
    protected Object doInvoke(Object self, Method method, Method proceed, Object[] args) throws Throwable
    {
       MethodSignature methodSignature = new MethodSignatureImpl(method);
       for (SerializableContextualInstance<Decorator<Object>, Object> beanInstance : decoratorInstances)
       {
          WeldMethod<?, ?> decoratorMethod;
-         if (beanInstance.getContextual().get() instanceof DecoratorImpl)
+         if (beanInstance.getContextual().get() instanceof DecoratorImpl<?>)
          {
-            decoratorMethod = ((DecoratorImpl)beanInstance.getContextual().get()).getAnnotatedItem().getWBMethod(methodSignature);
+            decoratorMethod = ((DecoratorImpl<?>)beanInstance.getContextual().get()).getAnnotatedItem().getWeldMethod(methodSignature);
          }
          else if (beanInstance.getContextual().get() instanceof AnnotatedItemProvidingDecoratorWrapper)
          {
-            decoratorMethod = ((AnnotatedItemProvidingDecoratorWrapper)beanInstance.getContextual().get()).getAnnotatedItem().getWBMethod(methodSignature);
+            decoratorMethod = ((AnnotatedItemProvidingDecoratorWrapper)beanInstance.getContextual().get()).getAnnotatedItem().getWeldMethod(methodSignature);
          }
          else
          {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -46,8 +46,8 @@
 import org.jboss.weld.bean.ProducerMethod;
 import org.jboss.weld.bean.RIBean;
 import org.jboss.weld.bean.SessionBean;
-import org.jboss.weld.bean.ee.EEResourceProducerField;
-import org.jboss.weld.bean.ee.PersistenceContextProducerField;
+import org.jboss.weld.bean.builtin.ee.EEResourceProducerField;
+import org.jboss.weld.bean.builtin.ee.PersistenceContextProducerField;
 import org.jboss.weld.bootstrap.events.ProcessBeanImpl;
 import org.jboss.weld.bootstrap.events.ProcessBeanInjectionTarget;
 import org.jboss.weld.bootstrap.events.ProcessManagedBeanImpl;

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -28,14 +28,14 @@
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.bean.RIBean;
+import org.jboss.weld.bean.builtin.BeanManagerBean;
+import org.jboss.weld.bean.builtin.EventBean;
 import org.jboss.weld.bean.builtin.InjectionPointBean;
-import org.jboss.weld.bean.builtin.ManagerBean;
-import org.jboss.weld.bean.builtin.facade.EventBean;
-import org.jboss.weld.bean.builtin.facade.InstanceBean;
-import org.jboss.weld.bean.ee.DefaultValidatorBean;
-import org.jboss.weld.bean.ee.DefaultValidatorFactoryBean;
-import org.jboss.weld.bean.ee.PrincipalBean;
-import org.jboss.weld.bean.ee.UserTransactionBean;
+import org.jboss.weld.bean.builtin.InstanceBean;
+import org.jboss.weld.bean.builtin.ee.DefaultValidatorBean;
+import org.jboss.weld.bean.builtin.ee.DefaultValidatorFactoryBean;
+import org.jboss.weld.bean.builtin.ee.PrincipalBean;
+import org.jboss.weld.bean.builtin.ee.UserTransactionBean;
 import org.jboss.weld.bootstrap.api.Environment;
 import org.jboss.weld.bootstrap.api.ServiceRegistry;
 import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
@@ -80,7 +80,7 @@
       beanDeployer = new BeanDeployer(beanManager, ejbDescriptors);
       
       // Must at the Manager bean straight away, as it can be injected during startup!
-      beanManager.addBean(new ManagerBean(beanManager));
+      beanManager.addBean(new BeanManagerBean(beanManager));
       
       parseBeansXml();
    }
@@ -150,7 +150,7 @@
       }
       beanDeployer.createBeans().deploy();
    }
-
+   
    public void afterBeanDiscovery(Environment environment)
    {
       doAfterBeanDiscovery(beanManager.getBeans());
@@ -158,13 +158,13 @@
       doAfterBeanDiscovery(beanManager.getInterceptors());
    }
 
-   private void doAfterBeanDiscovery(List<? extends Bean> beanList)
+   private void doAfterBeanDiscovery(List<? extends Bean<?>> beanList)
    {
       for (Bean<?> bean : beanList)
       {
-         if (bean instanceof RIBean)
+         if (bean instanceof RIBean<?>)
          {
-            ((RIBean) bean).initializeAfterBeanDiscovery();
+            ((RIBean<?>) bean).initializeAfterBeanDiscovery();
          }
       }
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -39,7 +39,7 @@
 import org.jboss.weld.ContextualStoreImpl;
 import org.jboss.weld.Validator;
 import org.jboss.weld.Container.Status;
-import org.jboss.weld.bean.builtin.ManagerBean;
+import org.jboss.weld.bean.builtin.BeanManagerBean;
 import org.jboss.weld.bootstrap.api.Bootstrap;
 import org.jboss.weld.bootstrap.api.Environment;
 import org.jboss.weld.bootstrap.api.Lifecycle;
@@ -343,7 +343,7 @@
          extensionBeanDeployer.deployBeans();
          
          // Add the Deployment BeanManager Bean to the Deployment BeanManager
-         deploymentManager.addBean(new ManagerBean(deploymentManager));
+         deploymentManager.addBean(new BeanManagerBean(deploymentManager));
          
          // Re-Read the deployment structure, this will be the physical structure, and will add in BDAs for any extensions outside a physical BDA
          beanDeployments = deploymentVisitor.visit();

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -59,7 +59,7 @@
    public void addBean(Bean<?> bean)
    {
       BeanManagerImpl beanManager = getOrCreateBeanDeployment(bean.getBeanClass()).getBeanManager();
-      if (bean instanceof Interceptor)
+      if (bean instanceof Interceptor<?>)
       {
          beanManager.addInterceptor((Interceptor<?>) bean);
       }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/conversation/AbstractConversationManager.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/conversation/AbstractConversationManager.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/conversation/AbstractConversationManager.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -44,7 +44,7 @@
 import java.util.concurrent.TimeUnit;
 
 import javax.enterprise.context.Conversation;
-import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 
 import org.jboss.weld.Container;
@@ -65,8 +65,8 @@
    private static final LocLogger log = loggerFactory().getLogger(CONVERSATION);
 
    // The current conversation
-   @Inject @Any
-   private ConversationImpl currentConversation;
+   @Inject
+   private Instance<ConversationImpl> currentConversation;
 
    // The conversation timeout in milliseconds waiting for access to a blocked
    // conversation
@@ -129,7 +129,7 @@
          // If all goes well, set the identity of the current conversation to
          // match the fetched long-running one
          String oldConversation = currentConversation.toString();
-         currentConversation.switchTo(resumedConversationEntry.getConversation());
+         currentConversation.get().switchTo(resumedConversationEntry.getConversation());
          log.trace(CONVERSATION_SWITCHED, oldConversation, currentConversation);
       }
    }
@@ -139,10 +139,10 @@
    public void cleanupConversation()
    {
       log.trace(CLEANING_UP_CONVERSATION, currentConversation);
-      String cid = currentConversation.getUnderlyingId();
-      if (!currentConversation.isTransient())
+      String cid = currentConversation.get().getUnderlyingId();
+      if (!currentConversation.get().isTransient())
       {
-         Future<?> terminationHandle = scheduleForTermination(cid, currentConversation.getTimeout());
+         Future<?> terminationHandle = scheduleForTermination(cid, currentConversation.get().getTimeout());
          // When the conversation ends, a long-running conversation needs to
          // start its self-destruct. We can have the case where the conversation
          // is a previously known conversation (that had it's termination
@@ -157,7 +157,7 @@
          }
          else
          {
-            ConversationEntry conversationEntry = ConversationEntry.of(getBeanStore(cid), currentConversation, terminationHandle);
+            ConversationEntry conversationEntry = ConversationEntry.of(getBeanStore(cid), currentConversation.get(), terminationHandle);
             longRunningConversations.put(cid, conversationEntry);
          }
          log.trace(CONVERSATION_TERMINATION_SCHEDULED, currentConversation);
@@ -183,12 +183,12 @@
       // Conversation.begin(String), we need to unlock the original conversation
       // and re-schedule
       // it for termination
-      String originalCid = currentConversation.getOriginalId();
+      String originalCid = currentConversation.get().getOriginalId();
       ConversationEntry longRunningConversation = originalCid == null ? null : longRunningConversations.get(originalCid);
       if (longRunningConversation != null)
       {
          longRunningConversation.unlock();
-         longRunningConversation.reScheduleTermination(scheduleForTermination(originalCid, currentConversation.getTimeout()));
+         longRunningConversation.reScheduleTermination(scheduleForTermination(originalCid, currentConversation.get().getTimeout()));
       }
    }
 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/event/EventImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/event/EventImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/event/EventImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -16,19 +16,28 @@
  */
 package org.jboss.weld.event;
 
+import static org.jboss.weld.util.Reflections.EMPTY_ANNOTATIONS;
+
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
 import javax.enterprise.event.Event;
+import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.util.TypeLiteral;
 
 import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.bean.builtin.facade.AbstractFacade;
+import org.jboss.weld.bean.builtin.AbstractFacade;
+import org.jboss.weld.literal.DefaultLiteral;
+import org.jboss.weld.util.Beans;
+import org.jboss.weld.util.Names;
 import org.jboss.weld.util.Observers;
-import org.jboss.weld.util.Strings;
 
 /**
  * Implementation of the Event interface
@@ -38,67 +47,100 @@
  * @param <T> The type of event being wrapped
  * @see javax.enterprise.event.Event
  */
-public class EventImpl<T> extends AbstractFacade<T, Event<T>> implements Event<T>
+public class EventImpl<T> extends AbstractFacade<T, Event<T>> implements Event<T>, Serializable
 {
    
    private static final long serialVersionUID = 656782657242515455L;
-   private static final Annotation[] EMPTY_BINDINGS = new Annotation[0];
+   private static final Default DEFAULT = new DefaultLiteral();
 
-   public static <E> EventImpl<E> of(Type eventType, BeanManagerImpl manager, Set<Annotation> bindings)
+   public static <E> EventImpl<E> of(InjectionPoint injectionPoint, BeanManagerImpl beanManager)
    {
-      return new EventImpl<E>(eventType, manager, bindings);
+      return new EventImpl<E>(getFacadeType(injectionPoint), getFacadeEventQualifiers(injectionPoint), injectionPoint, beanManager);
    }
    
+   private static Annotation[] getFacadeEventQualifiers(InjectionPoint injectionPoint)
+   {
+      if (!injectionPoint.getAnnotated().isAnnotationPresent(Default.class))
+      {
+         Set<Annotation> qualifers = new HashSet<Annotation>(injectionPoint.getQualifiers());
+         qualifers.remove(DEFAULT);
+         return qualifers.toArray(EMPTY_ANNOTATIONS);
+      }
+      else
+      {
+         return injectionPoint.getQualifiers().toArray(EMPTY_ANNOTATIONS);
+      }
+   }
    
+   private EventImpl(Type type, Annotation[] qualifiers, InjectionPoint injectionPoint, BeanManagerImpl beanManager)
+   {
+      super(type, qualifiers, injectionPoint, beanManager);
+   }
+
    /**
-    * Constructor
+    * Gets a string representation
     * 
-    * @param eventType The event type
-    * @param manager The Bean manager
-    * @param bindings The binding types
+    * @return A string representation
     */
-   private EventImpl(Type eventType, BeanManagerImpl manager, Set<Annotation> bindings)
-   {
-      super(eventType, manager, bindings);
-   }
-
    @Override
    public String toString()
    {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("Observable Event:\n");
-      buffer.append("  Event Type: " + getType().toString() + "\n");
-      buffer.append(Strings.collectionToString("  Event Bindings: ", getBindings()));
-      return buffer.toString();
+      return new StringBuilder().append(Names.annotationsToString(getQualifiers())).append(" Event<").append(getType()).append(">").toString();
    }
 
    public void fire(T event)
    {
-      getManager().fireEvent(event, getBindings().toArray(EMPTY_BINDINGS));
+      getBeanManager().fireEvent(event, getQualifiers());
    }
    
-   public Event<T> select(Annotation... bindings)
+   public Event<T> select(Annotation... qualifiers)
    {
-      return selectEvent(this.getType(), bindings);
+      return selectEvent(this.getType(), qualifiers);
    }
 
-   public <U extends T> Event<U> select(Class<U> subtype, Annotation... bindings)
+   public <U extends T> Event<U> select(Class<U> subtype, Annotation... qualifiers)
    {
-      return selectEvent(subtype, bindings);
+      return selectEvent(subtype, qualifiers);
    }
 
-   public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... bindings)
+   public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers)
    {
-      return selectEvent(subtype.getType(), bindings);
+      return selectEvent(subtype.getType(), qualifiers);
    }
    
-   public <U extends T> Event<U> selectEvent(Type subtype, Annotation[] bindings)
+   private <U extends T> Event<U> selectEvent(Type subtype, Annotation[] newQualifiers)
    {
       Observers.checkEventObjectType(subtype);
-      return new EventImpl<U>(
-            subtype, 
-            this.getManager(), 
-            new HashSet<Annotation>(Arrays.asList(mergeInBindings(bindings))));
-   } 
+      return new EventImpl<U>(subtype, Beans.mergeInQualifiers(getQualifiers(), newQualifiers), getInjectionPoint(), getBeanManager());
+   }
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy extends AbstractFacadeSerializationProxy
+   {
 
+      private static final long serialVersionUID = 9181171328831559650L;
+
+      public SerializationProxy(EventImpl<?> event)
+      {
+         super(event);
+      }
+      
+      private Object readResolve()
+      {
+         return EventImpl.of(getInjectionPoint(), getBeanManager());
+      }
+      
+   }
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/injection/ConstructorInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/ConstructorInjectionPoint.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/ConstructorInjectionPoint.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -18,6 +18,10 @@
 
 import static org.jboss.weld.injection.Exceptions.rethrowException;
 
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -33,11 +37,13 @@
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.introspector.ConstructorSignature;
 import org.jboss.weld.introspector.ForwardingWeldConstructor;
+import org.jboss.weld.introspector.WeldClass;
 import org.jboss.weld.introspector.WeldConstructor;
 import org.jboss.weld.introspector.WeldParameter;
 
-public class ConstructorInjectionPoint<T> extends ForwardingWeldConstructor<T> implements WeldInjectionPoint<T, Constructor<T>>
+public class ConstructorInjectionPoint<T> extends ForwardingWeldConstructor<T> implements WeldInjectionPoint<T, Constructor<T>>, Serializable
 {
 
    private static abstract class ForwardingParameterInjectionPointList<T, X> extends AbstractList<ParameterInjectionPoint<T, X>>
@@ -98,7 +104,7 @@
    {
       try
       {
-         return delegate().newInstance(getParameterValues(getWBParameters(), null, null, manager, creationalContext));
+         return delegate().newInstance(getParameterValues(getWeldParameters(), null, null, manager, creationalContext));
       }
       catch (IllegalArgumentException e)
       {
@@ -120,9 +126,9 @@
    }
 
    @Override
-   public List<ParameterInjectionPoint<?, T>> getWBParameters()
+   public List<ParameterInjectionPoint<?, T>> getWeldParameters()
    {
-      final List<? extends WeldParameter<?, T>> delegate = super.getWBParameters();
+      final List<? extends WeldParameter<?, T>> delegate = super.getWeldParameters();
       return new ForwardingParameterInjectionPointList()
       {
 
@@ -200,5 +206,50 @@
       // TODO Auto-generated method stub
       return false;
    }
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy<T>(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy<T> extends WeldInjectionPointSerializationProxy<T, Constructor<T>>
+   {
 
+      private static final long serialVersionUID = 9181171328831559650L;
+      
+      private final ConstructorSignature signature;
+
+      public SerializationProxy(ConstructorInjectionPoint<T> injectionPoint)
+      {
+         super(injectionPoint);
+         this.signature = injectionPoint.getSignature();
+      }
+      
+      private Object readResolve()
+      {
+         return ConstructorInjectionPoint.of(getDeclaringBean(), getWeldConstructor());
+      }
+      
+      protected WeldConstructor<T> getWeldConstructor()
+      {
+         return getWeldClass().getDeclaredWeldConstructor(signature);
+      }
+      
+      @SuppressWarnings("unchecked")
+      @Override
+      protected WeldClass<T> getWeldClass()
+      {
+         return (WeldClass<T>) super.getWeldClass();
+      }
+      
+   }
+
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/injection/FieldInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/FieldInjectionPoint.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/FieldInjectionPoint.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -18,6 +18,10 @@
 
 import static org.jboss.weld.injection.Exceptions.rethrowException;
 
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Member;
@@ -36,15 +40,16 @@
 import org.jboss.weld.introspector.ForwardingWeldField;
 import org.jboss.weld.introspector.WeldField;
 
-public class FieldInjectionPoint<T, X> extends ForwardingWeldField<T, X> implements WeldInjectionPoint<T, Field>
+public class FieldInjectionPoint<T, X> extends ForwardingWeldField<T, X> implements WeldInjectionPoint<T, Field>, Serializable
 {
-
+   
    private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
 
    private final Bean<?> declaringBean;
    private final WeldField<T, X> field;
    private final boolean delegate;
 
+   
    public static <T, X> FieldInjectionPoint<T, X> of(Bean<?> declaringBean, WeldField<T, X> field)
    {
       return new FieldInjectionPoint<T, X>(declaringBean, field);
@@ -131,6 +136,45 @@
    {
       return getJavaMember();
    }
+   
+   
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy<T>(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy<T> extends WeldInjectionPointSerializationProxy<T, Field>
+   {
+      
+      private static final long serialVersionUID = -3491482804822264969L;
+      
+      private final String fieldName;
 
+      public SerializationProxy(FieldInjectionPoint<T, ?> injectionPoint)
+      {
+         super(injectionPoint);
+         this.fieldName = injectionPoint.getName();
+      }
+      
+      private Object readResolve()
+      {
+         return FieldInjectionPoint.of(getDeclaringBean(), getWeldField());
+      }
+      
+      protected WeldField<T, ?> getWeldField()
+      {
+         return getWeldClass().getDeclaredWeldField(fieldName);
+      }
+      
+   }
 
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/injection/MethodInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/MethodInjectionPoint.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/MethodInjectionPoint.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -18,6 +18,9 @@
 
 import static org.jboss.weld.injection.Exceptions.rethrowException;
 
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
@@ -34,6 +37,7 @@
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.introspector.ForwardingWeldMethod;
+import org.jboss.weld.introspector.MethodSignature;
 import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.introspector.WeldParameter;
 
@@ -98,7 +102,7 @@
    {
       try
       {
-         return delegate().invoke(declaringInstance, getParameterValues(getWBParameters(), null, null, manager, creationalContext));
+         return delegate().invoke(declaringInstance, getParameterValues(getWeldParameters(), null, null, manager, creationalContext));
       }
       catch (IllegalArgumentException e)
       {
@@ -120,7 +124,7 @@
    {
       try
       {
-         return invoke(declaringInstance, getParameterValues(getWBParameters(), annotatedParameter, parameter, manager, creationalContext));
+         return invoke(declaringInstance, getParameterValues(getWeldParameters(), annotatedParameter, parameter, manager, creationalContext));
       }
       catch (IllegalArgumentException e)
       {
@@ -141,7 +145,7 @@
    {
       try
       {
-         return delegate().invokeOnInstance(declaringInstance, getParameterValues(getWBParameters(), null, null, manager, creationalContext));
+         return delegate().invokeOnInstance(declaringInstance, getParameterValues(getWeldParameters(), null, null, manager, creationalContext));
       }
       catch (IllegalArgumentException e)
       {
@@ -171,7 +175,7 @@
    {
       try
       {
-         return invokeOnInstance(declaringInstance, getParameterValues(getWBParameters(), annotatedParameter, parameter, manager, creationalContext));
+         return invokeOnInstance(declaringInstance, getParameterValues(getWeldParameters(), annotatedParameter, parameter, manager, creationalContext));
       }
       catch (IllegalArgumentException e)
       {
@@ -197,9 +201,9 @@
    }
 
    @Override
-   public List<ParameterInjectionPoint<?, X>> getWBParameters()
+   public List<ParameterInjectionPoint<?, X>> getWeldParameters()
    {
-      final List<? extends WeldParameter<?, X>> delegate = super.getWBParameters();
+      final List<? extends WeldParameter<?, X>> delegate = super.getWeldParameters();
       return new ForwardingParameterInjectionPointList()
       {
 
@@ -292,5 +296,43 @@
    {
       return getJavaMember();
    }
+   
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy<T>(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy<T> extends WeldInjectionPointSerializationProxy<T, Method>
+   {
 
+      private static final long serialVersionUID = 9181171328831559650L;
+      
+      private final MethodSignature signature;
+
+      public SerializationProxy(MethodInjectionPoint<T, ?> injectionPoint)
+      {
+         super(injectionPoint);
+         this.signature = injectionPoint.getSignature();
+      }
+      
+      private Object readResolve()
+      {
+         return MethodInjectionPoint.of(getDeclaringBean(), getWeldMethod());
+      }
+      
+      protected WeldMethod<T, ?> getWeldMethod()
+      {
+         return getWeldClass().getDeclaredWeldMethod(signature);
+      }
+      
+   }
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/injection/ParameterInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/ParameterInjectionPoint.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/ParameterInjectionPoint.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -16,6 +16,10 @@
  */
 package org.jboss.weld.injection;
 
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Member;
 import java.lang.reflect.Type;
@@ -28,10 +32,14 @@
 import javax.enterprise.inject.spi.Decorator;
 
 import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.introspector.ConstructorSignature;
 import org.jboss.weld.introspector.ForwardingWeldParameter;
+import org.jboss.weld.introspector.MethodSignature;
+import org.jboss.weld.introspector.WeldConstructor;
+import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.introspector.WeldParameter;
 
-public class ParameterInjectionPoint<T, X> extends ForwardingWeldParameter<T, X> implements WeldInjectionPoint<T, Object>
+public class ParameterInjectionPoint<T, X> extends ForwardingWeldParameter<T, X> implements WeldInjectionPoint<T, Object>, Serializable
 {
 
    private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
@@ -110,6 +118,97 @@
    {
       return getJavaMember();
    }
+   
+   // Serialization
+   
+   private Object writeReplace() throws ObjectStreamException
+   {
+      return new SerializationProxy<T>(this);
+   }
+   
+   private void readObject(ObjectInputStream stream) throws InvalidObjectException
+   {
+      throw new InvalidObjectException("Proxy required");
+   }
+   
+   private static class SerializationProxy<T> extends WeldInjectionPointSerializationProxy<T, Object>
+   {
+      
+      private static final long serialVersionUID = -3491482804822264969L;
+      
+      private final int parameterPosition;
+      private final MethodSignature methodSignature;
+      private final ConstructorSignature constructorSignature;
 
+      public SerializationProxy(ParameterInjectionPoint<T, ?> injectionPoint)
+      {
+         super(injectionPoint);
+         this.parameterPosition = injectionPoint.getPosition();
+         if (injectionPoint.delegate().getDeclaringWeldCallable() instanceof WeldMethod<?, ?>)
+         {
+            this.methodSignature = ((WeldMethod<?, ?>) injectionPoint.delegate().getDeclaringWeldCallable()).getSignature();
+            this.constructorSignature = null;
+         }
+         else if (injectionPoint.delegate().getDeclaringWeldCallable() instanceof WeldConstructor<?>)
+         {
+            this.methodSignature = null;
+            this.constructorSignature = ((WeldConstructor<?>) injectionPoint.delegate().getDeclaringWeldCallable()).getSignature();
+         }
+         else
+         {
+            throw new IllegalStateException("Cannot handle injection point as neither constructor or method. Injection Point: " + injectionPoint);
+         }
+      }
+      
+      private Object readResolve()
+      {
+         return ParameterInjectionPoint.of(getDeclaringBean(), getWeldParameter());
+      }
+      
+      protected WeldParameter<T, ?> getWeldParameter()
+      {
+         if (methodSignature != null)
+         {
+            WeldMethod<?, ?> method = getWeldClass().getDeclaredWeldMethod(methodSignature);
+            if (method.getParameters().size() > parameterPosition)
+            {
+               WeldParameter<?, ?> p = method.getWeldParameters().get(parameterPosition);
+               
+               @SuppressWarnings("unchecked")
+               WeldParameter<T, ?> px = (WeldParameter<T, ?>) p;
+               
+               return px;
+            }
+            else
+            {
+               throw new IllegalStateException("Parameter not in list. Parameter position: " + parameterPosition + "; Parameters: " + method.getParameters());
+            }
+         }
+         else if (constructorSignature != null)
+         {
+            WeldConstructor<?> constructor = getWeldClass().getDeclaredWeldConstructor(constructorSignature);
+            if (constructor.getParameters().size() > parameterPosition)
+            {
+               WeldParameter<?, ?> p = constructor.getWeldParameters().get(parameterPosition);
+               
+               @SuppressWarnings("unchecked")
+               WeldParameter<T, ?> px = (WeldParameter<T, ?>) p;
+               
+               return px;
+            }
+            else
+            {
+               throw new IllegalStateException("Parameter not in list. Parameter position: " + parameterPosition + "; Parameters: " + constructor.getParameters());
+            }
+         }
+         else
+         {
+            throw new IllegalStateException("Cannot read object");
+         }
+         
+      }
+      
+   }
 
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/injection/WeldInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/WeldInjectionPoint.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/WeldInjectionPoint.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -16,13 +16,46 @@
  */
 package org.jboss.weld.injection;
 
+import java.io.Serializable;
+
+import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 
+import org.jboss.weld.Container;
 import org.jboss.weld.introspector.WeldAnnotated;
+import org.jboss.weld.introspector.WeldClass;
+import org.jboss.weld.resources.ClassTransformer;
+import org.jboss.weld.serialization.spi.ContextualStore;
 
 public interface WeldInjectionPoint<T, S> extends InjectionPoint, WeldAnnotated<T, S>
 {
    
+   static abstract class WeldInjectionPointSerializationProxy<T, S> implements Serializable
+   {
+      
+      private static final long serialVersionUID = -5488095196637387378L;
+      
+      private final String declaringBeanId;
+      private final Class<?> declaringClass;
+      
+      public WeldInjectionPointSerializationProxy(WeldInjectionPoint<T, S> injectionPoint)
+      {
+         this.declaringBeanId = Container.instance().deploymentServices().get(ContextualStore.class).putIfAbsent(injectionPoint.getBean());
+         this.declaringClass = injectionPoint.getBean().getBeanClass();
+      }
+
+      protected Bean<T> getDeclaringBean()
+      {
+         return Container.instance().deploymentServices().get(ContextualStore.class).<Bean<T>, T>getContextual(declaringBeanId);
+      }
+      
+      protected WeldClass<?> getWeldClass()
+      {
+         return Container.instance().deploymentServices().get(ClassTransformer.class).loadClass(declaringClass);
+      }
+
+   }
+   
    /**
     * Injects an instance
     * 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldClass.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldClass.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldClass.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -87,9 +87,9 @@
       return delegate().getWeldMethod(method);
    }
    
-   public <M> WeldMethod<M, ?> getWBMethod(MethodSignature signature)
+   public <M> WeldMethod<M, ?> getWeldMethod(MethodSignature signature)
    {
-      return delegate().getWBMethod(signature);
+      return delegate().getWeldMethod(signature);
    }
 
    public Set<WeldMethod<?, ?>> getWeldMethodsWithAnnotatedParameters(Class<? extends Annotation> annotationType)
@@ -144,14 +144,14 @@
       return delegate().getDeclaredWeldMethod(method);
    }
    
-   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName, WeldClass<F> expectedType)
+   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName)
    {
-      return delegate().getDeclaredWeldField(fieldName, expectedType);
+      return delegate().getDeclaredWeldField(fieldName);
    }
    
    public <M> WeldMethod<M, ?> getDeclaredWeldMethod(MethodSignature signature, WeldClass<M> expectedReturnType) 
    {
-      return delegate().getDeclaredWeldMethod(signature, expectedReturnType);
+      return delegate().getDeclaredWeldMethod(signature);
    }
    
    public WeldConstructor<T> getDeclaredWeldConstructor(ConstructorSignature signature)

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldConstructor.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldConstructor.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldConstructor.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -40,9 +40,9 @@
       return delegate().getDeclaringType();
    }
 
-   public List<? extends WeldParameter<?, T>> getWBParameters()
+   public List<? extends WeldParameter<?, T>> getWeldParameters()
    {
-      return delegate().getWBParameters();
+      return delegate().getWeldParameters();
    }
 
    public T newInstance(Object... parameters) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldMethod.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldMethod.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldMethod.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -44,9 +44,9 @@
       return delegate().getParameterTypesAsArray();
    }
 
-   public List<? extends WeldParameter<?, X>> getWBParameters()
+   public List<? extends WeldParameter<?, X>> getWeldParameters()
    {
-      return delegate().getWBParameters();
+      return delegate().getWeldParameters();
    }
 
    public String getPropertyName()

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldParameter.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldParameter.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/ForwardingWeldParameter.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -35,4 +35,9 @@
       return delegate().getPosition();
    }
    
+   public WeldCallable<?, X, ?> getDeclaringWeldCallable()
+   {
+      return delegate().getDeclaringWeldCallable();
+   }
+   
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldCallable.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldCallable.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldCallable.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -35,7 +35,7 @@
     * @return A list of parameters. Returns an empty list if no parameters are
     *         present.
     */
-   public List<? extends WeldParameter<?, X>> getWBParameters();
+   public List<? extends WeldParameter<?, X>> getWeldParameters();
 
    /**
     * Gets the list of annotated parameters for a given annotation

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldClass.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldClass.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldClass.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -57,10 +57,9 @@
     * 
     * @param <F> the expected type of the field
     * @param fieldName the field name
-    * @param expectedType the expected type of the field
     * @return the field
     */
-   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName, WeldClass<F> expectedType);
+   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName);
 
    /**
     * Gets all fields which are annotated with the given annotation type on this
@@ -154,11 +153,9 @@
     * 
     * @param <M> the expected return type
     * @param signature the name of the method
-    * @param expectedReturnType the expected return type
     * @return the method, or null if it doesn't exist
     */
-   public <M> WeldMethod<M, ?> getDeclaredWeldMethod(MethodSignature signature, 
-         WeldClass<M> expectedReturnType);
+   public <M> WeldMethod<M, ?> getDeclaredWeldMethod(MethodSignature signature);
    
    /**
     * Get a method by name
@@ -167,7 +164,7 @@
     * @param signature the name of the method
     * @return the method, or null if it doesn't exist
     */
-   public <M> WeldMethod<M, ?> getWBMethod(MethodSignature signature);
+   public <M> WeldMethod<M, ?> getWeldMethod(MethodSignature signature);
 
    // TODO Replace with AnnotatedMethod variant
    @Deprecated

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldParameter.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldParameter.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/WeldParameter.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -27,5 +27,7 @@
  */
 public interface WeldParameter<T, X> extends WeldAnnotated<T, Object>, AnnotatedParameter<X>
 {
+   
+   public WeldCallable<?, X, ?> getDeclaringWeldCallable();
 
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/ConstructorSignatureImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/ConstructorSignatureImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/ConstructorSignatureImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -31,10 +31,10 @@
    
    public ConstructorSignatureImpl(WeldConstructor<?> method)
    {
-      this.parameterTypes = new String[method.getWBParameters().size()];
-      for (int i = 0; i < method.getWBParameters().size(); i++)
+      this.parameterTypes = new String[method.getWeldParameters().size()];
+      for (int i = 0; i < method.getWeldParameters().size(); i++)
       {
-         parameterTypes[i] = method.getWBParameters().get(i).getJavaClass().getName();
+         parameterTypes[i] = method.getWeldParameters().get(i).getJavaClass().getName();
       }
       
    }
@@ -56,7 +56,7 @@
    @Override
    public int hashCode()
    {
-     return getParameterTypes().hashCode();
+     return Arrays.hashCode(parameterTypes);
    }
    
    public String[] getParameterTypes()

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/MethodSignatureImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/MethodSignatureImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/MethodSignatureImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -34,10 +34,10 @@
    public MethodSignatureImpl(WeldMethod<?, ?> method)
    {
       this.methodName = method.getName();
-      this.parameterTypes = new String[method.getWBParameters().size()];
-      for (int i = 0; i < method.getWBParameters().size(); i++)
+      this.parameterTypes = new String[method.getWeldParameters().size()];
+      for (int i = 0; i < method.getWeldParameters().size(); i++)
       {
-         parameterTypes[i] = method.getWBParameters().get(i).getJavaClass().getName();
+         parameterTypes[i] = method.getWeldParameters().get(i).getJavaClass().getName();
       }
    }
    
@@ -70,8 +70,8 @@
    public int hashCode()
    {
       int hashCode = 17;
-      hashCode += getMethodName().hashCode() * 5;
-      hashCode += Arrays.hashCode(getParameterTypes()) * 7;
+      hashCode += methodName.hashCode() * 5;
+      hashCode += Arrays.hashCode(parameterTypes) * 7;
       return hashCode;
    }
    

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -484,8 +484,8 @@
    {
       return Collections.unmodifiableSet(declaredFields);
    }
-
-   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName, WeldClass<F> expectedType)
+   
+   public <F> WeldField<F, ?> getDeclaredWeldField(String fieldName)
    {
       return (WeldField<F, ?>) declaredFieldsByName.get(fieldName);
    }
@@ -661,17 +661,17 @@
    }
 
    @SuppressWarnings("unchecked")
-   public <M> WeldMethod<M, ?> getDeclaredWeldMethod(MethodSignature signature, WeldClass<M> expectedReturnType)
+   public <M> WeldMethod<M, ?> getDeclaredWeldMethod(MethodSignature signature)
    {
       return (WeldMethod<M, ?>) declaredMethodsBySignature.get(signature);
    }
 
    @SuppressWarnings("unchecked")
-   public <M> WeldMethod<M, ?> getWBMethod(MethodSignature signature)
+   public <M> WeldMethod<M, ?> getWeldMethod(MethodSignature signature)
    {
       return (WeldMethod<M, ?>) methodsBySignature.get(signature);
    }
-
+   
    /**
     * Gets a string representation of the class
     * 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldConstructorImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldConstructorImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldConstructorImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -206,9 +206,9 @@
     * 
     * @return A list of annotated parameter abstractions
     * 
-    * @see org.jboss.weld.introspector.WeldConstructor#getWBParameters()
+    * @see org.jboss.weld.introspector.WeldConstructor#getWeldParameters()
     */
-   public List<WeldParameter<?, T>> getWBParameters()
+   public List<WeldParameter<?, T>> getWeldParameters()
    {
       return Collections.unmodifiableList(parameters);
    }
@@ -259,7 +259,7 @@
       if (super.equals(other) && other instanceof WeldConstructor)
       {
          WeldConstructor<?> that = (WeldConstructor<?>) other;
-         return this.getDeclaringType().equals(that.getDeclaringType()) && this.getWBParameters().equals(that.getWBParameters());
+         return this.getDeclaringType().equals(that.getDeclaringType()) && this.getWeldParameters().equals(that.getWeldParameters());
       }
       return false;
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldMethodImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldMethodImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldMethodImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -181,7 +181,7 @@
       return method;
    }
 
-   public List<WeldParameter<?, X>> getWBParameters()
+   public List<WeldParameter<?, X>> getWeldParameters()
    {
       return Collections.unmodifiableList(parameters);
    }
@@ -202,7 +202,7 @@
       if (other instanceof WeldMethod)
       {
          WeldMethod<?, ?> that = (WeldMethod<?, ?>) other;
-         return this.getDeclaringType().equals(that.getDeclaringType()) && this.getName().equals(that.getName()) && this.getWBParameters().equals(that.getWBParameters());
+         return this.getDeclaringType().equals(that.getDeclaringType()) && this.getName().equals(that.getName()) && this.getWeldParameters().equals(that.getWeldParameters());
       }
       else
       {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldParameterImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldParameterImpl.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldParameterImpl.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -151,6 +151,11 @@
    {
       return declaringMember;
    }
+   
+   public WeldCallable<?, X, ?> getDeclaringWeldCallable()
+   {
+      return declaringMember;
+   }
 
    public int getPosition()
    {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -24,8 +24,8 @@
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.BeanManagerImpl;
-import org.jboss.weld.bean.builtin.facade.EventBean;
-import org.jboss.weld.bean.builtin.facade.InstanceBean;
+import org.jboss.weld.bean.builtin.EventBean;
+import org.jboss.weld.bean.builtin.InstanceBean;
 import org.jboss.weld.util.Beans;
 import org.jboss.weld.util.Reflections;
 import org.jboss.weld.util.collections.ConcurrentCache;

Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -29,6 +29,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -53,8 +54,8 @@
 import org.jboss.interceptor.model.InterceptionType;
 import org.jboss.interceptor.model.InterceptionTypeRegistry;
 import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.Container;
 import org.jboss.weld.DefinitionException;
-import org.jboss.weld.bean.AbstractProducerBean;
 import org.jboss.weld.bean.RIBean;
 import org.jboss.weld.bean.SessionBean;
 import org.jboss.weld.bean.DecoratorImpl;
@@ -124,14 +125,10 @@
     */
    public static boolean isPassivationCapableBean(Bean<?> bean)
    {
-      if (bean instanceof SessionBean<?>)
+      if (bean instanceof RIBean<?>)
       {
-         return ((SessionBean<?>) bean).getEjbDescriptor().isStateful();
+         return ((RIBean<?>) bean).isPassivationCapable();
       }
-      else if (bean instanceof AbstractProducerBean<?, ?, ?>)
-      {
-         return Reflections.isSerializable(((AbstractProducerBean<?, ?, ?>) bean).getType());
-      }
       else
       {
          return Reflections.isSerializable(bean.getBeanClass());
@@ -394,7 +391,7 @@
    public static Set<ParameterInjectionPoint<?, ?>> getParameterInjectionPoints(Bean<?> declaringBean, WeldConstructor<?> constructor)
    {
       Set<ParameterInjectionPoint<?,?>> injectionPoints = new HashSet<ParameterInjectionPoint<?,?>>();
-      for (WeldParameter<?, ?> parameter : constructor.getWBParameters())
+      for (WeldParameter<?, ?> parameter : constructor.getWeldParameters())
       {
          injectionPoints.add(ParameterInjectionPoint.of(declaringBean, parameter));
       }
@@ -404,7 +401,7 @@
    public static Set<ParameterInjectionPoint<?, ?>> getParameterInjectionPoints(Bean<?> declaringBean, MethodInjectionPoint<?, ?> method)
    {
       Set<ParameterInjectionPoint<?,?>> injectionPoints = new HashSet<ParameterInjectionPoint<?,?>>();
-      for (WeldParameter<?, ?> parameter : method.getWBParameters())
+      for (WeldParameter<?, ?> parameter : method.getWeldParameters())
       {
          injectionPoints.add(ParameterInjectionPoint.of(declaringBean, parameter));
       }
@@ -418,7 +415,7 @@
       {
          for (MethodInjectionPoint<?, ?> method : i)
          {
-            for (WeldParameter<?, ?> parameter : method.getWBParameters())
+            for (WeldParameter<?, ?> parameter : method.getWeldParameters())
             {
                injectionPoints.add(ParameterInjectionPoint.of(declaringBean, parameter));
             }
@@ -751,6 +748,27 @@
    {
       return annotatedItem.isAnnotationPresent(Decorator.class);
    }
+   
+   public static Annotation[] mergeInQualifiers(Annotation[] qualifiers, Annotation[] newQualifiers)
+   {
+      Set<Annotation> result = new HashSet<Annotation>();
+      result.addAll(Arrays.asList(qualifiers));
+      Set<Annotation> checkedNewQualifiers = new HashSet<Annotation>();
+      for (Annotation qualifier : newQualifiers)
+      {
+         if (!Container.instance().deploymentServices().get(MetaAnnotationStore.class).getBindingTypeModel(qualifier.annotationType()).isValid())
+         {
+            throw new IllegalArgumentException("Annotation is not a qualifier. Qualifier: " + qualifier);
+         }
+         if (checkedNewQualifiers.contains(qualifier))
+         {
+            throw new IllegalArgumentException("Qualifier is already present. Qualifier: " + qualifier + "; All qualifiers: " + Arrays.asList(newQualifiers));
+         }
+         checkedNewQualifiers.add(qualifier);
+      }
+      result.addAll(checkedNewQualifiers);
+      return result.toArray(Reflections.EMPTY_ANNOTATIONS);
+   }
 
    public static InjectionPoint getDelegateInjectionPoint(javax.enterprise.inject.spi.Decorator<?> decorator)
    {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Proxies.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Proxies.java	2009-11-07 21:36:10 UTC (rev 4752)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Proxies.java	2009-11-07 21:50:44 UTC (rev 4753)
@@ -24,7 +24,9 @@
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import javassist.util.proxy.MethodHandler;
 import javassist.util.proxy.ProxyFactory;
+import javassist.util.proxy.ProxyObject;
 
 /**
  * Utilties for working with Javassist proxies
@@ -35,7 +37,7 @@
  */
 public class Proxies
 {
-
+   
    public static class TypeInfo
    {
 
@@ -87,9 +89,9 @@
          return proxyFactory;
       }
 
-      private void add(Type type)
+      public TypeInfo add(Type type)
       {
-         if (type instanceof Class)
+         if (type instanceof Class<?>)
          {
             Class<?> clazz = (Class<?>) type;
             if (clazz.isInterface())
@@ -109,41 +111,49 @@
          {
             throw new IllegalArgumentException("Cannot proxy non-Class Type " + type);
          }
+         return this;
       }
 
-      public static TypeInfo ofTypes(Set<? extends Type> types)
+      public static TypeInfo of(Set<? extends Type> types)
       {
-         TypeInfo typeInfo = new TypeInfo();
+         TypeInfo typeInfo = create();
          for (Type type : types)
          {
             typeInfo.add(type);
          }
          return typeInfo;
       }
-
-      public static TypeInfo ofClasses(Set<Class<?>> classes)
+      
+      public static TypeInfo create()
       {
-         TypeInfo typeInfo = new TypeInfo();
-         for (Class<?> type : classes)
-         {
-            typeInfo.add(type);
-         }
-         return typeInfo;
+         return new TypeInfo();
       }
 
    }
-
-   /**
-    * Get the proxy factory for the given set of types
-    * 
-    * @param types The types to create the proxy factory for
-    * @param classes Additional interfaces the proxy should implement
-    * @return the proxy factory
-    */
-   public static ProxyFactory getProxyFactory(Set<Type> types)
+   
+   public static <T> T createProxy(MethodHandler methodHandler, TypeInfo typeInfo) throws IllegalAccessException, InstantiationException
    {
-      return TypeInfo.ofTypes(types).createProxyFactory();
+      return Proxies.<T>createProxyClass(methodHandler, typeInfo).newInstance();
    }
+   
+   public static <T> Class<T> createProxyClass(TypeInfo typeInfo)
+   {
+      return createProxyClass(null, typeInfo);
+   }
+   
+   public static <T> Class<T> createProxyClass(MethodHandler methodHandler, TypeInfo typeInfo)
+   {
+      ProxyFactory proxyFactory = typeInfo.createProxyFactory();
+      if (methodHandler != null)
+      {
+         proxyFactory.setHandler(methodHandler);
+      }
+      
+      @SuppressWarnings("unchecked")
+      Class<T> clazz = proxyFactory.createClass();
+      
+      return clazz;
+   }
 
    /**
     * Indicates if a class is proxyable
@@ -153,14 +163,14 @@
     */
    public static boolean isTypeProxyable(Type type)
    {
-      if (type instanceof Class)
+      if (type instanceof Class<?>)
       {
          return isClassProxyable((Class<?>) type);
       }
       else if (type instanceof ParameterizedType)
       {
          Type rawType = ((ParameterizedType) type).getRawType();
-         if (rawType instanceof Class)
+         if (rawType instanceof Class<?>)
          {
             return isClassProxyable((Class<?>) rawType);
          }
@@ -237,6 +247,20 @@
    {
       return instance.getClass().getName().indexOf("_$$_javassist_") > 0;
    }
+   
+   public static <T> T attachMethodHandler(T instance, MethodHandler methodHandler)
+   {
+      if (instance instanceof ProxyObject)
+      {
+         ((ProxyObject) instance).setHandler(methodHandler);
+         return instance;
+      }
+      else
+      {
+         throw new IllegalArgumentException("Instance not a proxy. Instance: " + instance);
+      }
+      
+   }
 
 
 }



More information about the weld-commits mailing list