org.codehaus.gpars

groovyx.gpars.dataflow
[Java] Class Dataflows

java.lang.Object
  groovy.lang.GroovyObjectSupport
      groovyx.gpars.dataflow.Dataflows

public final class Dataflows
extends groovy.lang.GroovyObjectSupport

Convenience class that makes working with DataflowVariables more comfortable.

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]
 
Authors:
Vaclav Pech, Dierk Koenig, Alex Tkachman Date: Sep 3, 2009


Field Summary
static int DEFAULT_CONCURRENCY_LEVEL

static int DEFAULT_INITIAL_CAPACITY

static float DEFAULT_LOAD_FACTOR

private static DataflowVariable DUMMY

private java.lang.Object lock

private java.util.concurrent.ConcurrentMap variables

 
Constructor Summary
Dataflows(int initialCapacity, float loadFactor, int concurrencyLevel)

Constructor that supports the various constructors of the underlying ConcurrentHashMap (unless the one with Map parameter).

Dataflows()

Constructor with default values for building the underlying ConcurrentHashMap

 
Method Summary
boolean contains(java.lang.Object name)

Checks whether a certain key is contained in the map.

private DataflowVariable 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

Unfortunately we have to sync on this as there is no better option (God forbid to sync on name)

java.lang.Object getAt(int index)

Retrieves the DFV associated with the given index

java.lang.Object getProperty(java.lang.String property)

Returns:
the value of the DataflowVariable associated with the property "name".

java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args)

Invokes the given method.

java.util.Iterator iterator()

Convenience method to play nicely with Groovy object iteration methods.

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 putNewUnderLock(java.lang.Object name)

Utility method extracted just to help JIT

DataflowVariable 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".

 
Methods inherited from class groovy.lang.GroovyObjectSupport
groovy.lang.GroovyObjectSupport#setProperty(java.lang.String, java.lang.Object), groovy.lang.GroovyObjectSupport#getProperty(java.lang.String), groovy.lang.GroovyObjectSupport#getMetaClass(), groovy.lang.GroovyObjectSupport#setMetaClass(groovy.lang.MetaClass), groovy.lang.GroovyObjectSupport#invokeMethod(java.lang.String, java.lang.Object), groovy.lang.GroovyObjectSupport#wait(long), groovy.lang.GroovyObjectSupport#wait(), groovy.lang.GroovyObjectSupport#wait(long, int), groovy.lang.GroovyObjectSupport#equals(java.lang.Object), groovy.lang.GroovyObjectSupport#toString(), groovy.lang.GroovyObjectSupport#hashCode(), groovy.lang.GroovyObjectSupport#getClass(), groovy.lang.GroovyObjectSupport#notify(), groovy.lang.GroovyObjectSupport#notifyAll()
 
Methods inherited from class java.lang.Object
java.lang.Object#wait(long), java.lang.Object#wait(), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
 

Field Detail

DEFAULT_CONCURRENCY_LEVEL

static final int DEFAULT_CONCURRENCY_LEVEL


DEFAULT_INITIAL_CAPACITY

static final int DEFAULT_INITIAL_CAPACITY


DEFAULT_LOAD_FACTOR

static final float DEFAULT_LOAD_FACTOR


DUMMY

private static final DataflowVariable DUMMY


lock

private final java.lang.Object lock


variables

@SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized"})
private java.util.concurrent.ConcurrentMap variables


 
Constructor Detail

Dataflows

public Dataflows(int initialCapacity, float loadFactor, int concurrencyLevel)
Constructor that supports the various constructors of the underlying ConcurrentHashMap (unless the one with Map parameter).
throws:
IllegalArgumentException if the initial capacity is negative or the load factor or concurrencyLevel are non-positive.
Parameters:
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.
See Also:
java.util.concurrent.ConcurrentHashMap


Dataflows

public Dataflows()
Constructor with default values for building the underlying ConcurrentHashMap
See Also:
java.util.concurrent.ConcurrentHashMap


 
Method Detail

contains

public boolean contains(java.lang.Object name)
Checks whether a certain key is contained in the map. Doesn't check, whether the variable has already been bound.
Parameters:
name - The name of the DFV to check.
Returns:
A DFV is exists, or null


ensureToContainVariable

private DataflowVariable 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

Unfortunately we have to sync on this as there is no better option (God forbid to sync on name)

Parameters:
name - The key to ensure has a DFV bound to it
Returns:
DataflowVariable corresponding to name


getAt

@SuppressWarnings({"AutoBoxing"})
java.lang.Object getAt(int index)
Retrieves the DFV associated with the given index
throws:
InterruptedException If the thread gets interrupted
Parameters:
index - The index to find a match for
Returns:
the value of the DataflowVariable associated with the property "index". May block if the value is not scalar.
See Also:
DataflowVariable.getVal


getProperty

@Override
public java.lang.Object getProperty(java.lang.String property)
Returns:
the value of the DataflowVariable associated with the property "name". May block if the value is not scalar.
See Also:
DataflowVariable.getVal


invokeMethod

@Override
public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args)
Invokes the given method. Allows for invoking whenBound() on the dataflow variables.
 def df = new Dataflows()
 df.var {*     println "Variable bound to $it"
 }* 
Parameters:
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)
Returns:
the result of invoking the method (void)


iterator

public java.util.Iterator iterator()
Convenience method to play nicely with Groovy object iteration methods. The iteration restrictions of ConcurrentHashMap concerning parallel access and ConcurrentModificationException apply.
Returns:
iterator over the stored key:DataflowVariable value pairs


putAt

void putAt(java.lang.Object index, java.lang.Object value)
Binds the value to the DataflowVariable that is associated with the property "index".
Parameters:
index - The index to associate the value with
value - a scalar or a DataflowVariable that may block on value access
See Also:
DataflowVariable.bind


putNewUnderLock

private DataflowVariable putNewUnderLock(java.lang.Object name)
Utility method extracted just to help JIT
Parameters:
name - The key to ensure has a DFV bound to it
Returns:
a DFV associated with the key


remove

public DataflowVariable remove(java.lang.Object name)
Removes a DFV from the map and binds it to null, if it has not been bound yet
Parameters:
name - The name of the DFV to remove.
Returns:
A DFV is exists, or null


setProperty

@Override
public void setProperty(java.lang.String property, java.lang.Object newValue)
Binds the value to the DataflowVariable that is associated with the property "name".
Parameters:
newValue - a scalar or a DataflowVariable that may block on value access
See Also:
DataflowVariable.bind


 

Copyright © 2008–2010 Václav Pech. All Rights Reserved.