public void handleFrame(StompFrame request) {
    StompFrame reply = null;

    if (stompListener != null) {
      stompListener.requestAccepted(request);
    }

    System.out.println("Frame::" + request);

    String cmd = request.getCommand();
    try {
      if (isDestroyed()) {
        throw BUNDLE.connectionDestroyed().setHandler(frameHandler);
      }
      if (!initialized) {
        if (!(Stomp.Commands.CONNECT.equals(cmd) || Stomp.Commands.STOMP.equals(cmd))) {
          throw BUNDLE.connectionNotEstablished().setHandler(frameHandler);
        }
        // decide version
        negotiateVersion(request);
      }

      reply = frameHandler.handleFrame(request);
    } catch (ActiveMQStompException e) {
      reply = e.getFrame();
    }

    if (reply != null) {
      sendFrame(reply);
    }

    if (Stomp.Commands.DISCONNECT.equals(cmd)) {
      this.disconnect(false);
    }
  }
  // reject if the host doesn't match
  public void setHost(String host) throws ActiveMQStompException {
    if (host == null) {
      ActiveMQStompException error = BUNDLE.nullHostHeader().setHandler(frameHandler);
      error.setBody(BUNDLE.hostCannotBeNull());
      throw error;
    }

    String localHost = manager.getVirtualHostName();
    if (!host.equals(localHost)) {
      ActiveMQStompException error = BUNDLE.hostNotMatch().setHandler(frameHandler);
      error.setBody(BUNDLE.hostNotMatchDetails(host));
      throw error;
    }
  }
 public StompFrame decode(ActiveMQBuffer buffer) throws ActiveMQStompException {
   StompFrame frame = null;
   try {
     frame = frameHandler.decode(buffer);
   } catch (ActiveMQStompException e) {
     switch (e.getCode()) {
       case ActiveMQStompException.INVALID_EOL_V10:
         if (version != null) throw e;
         frameHandler = new StompFrameHandlerV12(this);
         buffer.resetReaderIndex();
         frame = decode(buffer);
         break;
       case ActiveMQStompException.INVALID_COMMAND:
         frameHandler.onError(e);
         break;
       default:
         throw e;
     }
   }
   return frame;
 }
  /*
   * accept-version value takes form of "v1,v2,v3..."
   * we need to return the highest supported version
   */
  public void negotiateVersion(StompFrame frame) throws ActiveMQStompException {
    String acceptVersion = frame.getHeader(Stomp.Headers.ACCEPT_VERSION);

    if (acceptVersion == null) {
      this.version = StompVersions.V1_0;
    } else {
      StringTokenizer tokenizer = new StringTokenizer(acceptVersion, ",");
      Set<String> requestVersions = new HashSet<String>(tokenizer.countTokens());
      while (tokenizer.hasMoreTokens()) {
        requestVersions.add(tokenizer.nextToken());
      }

      if (requestVersions.contains(StompVersions.V1_2.toString())) {
        this.version = StompVersions.V1_2;
      } else if (requestVersions.contains(StompVersions.V1_1.toString())) {
        this.version = StompVersions.V1_1;
      } else if (requestVersions.contains(StompVersions.V1_0.toString())) {
        this.version = StompVersions.V1_0;
      } else {
        // not a supported version!
        ActiveMQStompException error =
            BUNDLE.versionNotSupported(acceptVersion).setHandler(frameHandler);
        error.addHeader(Stomp.Headers.Error.VERSION, manager.getSupportedVersionsAsErrorVersion());
        error.addHeader(Stomp.Headers.CONTENT_TYPE, "text/plain");
        error.setBody("Supported protocol versions are " + manager.getSupportedVersionsAsString());
        error.setDisconnect(true);
        throw error;
      }
    }

    if (this.version != (StompVersions.V1_0)) {
      VersionedStompFrameHandler newHandler =
          VersionedStompFrameHandler.getHandler(this, this.version);
      newHandler.initDecoder(this.frameHandler);
      this.frameHandler = newHandler;
    }
    this.initialized = true;
  }