Package groovy.util

Class FactoryBuilderSupport

  • All Implemented Interfaces:
    GroovyObject
    Direct Known Subclasses:
    ObjectGraphBuilder

    public abstract class FactoryBuilderSupport
    extends Binding
    Mix of BuilderSupport and SwingBuilder's factory support. Warning: this implementation is not thread safe and should not be used across threads in a multi-threaded environment. A locking mechanism should be implemented by the subclass if use is expected across multiple threads.
    • Field Detail

      • SCRIPT_CLASS_NAME

        public static final java.lang.String SCRIPT_CLASS_NAME
        See Also:
        Constant Field Values
      • attributeDelegates

        protected java.util.LinkedList<Closure> attributeDelegates
      • preInstantiateDelegates

        protected java.util.LinkedList<Closure> preInstantiateDelegates
      • postInstantiateDelegates

        protected java.util.LinkedList<Closure> postInstantiateDelegates
      • postNodeCompletionDelegates

        protected java.util.LinkedList<Closure> postNodeCompletionDelegates
      • methodMissingDelegate

        protected Closure methodMissingDelegate
      • propertyMissingDelegate

        protected Closure propertyMissingDelegate
      • explicitProperties

        protected java.util.Map<java.lang.String,​Closure[]> explicitProperties
      • explicitMethods

        protected java.util.Map<java.lang.String,​Closure> explicitMethods
      • registrationGroup

        protected java.util.Map<java.lang.String,​java.util.Set<java.lang.String>> registrationGroup
      • registrationGroupName

        protected java.lang.String registrationGroupName
      • autoRegistrationRunning

        protected boolean autoRegistrationRunning
      • autoRegistrationComplete

        protected boolean autoRegistrationComplete
    • Constructor Detail

      • FactoryBuilderSupport

        public FactoryBuilderSupport()
      • FactoryBuilderSupport

        public FactoryBuilderSupport​(boolean init)
    • Method Detail

      • checkValueIsNull

        public static void checkValueIsNull​(java.lang.Object value,
                                            java.lang.Object name)
        Throws an exception if value is null.
        Parameters:
        value - the node's value
        name - the node's name
      • checkValueIsType

        public static boolean checkValueIsType​(java.lang.Object value,
                                               java.lang.Object name,
                                               java.lang.Class type)
        Checks type of value against builder type
        Parameters:
        value - the node's value
        name - the node's name
        type - a Class that may be assignable to the value's class
        Returns:
        true if type is assignable to the value's class, false if value is null.
      • checkValueIsTypeNotString

        public static boolean checkValueIsTypeNotString​(java.lang.Object value,
                                                        java.lang.Object name,
                                                        java.lang.Class type)
        Checks values against factory's type
        Parameters:
        value - the node's value
        name - the node's name
        type - a Class that may be assignable to the value's class
        Returns:
        Returns true if type is assignable to the value's class, false if value is null or a String.
      • autoRegisterNodes

        public void autoRegisterNodes()
        Ask the nodes to be registered
      • getVariable

        public java.lang.Object getVariable​(java.lang.String name)
        Overrides:
        getVariable in class Binding
        Parameters:
        name - the name of the variable to lookup
        Returns:
        the variable value
      • setVariable

        public void setVariable​(java.lang.String name,
                                java.lang.Object value)
        Sets the value of the given variable
        Overrides:
        setVariable in class Binding
        Parameters:
        name - the name of the variable to set
        value - the new value for the given variable
      • getVariables

        public java.util.Map getVariables()
        Overrides:
        getVariables in class Binding
      • getProperty

        public java.lang.Object getProperty​(java.lang.String property)
        Overloaded to make variables appear as bean properties or via the subscript operator
        Specified by:
        getProperty in interface GroovyObject
        Overrides:
        getProperty in class Binding
        Parameters:
        property - the name of the property of interest
        Returns:
        the given property
      • setProperty

        public void setProperty​(java.lang.String property,
                                java.lang.Object newValue)
        Overloaded to make variables appear as bean properties or via the subscript operator
        Specified by:
        setProperty in interface GroovyObject
        Overrides:
        setProperty in class Binding
        Parameters:
        property - the name of the property of interest
        newValue - the new value for the property
      • getFactories

        public java.util.Map<java.lang.String,​Factory> getFactories()
        Returns:
        the factory map (Unmodifiable Map).
      • getExplicitMethods

        public java.util.Map<java.lang.String,​Closure> getExplicitMethods()
        Returns:
        the explicit methods map (Unmodifiable Map).
      • getExplicitProperties

        public java.util.Map<java.lang.String,​Closure[]> getExplicitProperties()
        Returns:
        the explicit properties map (Unmodifiable Map).
      • getLocalFactories

        public java.util.Map<java.lang.String,​Factory> getLocalFactories()
        Returns:
        the factory map (Unmodifiable Map).
      • getLocalExplicitMethods

        public java.util.Map<java.lang.String,​Closure> getLocalExplicitMethods()
        Returns:
        the explicit methods map (Unmodifiable Map).
      • getLocalExplicitProperties

        public java.util.Map<java.lang.String,​Closure[]> getLocalExplicitProperties()
        Returns:
        the explicit properties map (Unmodifiable Map).
      • getRegistrationGroups

        public java.util.Set<java.lang.String> getRegistrationGroups()
      • getRegistrationGroupItems

        public java.util.Set<java.lang.String> getRegistrationGroupItems​(java.lang.String group)
      • getAttributeDelegates

        public java.util.List<Closure> getAttributeDelegates()
      • getPreInstantiateDelegates

        public java.util.List<Closure> getPreInstantiateDelegates()
      • getPostInstantiateDelegates

        public java.util.List<Closure> getPostInstantiateDelegates()
      • getPostNodeCompletionDelegates

        public java.util.List<Closure> getPostNodeCompletionDelegates()
      • getMethodMissingDelegate

        public Closure getMethodMissingDelegate()
      • setMethodMissingDelegate

        public void setMethodMissingDelegate​(Closure delegate)
      • getPropertyMissingDelegate

        public Closure getPropertyMissingDelegate()
      • setPropertyMissingDelegate

        public void setPropertyMissingDelegate​(Closure delegate)
      • getContext

        public java.util.Map<java.lang.String,​java.lang.Object> getContext()
        Returns:
        the context of the current node.
      • getCurrent

        public java.lang.Object getCurrent()
        Returns:
        the current node being built.
      • getCurrentFactory

        public Factory getCurrentFactory()
        Returns:
        the factory that built the current node.
      • getCurrentName

        public java.lang.String getCurrentName()
        Returns:
        the factory of the parent of the current node.
      • getCurrentBuilder

        public FactoryBuilderSupport getCurrentBuilder()
        Returns:
        the builder that built the current node.
      • getParentNode

        public java.lang.Object getParentNode()
        Returns:
        the node of the parent of the current node.
      • getParentFactory

        public Factory getParentFactory()
        Returns:
        the factory of the parent of the current node.
      • getParentContext

        public java.util.Map getParentContext()
        Returns:
        the context of the parent of the current node.
      • getParentName

        public java.lang.String getParentName()
        Returns:
        the name of the parent of the current node.
      • getContextAttribute

        public java.lang.Object getContextAttribute​(java.lang.String key)
      • invokeMethod

        public java.lang.Object invokeMethod​(java.lang.String methodName)
        Convenience method when no arguments are required
        Parameters:
        methodName - the name of the method to invoke
        Returns:
        the result of the call
      • invokeMethod

        public java.lang.Object invokeMethod​(java.lang.String methodName,
                                             java.lang.Object args)
        Description copied from interface: GroovyObject
        Invokes the given method.
        Specified by:
        invokeMethod in interface GroovyObject
        Overrides:
        invokeMethod in class GroovyObjectSupport
        Parameters:
        methodName - the name of the method to call
        args - the arguments to use for the method call
        Returns:
        the result of invoking the method
      • addAttributeDelegate

        public Closure addAttributeDelegate​(Closure attrDelegate)
        Add an attribute delegate so it can intercept attributes being set. Attribute delegates are fired in a FILO pattern, so that nested delegates get first crack.
        Parameters:
        attrDelegate - the closure to be called
        Returns:
        attrDelegate
      • removeAttributeDelegate

        public void removeAttributeDelegate​(Closure attrDelegate)
        Remove the most recently added instance of the attribute delegate.
        Parameters:
        attrDelegate - the instance of the closure to be removed
      • addPreInstantiateDelegate

        public Closure addPreInstantiateDelegate​(Closure delegate)
        Add a preInstantiate delegate so it can intercept nodes before they are created. PreInstantiate delegates are fired in a FILO pattern, so that nested delegates get first crack.
        Parameters:
        delegate - the closure to invoke
        Returns:
        delegate
      • removePreInstantiateDelegate

        public void removePreInstantiateDelegate​(Closure delegate)
        Remove the most recently added instance of the preInstantiate delegate.
        Parameters:
        delegate - the closure to invoke
      • addPostInstantiateDelegate

        public Closure addPostInstantiateDelegate​(Closure delegate)
        Add a postInstantiate delegate so it can intercept nodes after they are created. PostInstantiate delegates are fired in a FILO pattern, so that nested delegates get first crack.
        Parameters:
        delegate - the closure to invoke
        Returns:
        delegate
      • removePostInstantiateDelegate

        public void removePostInstantiateDelegate​(Closure delegate)
        Remove the most recently added instance of the postInstantiate delegate.
        Parameters:
        delegate - the closure to invoke
      • addPostNodeCompletionDelegate

        public Closure addPostNodeCompletionDelegate​(Closure delegate)
        Add a nodeCompletion delegate so it can intercept nodes after they done with building. NodeCompletion delegates are fired in a FILO pattern, so that nested delegates get first crack.
        Parameters:
        delegate - the closure to invoke
        Returns:
        delegate
      • removePostNodeCompletionDelegate

        public void removePostNodeCompletionDelegate​(Closure delegate)
        Remove the most recently added instance of the nodeCompletion delegate.
        Parameters:
        delegate - the closure to be removed
      • registerExplicitProperty

        public void registerExplicitProperty​(java.lang.String name,
                                             Closure getter,
                                             Closure setter)
      • registerExplicitProperty

        public void registerExplicitProperty​(java.lang.String name,
                                             java.lang.String groupName,
                                             Closure getter,
                                             Closure setter)
      • registerExplicitMethod

        public void registerExplicitMethod​(java.lang.String name,
                                           Closure closure)
      • registerExplicitMethod

        public void registerExplicitMethod​(java.lang.String name,
                                           java.lang.String groupName,
                                           Closure closure)
      • registerBeanFactory

        public void registerBeanFactory​(java.lang.String theName,
                                        java.lang.Class beanClass)
        Registers a factory for a JavaBean.
        The JavaBean class should have a no-args constructor.
        Parameters:
        theName - name of the node
        beanClass - the factory to handle the name
      • registerBeanFactory

        public void registerBeanFactory​(java.lang.String theName,
                                        java.lang.String groupName,
                                        java.lang.Class beanClass)
        Registers a factory for a JavaBean.
        The JavaBean class should have a no-args constructor.
        Parameters:
        theName - name of the node
        groupName - thr group to register this node in
        beanClass - the factory to handle the name
      • registerFactory

        public void registerFactory​(java.lang.String name,
                                    Factory factory)
        Registers a factory for a node name.
        Parameters:
        name - the name of the node
        factory - the factory to return the values
      • registerFactory

        public void registerFactory​(java.lang.String name,
                                    java.lang.String groupName,
                                    Factory factory)
        Registers a factory for a node name.
        Parameters:
        name - the name of the node
        groupName - thr group to register this node in
        factory - the factory to return the values
      • createNode

        protected java.lang.Object createNode​(java.lang.Object name,
                                              java.util.Map attributes,
                                              java.lang.Object value)
        This method is responsible for instantiating a node and configure its properties.
        Parameters:
        name - the name of the node
        attributes - the attributes for the node
        value - the value arguments for the node
        Returns:
        the object return from the factory
      • resolveFactory

        protected Factory resolveFactory​(java.lang.Object name,
                                         java.util.Map attributes,
                                         java.lang.Object value)
        This is a hook for subclasses to plugin a custom strategy for mapping names to factories.
        Parameters:
        name - the name of the factory
        attributes - the attributes from the node
        value - value arguments from te node
        Returns:
        the Factory associated with name.
      • resolveExplicitMethod

        protected Closure resolveExplicitMethod​(java.lang.String methodName,
                                                java.lang.Object args)
        This is a hook for subclasses to plugin a custom strategy for mapping names to explicit methods.
        Parameters:
        methodName - the name of the explicit method
        args - the arguments for the method
        Returns:
        the closure for the matched explicit method.
      • resolveExplicitProperty

        protected Closure[] resolveExplicitProperty​(java.lang.String propertyName)
        This is a hook for subclasses to plugin a custom strategy for mapping names to property methods.
        Parameters:
        propertyName - the name of the explicit method
        Returns:
        the get and set closures (in that order) for the matched explicit property.
      • checkExplicitMethod

        protected boolean checkExplicitMethod​(java.lang.String methodName,
                                              java.lang.Object args,
                                              Reference result)
      • dispathNodeCall

        @Deprecated
        protected java.lang.Object dispathNodeCall​(java.lang.Object name,
                                                   java.lang.Object args)
        Deprecated.
      • dispatchNodeCall

        protected java.lang.Object dispatchNodeCall​(java.lang.Object name,
                                                    java.lang.Object args)
      • getName

        public java.lang.Object getName​(java.lang.String methodName)
        A hook to allow names to be converted into some other object such as a QName in XML or ObjectName in JMX.
        Parameters:
        methodName - the name of the desired method
        Returns:
        the object representing the name
      • getProxyBuilder

        protected FactoryBuilderSupport getProxyBuilder()
        Proxy builders are useful for changing the building context, thus enabling mix & match builders.
        Returns:
        the current builder that serves as a proxy.
      • setProxyBuilder

        protected void setProxyBuilder​(FactoryBuilderSupport proxyBuilder)
        Sets the builder to be used as a proxy.
        Parameters:
        proxyBuilder - the new proxy
      • getNameMappingClosure

        public Closure getNameMappingClosure()
      • setNameMappingClosure

        public void setNameMappingClosure​(Closure nameMappingClosure)
      • handleNodeAttributes

        protected void handleNodeAttributes​(java.lang.Object node,
                                            java.util.Map attributes)
        Assigns any existing properties to the node.
        It will call attributeDelegates before passing control to the factory that built the node.
        Parameters:
        node - the object returned by tne node factory
        attributes - the attributes for the node
      • newContext

        protected void newContext()
        Pushes a new context on the stack.
      • nodeCompleted

        protected void nodeCompleted​(java.lang.Object parent,
                                     java.lang.Object node)
        A hook to allow nodes to be processed once they have had all of their children applied.
        Parameters:
        node - the current node being processed
        parent - the parent of the node being processed
      • popContext

        protected java.util.Map<java.lang.String,​java.lang.Object> popContext()
        Removes the last context from the stack.
        Returns:
        the content just removed
      • postInstantiate

        protected void postInstantiate​(java.lang.Object name,
                                       java.util.Map attributes,
                                       java.lang.Object node)
        A hook after the factory creates the node and before attributes are set.
        It will call any registered postInstantiateDelegates, if you override this method be sure to call this impl somewhere in your code.
        Parameters:
        name - the name of the node
        attributes - the attributes for the node
        node - the object created by the node factory
      • postNodeCompletion

        protected java.lang.Object postNodeCompletion​(java.lang.Object parent,
                                                      java.lang.Object node)
        A hook to allow nodes to be processed once they have had all of their children applied and allows the actual node object that represents the Markup element to be changed.
        It will call any registered postNodeCompletionDelegates, if you override this method be sure to call this impl at the end of your code.
        Parameters:
        node - the current node being processed
        parent - the parent of the node being processed
        Returns:
        the node, possibly new, that represents the markup element
      • preInstantiate

        protected void preInstantiate​(java.lang.Object name,
                                      java.util.Map attributes,
                                      java.lang.Object value)
        A hook before the factory creates the node.
        It will call any registered preInstantiateDelegates, if you override this method be sure to call this impl somewhere in your code.
        Parameters:
        name - the name of the node
        attributes - the attributes of the node
        value - the value argument(s) of the node
      • reset

        protected void reset()
        Clears the context stack.
      • setClosureDelegate

        protected void setClosureDelegate​(Closure closure,
                                          java.lang.Object node)
        A strategy method to allow derived builders to use builder-trees and switch in different kinds of builders. This method should call the setDelegate() method on the closure which by default passes in this but if node is-a builder we could pass that in instead (or do something wacky too)
        Parameters:
        closure - the closure on which to call setDelegate()
        node - the node value that we've just created, which could be a builder
      • setNodeAttributes

        protected void setNodeAttributes​(java.lang.Object node,
                                         java.util.Map attributes)
        Maps attributes key/values to properties on node.
        Parameters:
        node - the object from the node
        attributes - the attributes to be set
      • setParent

        protected void setParent​(java.lang.Object parent,
                                 java.lang.Object child)
        Strategy method to establish parent/child relationships.
        Parameters:
        parent - the object from the parent node
        child - the object from the child node
      • getContexts

        protected java.util.LinkedList<java.util.Map<java.lang.String,​java.lang.Object>> getContexts()
        Returns:
        the stack of available contexts.
      • getContinuationData

        protected java.util.Map<java.lang.String,​java.lang.Object> getContinuationData()
        Stores the thread local states in a Map that can be passed across threads
        Returns:
        the map
      • restoreFromContinuationData

        protected void restoreFromContinuationData​(java.util.Map<java.lang.String,​java.lang.Object> data)
        Restores the state of the current builder to the same state as an older build. Caution, this will destroy rather than merge the current build context if there is any,
        Parameters:
        data - the data retrieved from a compatible getContinuationData call
      • build

        public java.lang.Object build​(java.lang.Class viewClass)
      • build

        public java.lang.Object build​(Script script)
      • build

        public java.lang.Object build​(java.lang.String script,
                                      GroovyClassLoader loader)
      • withBuilder

        public java.lang.Object withBuilder​(FactoryBuilderSupport builder,
                                            Closure closure)
        Switches the builder's proxyBuilder during the execution of a closure.
        This is useful to temporary change the building context to another builder without the need for a contrived setup. It will also take care of restoring the previous proxyBuilder when the execution finishes, even if an exception was thrown from inside the closure.
        Parameters:
        builder - the temporary builder to switch to as proxyBuilder.
        closure - the closure to be executed under the temporary builder.
        Returns:
        the execution result of the closure.
        Throws:
        java.lang.RuntimeException - - any exception the closure might have thrown during execution.
      • withBuilder

        public java.lang.Object withBuilder​(FactoryBuilderSupport builder,
                                            java.lang.String name,
                                            Closure closure)
        Switches the builder's proxyBuilder during the execution of a closure.
        This is useful to temporary change the building context to another builder without the need for a contrived setup. It will also take care of restoring the previous proxyBuilder when the execution finishes, even if an exception was thrown from inside the closure. Additionally it will use the closure's result as the value for the node identified by 'name'.
        Parameters:
        builder - the temporary builder to switch to as proxyBuilder.
        name - the node to build on the 'parent' builder.
        closure - the closure to be executed under the temporary builder.
        Returns:
        a node that responds to value of name with the closure's result as its value.
        Throws:
        java.lang.RuntimeException - - any exception the closure might have thrown during execution.
      • withBuilder

        public java.lang.Object withBuilder​(java.util.Map attributes,
                                            FactoryBuilderSupport builder,
                                            java.lang.String name,
                                            Closure closure)
        Switches the builder's proxyBuilder during the execution of a closure.
        This is useful to temporary change the building context to another builder without the need for a contrived setup. It will also take care of restoring the previous proxyBuilder when the execution finishes, even if an exception was thrown from inside the closure. Additionally it will use the closure's result as the value for the node identified by 'name' and assign any attributes that might have been set.
        Parameters:
        attributes - additional properties for the node on the parent builder.
        builder - the temporary builder to switch to as proxyBuilder.
        name - the node to build on the 'parent' builder.
        closure - the closure to be executed under the temporary builder.
        Returns:
        a node that responds to value of name with the closure's result as its value.
        Throws:
        java.lang.RuntimeException - - any exception the closure might have thrown during execution.
      • addDisposalClosure

        public void addDisposalClosure​(Closure closure)
      • getDisposalClosures

        public java.util.List<Closure> getDisposalClosures()
      • dispose

        public void dispose()