public final class Dataflows
extends groovy.lang.GroovyObjectSupport
See the implementation of groovyx.gpars.samples.dataflow.DemoDataflows for a full example.
A Dataflows instance is a bean with properties of type DataflowVariable. Property access is relayed to the access methods of DataflowVariable. Each property is initialized lazily the first time it is accessed. Non-String named properties can be also accessed using array-like indexing syntax This allows a rather compact usage of DataflowVariables like
final df = new Dataflows() start { df[0] = df.x + df.y } start { df.x = 10 } start { df.y = 5 } assert 15 == df[0]
Modifier and Type | Field and Description |
---|---|
(package private) static int |
DEFAULT_CONCURRENCY_LEVEL |
(package private) static int |
DEFAULT_INITIAL_CAPACITY |
(package private) static float |
DEFAULT_LOAD_FACTOR |
private static DataflowVariable<java.lang.Object> |
DUMMY |
private java.lang.Object |
lock |
private java.util.concurrent.ConcurrentMap<java.lang.Object,DataflowVariable<java.lang.Object>> |
variables |
Constructor and Description |
---|
Dataflows()
Constructor with default values for building the underlying ConcurrentHashMap
|
Dataflows(int initialCapacity,
float loadFactor,
int concurrencyLevel)
Constructor that supports the various constructors of the underlying
ConcurrentHashMap (unless the one with Map parameter).
|
Modifier and Type | Method and Description |
---|---|
boolean |
contains(java.lang.Object name)
Checks whether a certain key is contained in the map.
|
private DataflowVariable<java.lang.Object> |
ensureToContainVariable(java.lang.Object name)
The idea is following:
we try to putIfAbsent dummy DFV in to map
if something real already there we are done
if not we obtain lock and put new DFV with double check
|
(package private) java.lang.Object |
getAt(int index)
Retrieves the DFV associated with the given index
|
java.lang.Object |
getProperty(java.lang.String property) |
java.lang.Object |
invokeMethod(java.lang.String name,
java.lang.Object args)
Invokes the given method.
|
java.util.Iterator<java.util.Map.Entry<java.lang.Object,DataflowVariable<java.lang.Object>>> |
iterator()
Convenience method to play nicely with Groovy object iteration methods.
|
(package private) void |
putAt(java.lang.Object index,
java.lang.Object value)
Binds the value to the DataflowVariable that is associated with the property "index".
|
private DataflowVariable<java.lang.Object> |
putNewUnderLock(java.lang.Object name)
Utility method extracted just to help JIT
|
DataflowVariable<java.lang.Object> |
remove(java.lang.Object name)
Removes a DFV from the map and binds it to null, if it has not been bound yet
|
void |
setProperty(java.lang.String property,
java.lang.Object newValue)
Binds the value to the DataflowVariable that is associated with the property "name".
|
private static final DataflowVariable<java.lang.Object> DUMMY
private final java.lang.Object lock
private java.util.concurrent.ConcurrentMap<java.lang.Object,DataflowVariable<java.lang.Object>> variables
static final int DEFAULT_INITIAL_CAPACITY
static final float DEFAULT_LOAD_FACTOR
static final int DEFAULT_CONCURRENCY_LEVEL
public Dataflows(int initialCapacity, float loadFactor, int concurrencyLevel)
initialCapacity
- the initial capacity. The implementation
performs internal sizing to accommodate this many elements.loadFactor
- the load factor threshold, used to control resizing.
Resizing may be performed when the average number of elements per
bin exceeds this threshold.concurrencyLevel
- the estimated number of concurrently
updating threads. The implementation performs internal sizing
to try to accommodate this many threads.java.lang.IllegalArgumentException
- if the initial capacity is
negative or the load factor or concurrencyLevel are
non-positive.ConcurrentHashMap
public Dataflows()
ConcurrentHashMap
public void setProperty(java.lang.String property, java.lang.Object newValue)
setProperty
in interface groovy.lang.GroovyObject
setProperty
in class groovy.lang.GroovyObjectSupport
newValue
- a scalar or a DataflowVariable that may block on value accessDataflowExpression.bind(T)
public java.lang.Object getProperty(java.lang.String property)
getProperty
in interface groovy.lang.GroovyObject
getProperty
in class groovy.lang.GroovyObjectSupport
DataflowExpression.getVal()
public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args)
def df = new Dataflows() df.var {* println "Variable bound to $it" }*
invokeMethod
in interface groovy.lang.GroovyObject
invokeMethod
in class groovy.lang.GroovyObjectSupport
name
- the name of the method to call (the variable name)args
- the arguments to use for the method call (a closure to invoke when a value is bound)java.lang.Object getAt(int index) throws java.lang.InterruptedException
index
- The index to find a match forjava.lang.InterruptedException
- If the thread gets interruptedDataflowExpression.getVal()
void putAt(java.lang.Object index, java.lang.Object value)
index
- The index to associate the value withvalue
- a scalar or a DataflowVariable that may block on value accessDataflowExpression.bind(T)
private DataflowVariable<java.lang.Object> ensureToContainVariable(java.lang.Object name)
Unfortunately we have to sync on this as there is no better option (God forbid to sync on name)
name
- The key to ensure has a DFV bound to itprivate DataflowVariable<java.lang.Object> putNewUnderLock(java.lang.Object name)
name
- The key to ensure has a DFV bound to itpublic DataflowVariable<java.lang.Object> remove(java.lang.Object name)
name
- The name of the DFV to remove.public boolean contains(java.lang.Object name)
name
- The name of the DFV to check.public java.util.Iterator<java.util.Map.Entry<java.lang.Object,DataflowVariable<java.lang.Object>>> iterator()