org.codehaus.gpars

groovyx.gpars.dataflow
[Java] Class DataflowQueue

java.lang.Object
  groovyx.gpars.dataflow.DataflowQueue
All Implemented Interfaces:
DataflowChannel

@java.lang.SuppressWarnings*/
public class DataflowQueue

Represents a thread-safe data flow stream. Values or DataflowVariables are added using the '<<' operator and safely read once available using the 'val' property. The iterative methods like each(), collect(), iterator(), any(), all() or the for loops work with snapshots of the stream at the time of calling the particular method. For actors and Dataflow Operators the asynchronous non-blocking variants of the getValAsync() methods can be used. They register the request to read a value and will send a message to the actor or operator once the value is available.

Authors:
Vaclav Pech Date: Jun 5, 2009


Field Summary
private DataflowChannelEventOrchestrator eventManager

private java.util.concurrent.LinkedBlockingQueue queue

private java.lang.Object queueLock

A collection of listeners who need to be informed each time the stream is bound to a value

private java.util.Queue requests

private java.util.Collection wheneverBoundListeners

 
Constructor Summary
DataflowQueue()

 
Method Summary
void binaryChoice(DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void binaryChoice(Pool pool, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void binaryChoice(PGroup group, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void binaryChoice(java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void binaryChoice(Pool pool, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void binaryChoice(PGroup group, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)

void bind(java.lang.Object value)

Hooks the registered when bound handlers to the supplied dataflow expression

DataflowReadChannel chainWith(groovy.lang.Closure closure)

DataflowReadChannel chainWith(Pool pool, groovy.lang.Closure closure)

DataflowReadChannel chainWith(PGroup group, groovy.lang.Closure closure)

DataflowReadChannel chainWith(java.util.Map params, groovy.lang.Closure closure)

DataflowReadChannel chainWith(Pool pool, java.util.Map params, groovy.lang.Closure closure)

DataflowReadChannel chainWith(PGroup group, java.util.Map params, groovy.lang.Closure closure)

void choice(java.util.List outputs, groovy.lang.Closure code)

void choice(Pool pool, java.util.List outputs, groovy.lang.Closure code)

void choice(PGroup group, java.util.List outputs, groovy.lang.Closure code)

void choice(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

void choice(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

void choice(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

private DataflowVariable copyDFV(java.util.Queue from, java.util.Queue to)

protected DataflowVariable createVariable()

Retrieves the value at the head of the buffer.

DataflowReadChannel filter(groovy.lang.Closure closure)

DataflowReadChannel filter(Pool pool, groovy.lang.Closure closure)

DataflowReadChannel filter(PGroup group, groovy.lang.Closure closure)

DataflowReadChannel filter(java.util.Map params, groovy.lang.Closure closure)

DataflowReadChannel filter(Pool pool, java.util.Map params, groovy.lang.Closure closure)

DataflowReadChannel filter(PGroup group, java.util.Map params, groovy.lang.Closure closure)

private void fireOnMessage(java.lang.Object value)

DataflowChannelEventListenerManager getEventManager()

java.util.concurrent.LinkedBlockingQueue getQueue()

java.lang.Object getVal()

Retrieves the value at the head of the buffer.

java.lang.Object getVal(long timeout, java.util.concurrent.TimeUnit units)

void getValAsync(MessageStream callback)

Asynchronously retrieves the value at the head of the buffer.

void getValAsync(java.lang.Object attachment, MessageStream callback)

Schedule closure to be executed by pooled actor after data became available.

private DataflowExpression hookWheneverBoundListeners(DataflowExpression expr)

Takes the first unsatisfied value request and binds a value on it.

void into(DataflowWriteChannel target)

void into(Pool pool, DataflowWriteChannel target)

void into(PGroup group, DataflowWriteChannel target)

void into(java.util.Map params, DataflowWriteChannel target)

void into(Pool pool, java.util.Map params, DataflowWriteChannel target)

void into(PGroup group, java.util.Map params, DataflowWriteChannel target)

boolean isBound()

Checks whether there's a DFV waiting in the queue and retrieves it.

java.util.Iterator iterator()

DataflowWriteChannel leftShift(DataflowReadChannel ref)

DataflowWriteChannel leftShift(java.lang.Object value)

Adds a DataflowVariable representing the passed in value to the buffer.

int length()

DataflowReadChannel merge(DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(Pool pool, DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(PGroup group, DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel merge(Pool pool, java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel merge(PGroup group, java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel merge(java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(Pool pool, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(PGroup group, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)

DataflowReadChannel merge(java.util.Map params, java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel merge(Pool pool, java.util.Map params, java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel merge(PGroup group, java.util.Map params, java.util.List others, groovy.lang.Closure closure)

DataflowReadChannel or(groovy.lang.Closure closure)

void or(DataflowWriteChannel target)

DataflowExpression poll()

private DataflowVariable retrieveForBind()

private DataflowVariable retrieveOrCreateVariable()

Returns the current size of the buffer

Promise rightShift(groovy.lang.Closure closure)

Schedule closure to be executed by pooled actor after the next data becomes available.

void separate(java.util.List outputs, groovy.lang.Closure code)

void separate(Pool pool, java.util.List outputs, groovy.lang.Closure code)

void separate(PGroup group, java.util.List outputs, groovy.lang.Closure code)

void separate(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

void separate(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

void separate(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)

void split(DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(Pool pool, DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(PGroup group, DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(java.util.List targets)

void split(Pool pool, java.util.List targets)

void split(PGroup group, java.util.List targets)

void split(java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(Pool pool, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(PGroup group, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)

void split(java.util.Map params, java.util.List targets)

void split(Pool pool, java.util.Map params, java.util.List targets)

void split(PGroup group, java.util.Map params, java.util.List targets)

DataflowReadChannel tap(DataflowWriteChannel target)

DataflowReadChannel tap(Pool pool, DataflowWriteChannel target)

DataflowReadChannel tap(PGroup group, DataflowWriteChannel target)

DataflowReadChannel tap(java.util.Map params, DataflowWriteChannel target)

DataflowReadChannel tap(Pool pool, java.util.Map params, DataflowWriteChannel target)

DataflowReadChannel tap(PGroup group, java.util.Map params, DataflowWriteChannel target)

Promise then(groovy.lang.Closure closure)

Promise then(Pool pool, groovy.lang.Closure closure)

Promise then(PGroup group, groovy.lang.Closure closure)

Send all pieces of data bound in the future to the provided stream when it becomes available

java.lang.String toString()

void whenBound(groovy.lang.Closure closure)

Schedule closure to be executed by pooled actor after data becomes available.

void whenBound(Pool pool, groovy.lang.Closure closure)

Send the next bound piece of data to the provided stream when it becomes available.

void whenBound(PGroup group, groovy.lang.Closure closure)

void whenBound(MessageStream stream)

Schedule closure to be executed after data became available.

void wheneverBound(groovy.lang.Closure closure)

Send all pieces of data bound in the future to the provided stream when it becomes available.

void wheneverBound(MessageStream stream)

 
Methods inherited from class java.lang.Object
java.lang.Object#wait(long, int), java.lang.Object#wait(long), java.lang.Object#wait(), 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

eventManager

private DataflowChannelEventOrchestrator eventManager


queue

private final java.util.concurrent.LinkedBlockingQueue queue


queueLock

private final java.lang.Object queueLock
A collection of listeners who need to be informed each time the stream is bound to a value


requests

private final java.util.Queue requests


wheneverBoundListeners

private final java.util.Collection wheneverBoundListeners


 
Constructor Detail

DataflowQueue

DataflowQueue()


 
Method Detail

binaryChoice

@java.lang.Override
public void binaryChoice(DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


binaryChoice

@java.lang.Override
public void binaryChoice(Pool pool, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


binaryChoice

@java.lang.Override
public void binaryChoice(PGroup group, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


binaryChoice

@java.lang.Override
public void binaryChoice(java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


binaryChoice

@java.lang.Overridepublic void choice(final List> outputs, final Closure code) {
public void binaryChoice(Pool pool, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


binaryChoice

@java.lang.Overridepublic void choice(final Pool pool, final List> outputs, final Closure code) {
public void binaryChoice(PGroup group, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)


bind

@java.lang.Override}
public final void bind(java.lang.Object value)
Hooks the registered when bound handlers to the supplied dataflow expression
Parameters:
expr - The expression to hook all the when bound listeners to
Returns:
The supplied expression handler to allow method chaining


chainWith

@java.lang.Override}
public final DataflowReadChannel chainWith(groovy.lang.Closure closure)


chainWith

@java.lang.Override}
public final DataflowReadChannel chainWith(Pool pool, groovy.lang.Closure closure)


chainWith

@java.lang.Override}
public DataflowReadChannel chainWith(PGroup group, groovy.lang.Closure closure)


chainWith

@java.lang.Overrideparameters.put("outputs", asList(result));
public final DataflowReadChannel chainWith(java.util.Map params, groovy.lang.Closure closure)


chainWith

@java.lang.Override
public final DataflowReadChannel chainWith(Pool pool, java.util.Map params, groovy.lang.Closure closure)


chainWith

@java.lang.Override
public DataflowReadChannel chainWith(PGroup group, java.util.Map params, groovy.lang.Closure closure)


choice

@java.lang.Override
public void choice(java.util.List outputs, groovy.lang.Closure code)


choice

@java.lang.Override
public void choice(Pool pool, java.util.List outputs, groovy.lang.Closure code)


choice

@java.lang.Override
public void choice(PGroup group, java.util.List outputs, groovy.lang.Closure code)


choice

@java.lang.Override
public void choice(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


choice

@java.lang.Overridepublic void separate(final List> outputs, final Closure> code) {
public void choice(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


choice

@java.lang.Overridepublic void separate(final Pool pool, final List> outputs, final Closure> code) {
public void choice(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


copyDFV

private DataflowVariable copyDFV(java.util.Queue from, java.util.Queue to)


createVariable

protected DataflowVariable createVariable()
Retrieves the value at the head of the buffer. Blocks until a value is available.
throws:
InterruptedException If the current thread is interrupted
Returns:
The value bound to the DFV at the head of the stream


filter

@java.lang.Override
public DataflowReadChannel filter(groovy.lang.Closure closure)


filter

@java.lang.Override
public DataflowReadChannel filter(Pool pool, groovy.lang.Closure closure)


filter

@java.lang.Override
public DataflowReadChannel filter(PGroup group, groovy.lang.Closure closure)


filter

@java.lang.Override
public DataflowReadChannel filter(java.util.Map params, groovy.lang.Closure closure)


filter

@java.lang.Override
public DataflowReadChannel filter(Pool pool, java.util.Map params, groovy.lang.Closure closure)


filter

@java.lang.Override
public DataflowReadChannel filter(PGroup group, java.util.Map params, groovy.lang.Closure closure)


fireOnMessage

private void fireOnMessage(java.lang.Object value)


getEventManager

@java.lang.Override}
public DataflowChannelEventListenerManager getEventManager()


getQueue

final java.util.concurrent.LinkedBlockingQueue getQueue()


getVal

@java.lang.Overridefinal DataflowVariable variable = retrieveOrCreateVariable();
public final java.lang.Object getVal()
Retrieves the value at the head of the buffer. Blocks until a value is available.
throws:
InterruptedException If the current thread is interrupted
Parameters:
timeout - The timeout value
units - Units for the timeout
Returns:
The value bound to the DFV at the head of the stream


getVal

@java.lang.Override*
public final java.lang.Object getVal(long timeout, java.util.concurrent.TimeUnit units)


getValAsync

@java.lang.Override
public final void getValAsync(MessageStream callback)
Asynchronously retrieves the value at the head of the buffer. Sends a message back the the supplied actor / operator with a map holding the supplied index under the 'index' key and the actual value of the variable under the 'result' key once the value has been bound. The actor/operator can perform other activities or release a thread back to the pool by calling react() waiting for the message with the value of the Dataflow Variable.
Parameters:
attachment - An arbitrary value to identify operator channels and so match requests and replies
callback - The actor / operator to notify when a value is bound


getValAsync

@java.lang.Override}
public final void getValAsync(java.lang.Object attachment, MessageStream callback)
Schedule closure to be executed by pooled actor after data became available. It is important to notice that even if the expression is already bound the execution of closure will not happen immediately but will be scheduled
Parameters:
closure - closure to execute when data becomes available. The closure should take at most one argument.


hookWheneverBoundListeners

private DataflowExpression hookWheneverBoundListeners(DataflowExpression expr)
Takes the first unsatisfied value request and binds a value on it. If there are no unsatisfied value requests, a new DFV is stored in the queue.
Returns:
The DFV to bind the value on


into

@java.lang.Override
public void into(DataflowWriteChannel target)


into

@java.lang.Override
public void into(Pool pool, DataflowWriteChannel target)


into

@java.lang.Override
public void into(PGroup group, DataflowWriteChannel target)


into

@java.lang.Overridegroup.operator(parameters, new ChainWithClosure(new CopyChannelsClosure()));
public void into(java.util.Map params, DataflowWriteChannel target)


into

@java.lang.Overrideinto(target);
public void into(Pool pool, java.util.Map params, DataflowWriteChannel target)


into

@java.lang.Overridesplit(Dataflow.retrieveCurrentDFPGroup(), target1, target2);
public void into(PGroup group, java.util.Map params, DataflowWriteChannel target)


isBound

@java.lang.Override/**
public final boolean isBound()
Checks whether there's a DFV waiting in the queue and retrieves it. If not, a new unmatched value request, represented by a new DFV, is added to the requests queue.
Returns:
The DFV to wait for value on


iterator

public final java.util.Iterator iterator()


leftShift

@java.lang.Override});
@java.lang.SuppressWarningsreturn this;
public final DataflowWriteChannel leftShift(DataflowReadChannel ref)


leftShift

@java.lang.OverridefireOnMessage(value);
public final DataflowWriteChannel leftShift(java.lang.Object value)
Adds a DataflowVariable representing the passed in value to the buffer.
Parameters:
value - The value to bind to the head of the stream


length

@java.lang.Override
public final int length()


merge

@java.lang.Override
public DataflowReadChannel merge(DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(Pool pool, DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(PGroup group, DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Overrideinputs.addAll(others);
public DataflowReadChannel merge(java.util.List others, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(Pool pool, java.util.List others, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(PGroup group, java.util.List others, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(Pool pool, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Override
public DataflowReadChannel merge(PGroup group, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)


merge

@java.lang.Overrideinputs.addAll(others);
public DataflowReadChannel merge(java.util.Map params, java.util.List others, groovy.lang.Closure closure)


merge

@java.lang.Overridereturn result;
public DataflowReadChannel merge(Pool pool, java.util.Map params, java.util.List others, groovy.lang.Closure closure)


merge

@java.lang.OverridebinaryChoice(Dataflow.retrieveCurrentDFPGroup(), trueBranch, falseBranch, code);
public DataflowReadChannel merge(PGroup group, java.util.Map params, java.util.List others, groovy.lang.Closure closure)


or

@java.lang.Override
public DataflowReadChannel or(groovy.lang.Closure closure)


or

@java.lang.Override
public void or(DataflowWriteChannel target)


poll

@java.lang.Override* The actor can perform other activities or release a thread back to the pool by calling react() waiting for the message
public final DataflowExpression poll()


retrieveForBind

private DataflowVariable retrieveForBind()


retrieveOrCreateVariable

private DataflowVariable retrieveOrCreateVariable()
Returns the current size of the buffer
Returns:
Number of DFVs in the queue


rightShift

@java.lang.Override}
public final Promise rightShift(groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after the next data becomes available. It is important to notice that even if the expression is already bound the execution of closure will not happen immediately but will be scheduled.
Parameters:
closure - closure to execute when data becomes available. The closure should take at most one argument.


separate

@java.lang.Override
public void separate(java.util.List outputs, groovy.lang.Closure code)


separate

@java.lang.Override
public void separate(Pool pool, java.util.List outputs, groovy.lang.Closure code)


separate

@java.lang.Override
public void separate(PGroup group, java.util.List outputs, groovy.lang.Closure code)


separate

@java.lang.Override
public void separate(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


separate

@java.lang.Override* Check if value has been set already for this expression
public void separate(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


separate

@java.lang.Overridepublic final boolean isBound() {
public void separate(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)


split

@java.lang.Override
public void split(DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(Pool pool, DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(PGroup group, DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(java.util.List targets)


split

@java.lang.Override
public void split(Pool pool, java.util.List targets)


split

@java.lang.Override
public void split(PGroup group, java.util.List targets)


split

@java.lang.Override
public void split(java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(Pool pool, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(PGroup group, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)


split

@java.lang.Override
public void split(java.util.Map params, java.util.List targets)


split

@java.lang.Overridepublic DataflowReadChannel tap(final DataflowWriteChannel target) {
public void split(Pool pool, java.util.Map params, java.util.List targets)


split

@java.lang.Overridepublic DataflowReadChannel tap(final Pool pool, final DataflowWriteChannel target) {
public void split(PGroup group, java.util.Map params, java.util.List targets)


tap

@java.lang.Override}
public DataflowReadChannel tap(DataflowWriteChannel target)


tap

@java.lang.Override}
public DataflowReadChannel tap(Pool pool, DataflowWriteChannel target)


tap

@java.lang.Override}
public DataflowReadChannel tap(PGroup group, DataflowWriteChannel target)


tap

@java.lang.Overrideparameters.put("outputs", asList(result, target));
public DataflowReadChannel tap(java.util.Map params, DataflowWriteChannel target)


tap

@java.lang.Override
public DataflowReadChannel tap(Pool pool, java.util.Map params, DataflowWriteChannel target)


tap

@java.lang.Override
public DataflowReadChannel tap(PGroup group, java.util.Map params, DataflowWriteChannel target)


then

@java.lang.Override*/
public final Promise then(groovy.lang.Closure closure)


then

@java.lang.Override*/
public Promise then(Pool pool, groovy.lang.Closure closure)


then

@java.lang.Override}
public Promise then(PGroup group, groovy.lang.Closure closure)
Send all pieces of data bound in the future to the provided stream when it becomes available. *
Parameters:
closure - closure to execute when data becomes available. The closure should take at most one argument.


toString

@java.lang.Override
public java.lang.String toString()


whenBound

@java.lang.OverridegetValAsync(new DataCallbackWithPool(pool, closure));
public final void whenBound(groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after data becomes available. It is important to notice that even if the expression is already bound the execution of closure will not happen immediately but will be scheduled.
Parameters:
pool - The thread pool to use for task scheduling for asynchronous message delivery
closure - closure to execute when data becomes available. The closure should take at most one argument.


whenBound

@java.lang.Override
public final void whenBound(Pool pool, groovy.lang.Closure closure)
Send the next bound piece of data to the provided stream when it becomes available.
Parameters:
stream - stream where to send result


whenBound

@java.lang.Override/**
public void whenBound(PGroup group, groovy.lang.Closure closure)


whenBound

@java.lang.Overridefinal DataflowVariable result = new DataflowVariable();
public final void whenBound(MessageStream stream)
Schedule closure to be executed after data became available. It is important to notice that even if the expression is already bound the execution of closure will not happen immediately but will be scheduled
Parameters:
closure - closure to execute when data becomes available. The closure should take at most one argument.
Returns:
A promise for the results of the supplied closure. This allows for chaining of then() method calls.


wheneverBound

@java.lang.Override
public final void wheneverBound(groovy.lang.Closure closure)
Send all pieces of data bound in the future to the provided stream when it becomes available.
Parameters:
stream - stream where to send result


wheneverBound

@java.lang.Override
public final void wheneverBound(MessageStream stream)


 

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