[Java] Class FactoryBuilderSupport
- groovy.util.FactoryBuilderSupport
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.
- Authors:
- James Strachan
- Andres Almiray
- Danno Ferrin
Field Summary
Modifiers | Name | Description |
---|---|---|
static String | CHILD_BUILDER | |
static String | CURRENT_BUILDER | |
static String | CURRENT_FACTORY | |
static String | CURRENT_NAME | |
static String | CURRENT_NODE | |
static String | OWNER | |
static String | PARENT_BUILDER | |
static String | PARENT_CONTEXT | |
static String | PARENT_FACTORY | |
static String | PARENT_NAME | |
static String | PARENT_NODE | |
static String | SCRIPT_CLASS_NAME | |
protected LinkedList<Closure> | attributeDelegates | |
protected boolean | autoRegistrationComplete | |
protected boolean | autoRegistrationRunning | |
protected Map<String, Closure> | explicitMethods | |
protected Map<String, Closure> | explicitProperties | |
protected Closure | methodMissingDelegate | |
protected LinkedList<Closure> | postInstantiateDelegates | |
protected LinkedList<Closure> | postNodeCompletionDelegates | |
protected LinkedList<Closure> | preInstantiateDelegates | |
protected Closure | propertyMissingDelegate | |
protected Map<String, Set<String>> | registrationGroup | |
protected String | registrationGroupName |
Constructor Summary
Constructor and description |
---|
FactoryBuilderSupport
() |
FactoryBuilderSupport
(boolean init) |
Methods Summary
Type Params | Return Type | Name and description |
---|---|---|
Closure |
addAttributeDelegate(Closure attrDelegate) Add an attribute delegate so it can intercept attributes being set. | |
void |
addDisposalClosure(Closure closure) | |
Closure |
addPostInstantiateDelegate(Closure delegate) Add a postInstantiate delegate so it can intercept nodes after they are created. | |
Closure |
addPostNodeCompletionDelegate(Closure delegate) Add a nodeCompletion delegate so it can intercept nodes after they done with building. | |
Closure |
addPreInstantiateDelegate(Closure delegate) Add a preInstantiate delegate so it can intercept nodes before they are created. | |
void |
autoRegisterNodes() Ask the nodes to be registered | |
Object |
build(Class viewClass) | |
Object |
build(Script script) | |
Object |
build(String script, GroovyClassLoader loader) | |
protected boolean |
checkExplicitMethod(String methodName, Object args, Reference result) | |
static void |
checkValueIsNull(Object value, Object name) Throws an exception if value is null. | |
static boolean |
checkValueIsType(Object value, Object name, Class type) Checks type of value against builder type | |
static boolean |
checkValueIsTypeNotString(Object value, Object name, Class type) Checks values against factory's type | |
protected Object |
createNode(Object name, Map attributes, Object value) This method is responsible for instantiating a node and configure its properties. | |
protected Object |
dispatchNodeCall(Object name, Object args) | |
protected Object |
dispathNodeCall(Object name, Object args) Use FactoryBuilderSupport.dispatchNodeCall instead. | |
void |
dispose() | |
List<Closure> |
getAttributeDelegates() | |
FactoryBuilderSupport |
getChildBuilder() | |
Map<String, Object> |
getContext() @return the context of the current node. | |
Object |
getContextAttribute(String key) | |
protected LinkedList<Map<String, Object>> |
getContexts() @return the stack of available contexts. | |
protected Map<String, Object> |
getContinuationData() Stores the thread local states in a Map that can be passed across threads | |
Object |
getCurrent() @return the current node being built. | |
FactoryBuilderSupport |
getCurrentBuilder() @return the builder that built the current node. | |
Factory |
getCurrentFactory() @return the factory that built the current node. | |
String |
getCurrentName() @return the factory of the parent of the current node. | |
List<Closure> |
getDisposalClosures() | |
Map<String, Closure> |
getExplicitMethods() @return the explicit methods map (Unmodifiable Map). | |
Map<String, Closure> |
getExplicitProperties() @return the explicit properties map (Unmodifiable Map). | |
Map<String, Factory> |
getFactories() @return the factory map (Unmodifiable Map). | |
Map<String, Closure> |
getLocalExplicitMethods() @return the explicit methods map (Unmodifiable Map). | |
Map<String, Closure> |
getLocalExplicitProperties() @return the explicit properties map (Unmodifiable Map). | |
Map<String, Factory> |
getLocalFactories() @return the factory map (Unmodifiable Map). | |
Closure |
getMethodMissingDelegate() | |
Object |
getName(String methodName) A hook to allow names to be converted into some other object such as a QName in XML or ObjectName in JMX. | |
Closure |
getNameMappingClosure() | |
Map |
getParentContext() @return the context of the parent of the current node. | |
Factory |
getParentFactory() @return the factory of the parent of the current node. | |
String |
getParentName() @return the name of the parent of the current node. | |
Object |
getParentNode() @return the node of the parent of the current node. | |
List<Closure> |
getPostInstantiateDelegates() | |
List<Closure> |
getPostNodeCompletionDelegates() | |
List<Closure> |
getPreInstantiateDelegates() | |
Object |
getProperty(String property) Overloaded to make variables appear as bean properties or via the subscript operator | |
Closure |
getPropertyMissingDelegate() | |
protected FactoryBuilderSupport |
getProxyBuilder() Proxy builders are useful for changing the building context, thus enabling mix & match builders. | |
Set<String> |
getRegistrationGroupItems(String group) | |
Set<String> |
getRegistrationGroups() | |
Object |
getVariable(String name) @param name the name of the variable to lookup | |
Map |
getVariables() | |
protected void |
handleNodeAttributes(Object node, Map attributes) Assigns any existing properties to the node. | |
Object |
invokeMethod(String methodName) Convenience method when no arguments are required | |
Object |
invokeMethod(String methodName, Object args) | |
protected void |
newContext() Pushes a new context on the stack. | |
protected void |
nodeCompleted(Object parent, Object node) A hook to allow nodes to be processed once they have had all of their children applied. | |
protected Map<String, Object> |
popContext() Removes the last context from the stack. | |
protected void |
postInstantiate(Object name, Map attributes, Object node) A hook after the factory creates the node and before attributes are set. | |
protected Object |
postNodeCompletion(Object parent, 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. | |
protected void |
preInstantiate(Object name, Map attributes, Object value) A hook before the factory creates the node. | |
void |
registerBeanFactory(String theName, Class beanClass) Registers a factory for a JavaBean. | |
void |
registerBeanFactory(String theName, String groupName, Class beanClass) Registers a factory for a JavaBean. | |
void |
registerExplicitMethod(String name, Closure closure) | |
void |
registerExplicitMethod(String name, String groupName, Closure closure) | |
void |
registerExplicitProperty(String name, Closure getter, Closure setter) | |
void |
registerExplicitProperty(String name, String groupName, Closure getter, Closure setter) | |
void |
registerFactory(String name, Factory factory) Registers a factory for a node name. | |
void |
registerFactory(String name, String groupName, Factory factory) Registers a factory for a node name. | |
void |
removeAttributeDelegate(Closure attrDelegate) Remove the most recently added instance of the attribute delegate. | |
void |
removePostInstantiateDelegate(Closure delegate) Remove the most recently added instance of the postInstantiate delegate. | |
void |
removePostNodeCompletionDelegate(Closure delegate) Remove the most recently added instance of the nodeCompletion delegate. | |
void |
removePreInstantiateDelegate(Closure delegate) Remove the most recently added instance of the preInstantiate delegate. | |
protected void |
reset() Clears the context stack. | |
protected Closure |
resolveExplicitMethod(String methodName, Object args) This is a hook for subclasses to plugin a custom strategy for mapping names to explicit methods. | |
protected Closure[] |
resolveExplicitProperty(String propertyName) This is a hook for subclasses to plugin a custom strategy for mapping names to property methods. | |
protected Factory |
resolveFactory(Object name, Map attributes, Object value) This is a hook for subclasses to plugin a custom strategy for mapping names to factories. | |
protected void |
restoreFromContinuationData(Map<String, Object> data) Restores the state of the current builder to the same state as an older build. | |
protected void |
setClosureDelegate(Closure closure, Object node) A strategy method to allow derived builders to use builder-trees and switch in different kinds of builders. | |
void |
setMethodMissingDelegate(Closure delegate) | |
void |
setNameMappingClosure(Closure nameMappingClosure) | |
protected void |
setNodeAttributes(Object node, Map attributes) Maps attributes key/values to properties on node. | |
protected void |
setParent(Object parent, Object child) Strategy method to establish parent/child relationships. | |
void |
setProperty(String property, Object newValue) Overloaded to make variables appear as bean properties or via the subscript operator | |
void |
setPropertyMissingDelegate(Closure delegate) | |
protected void |
setProxyBuilder(FactoryBuilderSupport proxyBuilder) Sets the builder to be used as a proxy. | |
void |
setVariable(String name, Object value) Sets the value of the given variable | |
Object |
withBuilder(FactoryBuilderSupport builder, Closure closure) Switches the builder's proxyBuilder during the execution of a closure. | |
Object |
withBuilder(FactoryBuilderSupport builder, String name, Closure closure) Switches the builder's proxyBuilder during the execution of a closure. | |
Object |
withBuilder(Map attributes, FactoryBuilderSupport builder, String name, Closure closure) Switches the builder's proxyBuilder during the execution of a closure. |
Inherited Methods Summary
Methods inherited from class | Name |
---|---|
class Binding | getProperty, getVariable, getVariables, hasVariable, setProperty, setVariable |
class GroovyObjectSupport | getMetaClass, getProperty, invokeMethod, setMetaClass, setProperty |
class Object | wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll |
Field Detail
public static final String CHILD_BUILDER
public static final String CURRENT_BUILDER
public static final String CURRENT_FACTORY
public static final String CURRENT_NAME
public static final String CURRENT_NODE
public static final String OWNER
public static final String PARENT_BUILDER
public static final String PARENT_CONTEXT
public static final String PARENT_FACTORY
public static final String PARENT_NAME
public static final String PARENT_NODE
public static final String SCRIPT_CLASS_NAME
protected LinkedList<Closure> attributeDelegates
protected boolean autoRegistrationComplete
protected boolean autoRegistrationRunning
protected Map<String, Closure> explicitMethods
protected Map<String, Closure> explicitProperties
protected Closure methodMissingDelegate
protected LinkedList<Closure> postInstantiateDelegates
protected LinkedList<Closure> postNodeCompletionDelegates
protected LinkedList<Closure> preInstantiateDelegates
protected Closure propertyMissingDelegate
protected Map<String, Set<String>> registrationGroup
protected String registrationGroupName
Constructor Detail
public FactoryBuilderSupport()
public FactoryBuilderSupport(boolean init)
Method Detail
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
public void addDisposalClosure(Closure closure)
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
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
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
public void autoRegisterNodes()
Ask the nodes to be registered
public Object build(Class viewClass)
public Object build(Script script)
public Object build(String script, GroovyClassLoader loader)
protected boolean checkExplicitMethod(String methodName, Object args, Reference result)
public static void checkValueIsNull(Object value, Object name)
Throws an exception if value is null.
- Parameters:
-
value
- the node's value -
name
- the node's name
public static boolean checkValueIsType(Object value, Object name, 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.
public static boolean checkValueIsTypeNotString(Object value, Object name, 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.
protected Object createNode(Object name, Map attributes, 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
protected Object dispatchNodeCall(Object name, Object args)
@Deprecated protected Object dispathNodeCall(Object name, Object args)
Use FactoryBuilderSupport.dispatchNodeCall instead.
public void dispose()
public List<Closure> getAttributeDelegates()
public FactoryBuilderSupport getChildBuilder()
public Map<String, Object> getContext()
- Returns:
- the context of the current node.
public Object getContextAttribute(String key)
protected LinkedList<Map<String, Object>> getContexts()
- Returns:
- the stack of available contexts.
protected Map<String, Object> getContinuationData()
Stores the thread local states in a Map that can be passed across threads
- Returns:
- the map
public Object getCurrent()
- Returns:
- the current node being built.
public FactoryBuilderSupport getCurrentBuilder()
- Returns:
- the builder that built the current node.
public Factory getCurrentFactory()
- Returns:
- the factory that built the current node.
public String getCurrentName()
- Returns:
- the factory of the parent of the current node.
public List<Closure> getDisposalClosures()
public Map<String, Closure> getExplicitMethods()
- Returns:
- the explicit methods map (Unmodifiable Map).
public Map<String, Closure> getExplicitProperties()
- Returns:
- the explicit properties map (Unmodifiable Map).
public Map<String, Factory> getFactories()
- Returns:
- the factory map (Unmodifiable Map).
public Map<String, Closure> getLocalExplicitMethods()
- Returns:
- the explicit methods map (Unmodifiable Map).
public Map<String, Closure> getLocalExplicitProperties()
- Returns:
- the explicit properties map (Unmodifiable Map).
public Map<String, Factory> getLocalFactories()
- Returns:
- the factory map (Unmodifiable Map).
public Closure getMethodMissingDelegate()
public Object getName(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
public Closure getNameMappingClosure()
public Map getParentContext()
- Returns:
- the context of the parent of the current node.
public Factory getParentFactory()
- Returns:
- the factory of the parent of the current node.
public String getParentName()
- Returns:
- the name of the parent of the current node.
public Object getParentNode()
- Returns:
- the node of the parent of the current node.
public List<Closure> getPostInstantiateDelegates()
public List<Closure> getPostNodeCompletionDelegates()
public List<Closure> getPreInstantiateDelegates()
public Object getProperty(String property)
Overloaded to make variables appear as bean properties or via the subscript operator
public Closure getPropertyMissingDelegate()
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.
public Set<String> getRegistrationGroupItems(String group)
public Set<String> getRegistrationGroups()
public Object getVariable(String name)
- Parameters:
-
name
- the name of the variable to lookup
- Returns:
- the variable value
public Map getVariables()
protected void handleNodeAttributes(Object node, 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
public Object invokeMethod(String methodName)
Convenience method when no arguments are required
- Parameters:
-
methodName
- the name of the method to invoke
- Returns:
- the result of the call
public Object invokeMethod(String methodName, Object args)
protected void newContext()
Pushes a new context on the stack.
protected void nodeCompleted(Object parent, 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
protected Map<String, Object> popContext()
Removes the last context from the stack.
- Returns:
- the content just removed
protected void postInstantiate(Object name, Map attributes, 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
protected Object postNodeCompletion(Object parent, 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
protected void preInstantiate(Object name, Map attributes, 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
public void registerBeanFactory(String theName, 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
public void registerBeanFactory(String theName, String groupName, 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
public void registerExplicitMethod(String name, Closure closure)
public void registerExplicitMethod(String name, String groupName, Closure closure)
public void registerExplicitProperty(String name, Closure getter, Closure setter)
public void registerExplicitProperty(String name, String groupName, Closure getter, Closure setter)
public void registerFactory(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
public void registerFactory(String name, 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
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
public void removePostInstantiateDelegate(Closure delegate)
Remove the most recently added instance of the postInstantiate delegate.
- Parameters:
-
delegate
- the closure to invoke
public void removePostNodeCompletionDelegate(Closure delegate)
Remove the most recently added instance of the nodeCompletion delegate.
- Parameters:
-
delegate
- the closure to be removed
public void removePreInstantiateDelegate(Closure delegate)
Remove the most recently added instance of the preInstantiate delegate.
- Parameters:
-
delegate
- the closure to invoke
protected void reset()
Clears the context stack.
@SuppressWarnings({"UnusedDeclaration"}) protected Closure resolveExplicitMethod(String methodName, 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.
protected Closure[] resolveExplicitProperty(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.
protected Factory resolveFactory(Object name, Map attributes, 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.
protected void restoreFromContinuationData(Map<String, 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
@SuppressWarnings({"UnusedDeclaration"}) protected void setClosureDelegate(Closure closure, 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
public void setMethodMissingDelegate(Closure delegate)
public void setNameMappingClosure(Closure nameMappingClosure)
protected void setNodeAttributes(Object node, Map attributes)
Maps attributes key/values to properties on node.
- Parameters:
-
node
- the object from the node -
attributes
- the attributes to be set
protected void setParent(Object parent, Object child)
Strategy method to establish parent/child relationships.
- Parameters:
-
parent
- the object from the parent node -
child
- the object from the child node
public void setProperty(String property, Object newValue)
Overloaded to make variables appear as bean properties or via the subscript operator
public void setPropertyMissingDelegate(Closure delegate)
protected void setProxyBuilder(FactoryBuilderSupport proxyBuilder)
Sets the builder to be used as a proxy.
- Parameters:
-
proxyBuilder
- the new proxy
public void setVariable(String name, Object value)
Sets the value of the given variable
- Parameters:
-
name
- the name of the variable to set -
value
- the new value for the given variable
public 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.
- throws:
- RuntimeException - any exception the closure might have thrown during execution.
- 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.
public Object withBuilder(FactoryBuilderSupport builder, 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'.
- throws:
- RuntimeException - any exception the closure might have thrown during execution.
- 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.
public Object withBuilder(Map attributes, FactoryBuilderSupport builder, 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.
- throws:
- RuntimeException - any exception the closure might have thrown during execution.
- 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.
© 2003-2020 The Apache Software Foundation
Licensed under the Apache license.
https://docs.groovy-lang.org/2.4.21/html/gapi/groovy/util/FactoryBuilderSupport.html