Class CdiSpiDecorator

  • All Implemented Interfaces:
    Decorator

    public class CdiSpiDecorator
    extends java.lang.Object
    implements Decorator
    A Decorator that invokes the CDI provider within a webapp to decorate objects created by the contexts DecoratedObjectFactory (typically Listeners, Filters and Servlets). The CDI provider is invoked using MethodHandles to avoid any CDI instance or dependencies within the server scope. The code invoked is equivalent to:
     public <T> T decorate(T o)
     {
       BeanManager manager = CDI.current().getBeanManager();
       manager.createInjectionTarget(manager.createAnnotatedType((Class<T>)o.getClass()))
         .inject(o,manager.createCreationalContext(null));
       return o;
     }
     
    • Field Detail

      • LOG

        private static final Logger LOG
      • _current

        private final java.lang.invoke.MethodHandle _current
      • _getBeanManager

        private final java.lang.invoke.MethodHandle _getBeanManager
      • _createAnnotatedType

        private final java.lang.invoke.MethodHandle _createAnnotatedType
      • _createInjectionTarget

        private final java.lang.invoke.MethodHandle _createInjectionTarget
      • _createCreationalContext

        private final java.lang.invoke.MethodHandle _createCreationalContext
      • _inject

        private final java.lang.invoke.MethodHandle _inject
      • _dispose

        private final java.lang.invoke.MethodHandle _dispose
      • _release

        private final java.lang.invoke.MethodHandle _release
      • _undecorated

        private final java.util.Set<java.lang.String> _undecorated
    • Constructor Detail

      • CdiSpiDecorator

        public CdiSpiDecorator​(ServletContextHandler context)
                        throws java.lang.UnsupportedOperationException
        Throws:
        java.lang.UnsupportedOperationException
    • Method Detail

      • isDecoratable

        protected boolean isDecoratable​(java.lang.Class<?> clazz)
        Test if a class can be decorated. The default implementation checks the set from getUndecoratable() on the class and all it's super classes.
        Parameters:
        clazz - The class to check
        Returns:
        True if the class and all it's super classes can be decorated
      • getUndecoratable

        public java.util.Set<java.lang.String> getUndecoratable()
        Get the set of classes that will not be decorated. The default set includes the listener from Weld that will itself setup decoration.
        Returns:
        The modifiable set of class names that will not be decorated (ie isDecoratable(Class) will return false.
        See Also:
        isDecoratable(Class)
      • setUndecoratable

        public void setUndecoratable​(java.util.Set<java.lang.String> classnames)
        Parameters:
        classnames - The set of class names that will not be decorated.
        See Also:
        isDecoratable(Class)
      • addUndecoratable

        public void addUndecoratable​(java.lang.String... classname)
        Parameters:
        classname - A class name that will be added to the undecoratable classes set.
        See Also:
        getUndecoratable(), isDecoratable(Class)
      • decorate

        public <T> T decorate​(T o)
        Decorate an object.

        The signature of this method must match what is introspected for by the Jetty DecoratingListener class. It is invoked dynamically.

        Specified by:
        decorate in interface Decorator
        Type Parameters:
        T - The type of the object to be decorated
        Parameters:
        o - The object to be decorated
        Returns:
        The decorated object
      • destroy

        public void destroy​(java.lang.Object o)
        Destroy a decorated object.

        The signature of this method must match what is introspected for by the Jetty DecoratingListener class. It is invoked dynamically.

        Specified by:
        destroy in interface Decorator
        Parameters:
        o - The object to be destroyed