/**
  * Non-blocking, not thread-safe
  *
  * @return Next Available remote control. Null if none is available.
  */
 protected RemoteControlProxy findNextAvailableRemoteControl() {
   for (RemoteControlProxy remoteControl : remoteControls) {
     if (remoteControl.canHandleNewSession()) {
       return remoteControl;
     }
   }
   return null;
 }
  /**
   * Not thread safe.
   *
   * @return All available remote controls. Never null.
   */
  public List<RemoteControlProxy> availableRemoteControls() {
    LinkedList<RemoteControlProxy> availableremoteControls;

    availableremoteControls = new LinkedList<RemoteControlProxy>();
    for (RemoteControlProxy remoteControl : remoteControls) {
      if (remoteControl.canHandleNewSession()) {
        availableremoteControls.add(remoteControl);
      }
    }
    return Arrays.asList(
        availableremoteControls.toArray(new RemoteControlProxy[availableremoteControls.size()]));
  }
  /**
   * Not thread safe.
   *
   * @return All reserved remote controls. Never null.
   */
  public List<RemoteControlProxy> reservedRemoteControls() {
    LinkedList<RemoteControlProxy> reservedRemoteControls;

    reservedRemoteControls = new LinkedList<RemoteControlProxy>();
    for (RemoteControlProxy remoteControl : remoteControls) {
      if (remoteControl.concurrentSesssionCount() >= 1) {
        reservedRemoteControls.add(remoteControl);
      }
    }
    return Arrays.asList(
        reservedRemoteControls.toArray(new RemoteControlProxy[reservedRemoteControls.size()]));
  }
  public RemoteControlProxy reserve() {
    final RemoteControlProxy remoteControl;

    try {
      remoteControlListLock.lock();

      if (remoteControls.isEmpty()) {
        return null;
      }

      remoteControl = blockUntilARemoteControlIsAvailable();
      remoteControl.registerNewSession();
      LOGGER.info("Reserved remote control" + remoteControl);
      return remoteControl;
    } finally {
      remoteControlListLock.unlock();
    }
  }
 public void release(RemoteControlProxy remoteControl) {
   try {
     remoteControlListLock.lock();
     remoteControl.unregisterSession();
     LOGGER.info("Released remote control" + remoteControl);
     signalThatARemoteControlHasBeenMadeAvailable();
   } finally {
     remoteControlListLock.unlock();
   }
 }