code: @Override
      public void waitForData(long timeout, TimeUnit timeUnit) throws CouldNotPerformException, InterruptedException {
          try {
              if (isDataAvailable()) {
                  return;
              }
              long startTime = System.currentTimeMillis();
              getDataFuture().get(timeout, timeUnit);
              long partialTimeout = timeUnit.toMillis(timeout) - (System.currentTimeMillis() - startTime);
              if (partialTimeout <= 0) {
                  throw new java.util.concurrent.TimeoutException("Data timeout is reached!");
              }
              dataObservable.waitForValue(partialTimeout, TimeUnit.MILLISECONDS);
          } catch (java.util.concurrent.TimeoutException | CouldNotPerformException | ExecutionException | CancellationException ex) {
              if (shutdownInitiated) {
                  throw new InterruptedException("Interrupt request because system shutdown was initiated!");
              }
              throw new NotAvailableException("Data is not yet available!", ex);
          }
      }
docs: {@inheritDoc}
  
  @param timeout  {@inheritDoc}
  @param timeUnit {@inheritDoc}
  
  @throws CouldNotPerformException       {@inheritDoc}
  @throws java.lang.InterruptedException {@inheritDoc}