/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.neomedia;
import javax.media.*;
import net.java.sip.communicator.util.*;
/**
* A utility class that provides utility functions when working with processors.
*
* @author Emil Ivov
* @author Ken Larson
* @author Lubomir Marinov
*/
public class ProcessorUtility
implements ControllerListener
{
/**
* The Logger used by the ProcessorUtility class and its
* instances for logging output.
*/
private static final Logger logger
= Logger.getLogger(ProcessorUtility.class);
/**
* The Object used for syncing when waiting for a processor to
* enter a specific state.
*/
private final Object stateLock = new Object();
/**
* The indicator which determines whether the waiting of this instance on a
* processor for it to enter a specific state has failed.
*/
private boolean failed = false;
/**
* Initializes a new ProcessorUtility instance.
*/
public ProcessorUtility()
{
}
/**
* Gets the Object to use for syncing when waiting for a processor
* to enter a specific state.
*
* @return the Object to use for syncing when waiting for a
* processor to enter a specific state
*/
private Object getStateLock()
{
return stateLock;
}
/**
* Specifies whether the wait operation has failed or completed with
* success.
*
* @param failed true if waiting has failed; false,
* otherwise
*/
private void setFailed(boolean failed)
{
this.failed = failed;
}
/**
* This method is called when an event is generated by a
* Controller
that this listener is registered with. We use
* the event to notify all waiting on our lock and record success or
* failure.
*
* @param ce The event generated.
*/
public void controllerUpdate(ControllerEvent ce)
{
// If there was an error during configure or
// realize, the processor will be closed
if (ce instanceof ControllerClosedEvent)
{
if (ce instanceof ControllerErrorEvent)
logger.warn("ControllerErrorEvent: " + ce);
else
if (logger.isDebugEnabled())
logger.debug("ControllerClosedEvent: " + ce);
setFailed(true);
// All controller events, send a notification
// to the waiting thread in waitForState method.
}
Object stateLock = getStateLock();
synchronized (stateLock)
{
stateLock.notifyAll();
}
}
/**
* Waits until processor enters state and returns a boolean
* indicating success or failure of the operation.
*
* @param processor Processor
* @param state one of the Processor.XXXed state vars
* @return true if the state has been reached; false,
* otherwise
*/
public synchronized boolean waitForState(Processor processor, int state)
{
processor.addControllerListener(this);
setFailed(false);
// Call the required method on the processor
if (state == Processor.Configured)
processor.configure();
else if (state == Processor.Realized)
processor.realize();
// Wait until we get an event that confirms the
// success of the method, or a failure event.
// See StateListener inner class
while ((processor.getState() < state) && !failed)
{
Object stateLock = getStateLock();
synchronized (stateLock)
{
try
{
stateLock.wait();
}
catch (InterruptedException ie)
{
logger
.warn(
"Failed while waiting on Processor "
+ processor
+ " for state "
+ state,
ie);
processor.removeControllerListener(this);
return false;
}
}
}
processor.removeControllerListener(this);
return !failed;
}
}