/**
   * Waits until either the State attribute of this MBean equals the specified <VAR>state</VAR>
   * parameter, or the specified <VAR>timeout</VAR> has elapsed. The method <CODE>waitState</CODE>
   * returns with a boolean value indicating whether the specified <VAR>state</VAR> parameter equals
   * the value of this MBean's State attribute at the time the method terminates.
   *
   * <p>Two special cases for the <VAR>timeout</VAR> parameter value are:
   *
   * <UL>
   *   <LI>if <VAR>timeout</VAR> is negative then <CODE>waitState</CODE> returns immediately (i.e.
   *       does not wait at all),
   *   <LI>if <VAR>timeout</VAR> equals zero then <CODE>waitState</CODE> waits until the value of
   *       this MBean's State attribute is the same as the <VAR>state</VAR> parameter (i.e. will
   *       wait indefinitely if this condition is never met).
   * </UL>
   *
   * @param state The value of this MBean's State attribute to wait for. <VAR>state</VAR> can be one
   *     of: <CODE>DiscoveryResponder.OFFLINE</CODE>, <CODE>DiscoveryResponder.ONLINE</CODE>, <CODE>
   *     DiscoveryResponder.STARTING</CODE>, <CODE>DiscoveryResponder.STOPPING</CODE>.
   * @param timeout The maximum time to wait for, in milliseconds, if positive. Infinite time out if
   *     0, or no waiting at all if negative.
   * @return <code>true</code> if the value of this MBean's State attribute is the same as the
   *     <VAR>state</VAR> parameter; <code>false</code> otherwise.
   */
  public boolean waitState(int state, long timeout) {
    if (logger.finerOn()) {
      logger.finer(
          "waitState",
          state + "(0on,1off,2st) TO=" + timeout + " ; current state = " + getStateString());
    }
    // ------------
    // Test timeout
    // ------------
    if (timeout < 0) {
      return (this.state == state);
    }

    boolean done = (this.state == state);
    Date currentDate;
    long currentTimeOut = -1;

    // -----------------
    // Date start
    // -----------------
    Date endDate = new Date((new Date()).getTime() + timeout);
    while (!done) {
      // -----------------
      // Find out timeout
      // ----------------
      if (timeout != 0) {
        currentTimeOut = endDate.getTime() - (new Date()).getTime();
        if (currentTimeOut <= 0) {
          done = true;
          break;
        }
      }

      try {
        synchronized (this) {
          if (timeout == 0) {
            if (logger.finerOn()) {
              logger.finer("waitState", "Start waiting infinite, current state = " + this.state);
            }
            done = (this.state == state);
            while (!done) {
              done = (this.state == state);
              try {
                wait(1000);
              } catch (Exception e) {
              }
            }
          } else {
            if (logger.finerOn()) {
              logger.finer(
                  "waitState",
                  "Start waiting " + currentTimeOut + " current state = " + this.state);
            }
            wait(currentTimeOut);
          }
        }
        done = (this.state == state);
      } catch (InterruptedException e) {
        done = (this.state == state);
      }
    }
    if (logger.finerOn()) {
      logger.finer("waitState", "End, TO=" + currentTimeOut);
    }
    return (this.state == state);
  }
 @Test
 public void customSimplifier() throws AttributeNotFoundException {
   Date date = new Date();
   Map result = (Map) converter.extractObject(date, new Stack<String>(), true);
   assertEquals(date.getTime(), result.get("millis"));
 }