コード例 #1
0
  /*
   * 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;
  }