/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * Autogenerated by Thrift Compiler (0.13.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.storm.generated;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.13.0)")
public class WorkerTokenInfo implements org.apache.storm.thrift.TBase<WorkerTokenInfo, WorkerTokenInfo._Fields>, java.io.Serializable, Cloneable, Comparable<WorkerTokenInfo> {
  private static final org.apache.storm.thrift.protocol.TStruct STRUCT_DESC = new org.apache.storm.thrift.protocol.TStruct("WorkerTokenInfo");

  private static final org.apache.storm.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("userName", org.apache.storm.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.storm.thrift.protocol.TField TOPOLOGY_ID_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("topologyId", org.apache.storm.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.storm.thrift.protocol.TField SECRET_VERSION_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("secretVersion", org.apache.storm.thrift.protocol.TType.I64, (short)3);
  private static final org.apache.storm.thrift.protocol.TField EXPIRATION_TIME_MILLIS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("expirationTimeMillis", org.apache.storm.thrift.protocol.TType.I64, (short)4);

  private static final org.apache.storm.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new WorkerTokenInfoStandardSchemeFactory();
  private static final org.apache.storm.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new WorkerTokenInfoTupleSchemeFactory();

  private @org.apache.storm.thrift.annotation.Nullable java.lang.String userName; // required
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String topologyId; // required
  private long secretVersion; // required
  private long expirationTimeMillis; // required

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.storm.thrift.TFieldIdEnum {
    USER_NAME((short)1, "userName"),
    TOPOLOGY_ID((short)2, "topologyId"),
    SECRET_VERSION((short)3, "secretVersion"),
    EXPIRATION_TIME_MILLIS((short)4, "expirationTimeMillis");

    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();

    static {
      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
        byName.put(field.getFieldName(), field);
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    @org.apache.storm.thrift.annotation.Nullable
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // USER_NAME
          return USER_NAME;
        case 2: // TOPOLOGY_ID
          return TOPOLOGY_ID;
        case 3: // SECRET_VERSION
          return SECRET_VERSION;
        case 4: // EXPIRATION_TIME_MILLIS
          return EXPIRATION_TIME_MILLIS;
        default:
          return null;
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, throwing an exception
     * if it is not found.
     */
    public static _Fields findByThriftIdOrThrow(int fieldId) {
      _Fields fields = findByThriftId(fieldId);
      if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    @org.apache.storm.thrift.annotation.Nullable
    public static _Fields findByName(java.lang.String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final java.lang.String _fieldName;

    _Fields(short thriftId, java.lang.String fieldName) {
      _thriftId = thriftId;
      _fieldName = fieldName;
    }

    public short getThriftFieldId() {
      return _thriftId;
    }

    public java.lang.String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __SECRETVERSION_ISSET_ID = 0;
  private static final int __EXPIRATIONTIMEMILLIS_ISSET_ID = 1;
  private byte __isset_bitfield = 0;
  public static final java.util.Map<_Fields, org.apache.storm.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    java.util.Map<_Fields, org.apache.storm.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.storm.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.USER_NAME, new org.apache.storm.thrift.meta_data.FieldMetaData("userName", org.apache.storm.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TOPOLOGY_ID, new org.apache.storm.thrift.meta_data.FieldMetaData("topologyId", org.apache.storm.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.SECRET_VERSION, new org.apache.storm.thrift.meta_data.FieldMetaData("secretVersion", org.apache.storm.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.EXPIRATION_TIME_MILLIS, new org.apache.storm.thrift.meta_data.FieldMetaData("expirationTimeMillis", org.apache.storm.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I64)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.storm.thrift.meta_data.FieldMetaData.addStructMetaDataMap(WorkerTokenInfo.class, metaDataMap);
  }

  public WorkerTokenInfo() {
  }

  public WorkerTokenInfo(
    java.lang.String userName,
    java.lang.String topologyId,
    long secretVersion,
    long expirationTimeMillis)
  {
    this();
    this.userName = userName;
    this.topologyId = topologyId;
    this.secretVersion = secretVersion;
    set_secretVersion_isSet(true);
    this.expirationTimeMillis = expirationTimeMillis;
    set_expirationTimeMillis_isSet(true);
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public WorkerTokenInfo(WorkerTokenInfo other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.is_set_userName()) {
      this.userName = other.userName;
    }
    if (other.is_set_topologyId()) {
      this.topologyId = other.topologyId;
    }
    this.secretVersion = other.secretVersion;
    this.expirationTimeMillis = other.expirationTimeMillis;
  }

  public WorkerTokenInfo deepCopy() {
    return new WorkerTokenInfo(this);
  }

  @Override
  public void clear() {
    this.userName = null;
    this.topologyId = null;
    set_secretVersion_isSet(false);
    this.secretVersion = 0;
    set_expirationTimeMillis_isSet(false);
    this.expirationTimeMillis = 0;
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.lang.String get_userName() {
    return this.userName;
  }

  public void set_userName(@org.apache.storm.thrift.annotation.Nullable java.lang.String userName) {
    this.userName = userName;
  }

  public void unset_userName() {
    this.userName = null;
  }

  /** Returns true if field userName is set (has been assigned a value) and false otherwise */
  public boolean is_set_userName() {
    return this.userName != null;
  }

  public void set_userName_isSet(boolean value) {
    if (!value) {
      this.userName = null;
    }
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.lang.String get_topologyId() {
    return this.topologyId;
  }

  public void set_topologyId(@org.apache.storm.thrift.annotation.Nullable java.lang.String topologyId) {
    this.topologyId = topologyId;
  }

  public void unset_topologyId() {
    this.topologyId = null;
  }

  /** Returns true if field topologyId is set (has been assigned a value) and false otherwise */
  public boolean is_set_topologyId() {
    return this.topologyId != null;
  }

  public void set_topologyId_isSet(boolean value) {
    if (!value) {
      this.topologyId = null;
    }
  }

  public long get_secretVersion() {
    return this.secretVersion;
  }

  public void set_secretVersion(long secretVersion) {
    this.secretVersion = secretVersion;
    set_secretVersion_isSet(true);
  }

  public void unset_secretVersion() {
    __isset_bitfield = org.apache.storm.thrift.EncodingUtils.clearBit(__isset_bitfield, __SECRETVERSION_ISSET_ID);
  }

  /** Returns true if field secretVersion is set (has been assigned a value) and false otherwise */
  public boolean is_set_secretVersion() {
    return org.apache.storm.thrift.EncodingUtils.testBit(__isset_bitfield, __SECRETVERSION_ISSET_ID);
  }

  public void set_secretVersion_isSet(boolean value) {
    __isset_bitfield = org.apache.storm.thrift.EncodingUtils.setBit(__isset_bitfield, __SECRETVERSION_ISSET_ID, value);
  }

  public long get_expirationTimeMillis() {
    return this.expirationTimeMillis;
  }

  public void set_expirationTimeMillis(long expirationTimeMillis) {
    this.expirationTimeMillis = expirationTimeMillis;
    set_expirationTimeMillis_isSet(true);
  }

  public void unset_expirationTimeMillis() {
    __isset_bitfield = org.apache.storm.thrift.EncodingUtils.clearBit(__isset_bitfield, __EXPIRATIONTIMEMILLIS_ISSET_ID);
  }

  /** Returns true if field expirationTimeMillis is set (has been assigned a value) and false otherwise */
  public boolean is_set_expirationTimeMillis() {
    return org.apache.storm.thrift.EncodingUtils.testBit(__isset_bitfield, __EXPIRATIONTIMEMILLIS_ISSET_ID);
  }

  public void set_expirationTimeMillis_isSet(boolean value) {
    __isset_bitfield = org.apache.storm.thrift.EncodingUtils.setBit(__isset_bitfield, __EXPIRATIONTIMEMILLIS_ISSET_ID, value);
  }

  public void setFieldValue(_Fields field, @org.apache.storm.thrift.annotation.Nullable java.lang.Object value) {
    switch (field) {
    case USER_NAME:
      if (value == null) {
        unset_userName();
      } else {
        set_userName((java.lang.String)value);
      }
      break;

    case TOPOLOGY_ID:
      if (value == null) {
        unset_topologyId();
      } else {
        set_topologyId((java.lang.String)value);
      }
      break;

    case SECRET_VERSION:
      if (value == null) {
        unset_secretVersion();
      } else {
        set_secretVersion((java.lang.Long)value);
      }
      break;

    case EXPIRATION_TIME_MILLIS:
      if (value == null) {
        unset_expirationTimeMillis();
      } else {
        set_expirationTimeMillis((java.lang.Long)value);
      }
      break;

    }
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.lang.Object getFieldValue(_Fields field) {
    switch (field) {
    case USER_NAME:
      return get_userName();

    case TOPOLOGY_ID:
      return get_topologyId();

    case SECRET_VERSION:
      return get_secretVersion();

    case EXPIRATION_TIME_MILLIS:
      return get_expirationTimeMillis();

    }
    throw new java.lang.IllegalStateException();
  }

  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
  public boolean isSet(_Fields field) {
    if (field == null) {
      throw new java.lang.IllegalArgumentException();
    }

    switch (field) {
    case USER_NAME:
      return is_set_userName();
    case TOPOLOGY_ID:
      return is_set_topologyId();
    case SECRET_VERSION:
      return is_set_secretVersion();
    case EXPIRATION_TIME_MILLIS:
      return is_set_expirationTimeMillis();
    }
    throw new java.lang.IllegalStateException();
  }

  @Override
  public boolean equals(java.lang.Object that) {
    if (that == null)
      return false;
    if (that instanceof WorkerTokenInfo)
      return this.equals((WorkerTokenInfo)that);
    return false;
  }

  public boolean equals(WorkerTokenInfo that) {
    if (that == null)
      return false;
    if (this == that)
      return true;

    boolean this_present_userName = true && this.is_set_userName();
    boolean that_present_userName = true && that.is_set_userName();
    if (this_present_userName || that_present_userName) {
      if (!(this_present_userName && that_present_userName))
        return false;
      if (!this.userName.equals(that.userName))
        return false;
    }

    boolean this_present_topologyId = true && this.is_set_topologyId();
    boolean that_present_topologyId = true && that.is_set_topologyId();
    if (this_present_topologyId || that_present_topologyId) {
      if (!(this_present_topologyId && that_present_topologyId))
        return false;
      if (!this.topologyId.equals(that.topologyId))
        return false;
    }

    boolean this_present_secretVersion = true;
    boolean that_present_secretVersion = true;
    if (this_present_secretVersion || that_present_secretVersion) {
      if (!(this_present_secretVersion && that_present_secretVersion))
        return false;
      if (this.secretVersion != that.secretVersion)
        return false;
    }

    boolean this_present_expirationTimeMillis = true;
    boolean that_present_expirationTimeMillis = true;
    if (this_present_expirationTimeMillis || that_present_expirationTimeMillis) {
      if (!(this_present_expirationTimeMillis && that_present_expirationTimeMillis))
        return false;
      if (this.expirationTimeMillis != that.expirationTimeMillis)
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int hashCode = 1;

    hashCode = hashCode * 8191 + ((is_set_userName()) ? 131071 : 524287);
    if (is_set_userName())
      hashCode = hashCode * 8191 + userName.hashCode();

    hashCode = hashCode * 8191 + ((is_set_topologyId()) ? 131071 : 524287);
    if (is_set_topologyId())
      hashCode = hashCode * 8191 + topologyId.hashCode();

    hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(secretVersion);

    hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(expirationTimeMillis);

    return hashCode;
  }

  @Override
  public int compareTo(WorkerTokenInfo other) {
    if (!getClass().equals(other.getClass())) {
      return getClass().getName().compareTo(other.getClass().getName());
    }

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.valueOf(is_set_userName()).compareTo(other.is_set_userName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_userName()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.userName, other.userName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_topologyId()).compareTo(other.is_set_topologyId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_topologyId()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.topologyId, other.topologyId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_secretVersion()).compareTo(other.is_set_secretVersion());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_secretVersion()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.secretVersion, other.secretVersion);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_expirationTimeMillis()).compareTo(other.is_set_expirationTimeMillis());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_expirationTimeMillis()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.expirationTimeMillis, other.expirationTimeMillis);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  @org.apache.storm.thrift.annotation.Nullable
  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

  public void read(org.apache.storm.thrift.protocol.TProtocol iprot) throws org.apache.storm.thrift.TException {
    scheme(iprot).read(iprot, this);
  }

  public void write(org.apache.storm.thrift.protocol.TProtocol oprot) throws org.apache.storm.thrift.TException {
    scheme(oprot).write(oprot, this);
  }

  @Override
  public java.lang.String toString() {
    java.lang.StringBuilder sb = new java.lang.StringBuilder("WorkerTokenInfo(");
    boolean first = true;

    sb.append("userName:");
    if (this.userName == null) {
      sb.append("null");
    } else {
      sb.append(this.userName);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("topologyId:");
    if (this.topologyId == null) {
      sb.append("null");
    } else {
      sb.append(this.topologyId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("secretVersion:");
    sb.append(this.secretVersion);
    first = false;
    if (!first) sb.append(", ");
    sb.append("expirationTimeMillis:");
    sb.append(this.expirationTimeMillis);
    first = false;
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.storm.thrift.TException {
    // check for required fields
    if (!is_set_userName()) {
      throw new org.apache.storm.thrift.protocol.TProtocolException("Required field 'userName' is unset! Struct:" + toString());
    }

    if (!is_set_topologyId()) {
      throw new org.apache.storm.thrift.protocol.TProtocolException("Required field 'topologyId' is unset! Struct:" + toString());
    }

    if (!is_set_secretVersion()) {
      throw new org.apache.storm.thrift.protocol.TProtocolException("Required field 'secretVersion' is unset! Struct:" + toString());
    }

    if (!is_set_expirationTimeMillis()) {
      throw new org.apache.storm.thrift.protocol.TProtocolException("Required field 'expirationTimeMillis' is unset! Struct:" + toString());
    }

    // check for sub-struct validity
  }

  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
    try {
      write(new org.apache.storm.thrift.protocol.TCompactProtocol(new org.apache.storm.thrift.transport.TIOStreamTransport(out)));
    } catch (org.apache.storm.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_bitfield = 0;
      read(new org.apache.storm.thrift.protocol.TCompactProtocol(new org.apache.storm.thrift.transport.TIOStreamTransport(in)));
    } catch (org.apache.storm.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private static class WorkerTokenInfoStandardSchemeFactory implements org.apache.storm.thrift.scheme.SchemeFactory {
    public WorkerTokenInfoStandardScheme getScheme() {
      return new WorkerTokenInfoStandardScheme();
    }
  }

  private static class WorkerTokenInfoStandardScheme extends org.apache.storm.thrift.scheme.StandardScheme<WorkerTokenInfo> {

    public void read(org.apache.storm.thrift.protocol.TProtocol iprot, WorkerTokenInfo struct) throws org.apache.storm.thrift.TException {
      org.apache.storm.thrift.protocol.TField schemeField;
      iprot.readStructBegin();
      while (true)
      {
        schemeField = iprot.readFieldBegin();
        if (schemeField.type == org.apache.storm.thrift.protocol.TType.STOP) { 
          break;
        }
        switch (schemeField.id) {
          case 1: // USER_NAME
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.userName = iprot.readString();
              struct.set_userName_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // TOPOLOGY_ID
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.topologyId = iprot.readString();
              struct.set_topologyId_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // SECRET_VERSION
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I64) {
              struct.secretVersion = iprot.readI64();
              struct.set_secretVersion_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // EXPIRATION_TIME_MILLIS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I64) {
              struct.expirationTimeMillis = iprot.readI64();
              struct.set_expirationTimeMillis_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

    public void write(org.apache.storm.thrift.protocol.TProtocol oprot, WorkerTokenInfo struct) throws org.apache.storm.thrift.TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.userName != null) {
        oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
        oprot.writeString(struct.userName);
        oprot.writeFieldEnd();
      }
      if (struct.topologyId != null) {
        oprot.writeFieldBegin(TOPOLOGY_ID_FIELD_DESC);
        oprot.writeString(struct.topologyId);
        oprot.writeFieldEnd();
      }
      oprot.writeFieldBegin(SECRET_VERSION_FIELD_DESC);
      oprot.writeI64(struct.secretVersion);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(EXPIRATION_TIME_MILLIS_FIELD_DESC);
      oprot.writeI64(struct.expirationTimeMillis);
      oprot.writeFieldEnd();
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class WorkerTokenInfoTupleSchemeFactory implements org.apache.storm.thrift.scheme.SchemeFactory {
    public WorkerTokenInfoTupleScheme getScheme() {
      return new WorkerTokenInfoTupleScheme();
    }
  }

  private static class WorkerTokenInfoTupleScheme extends org.apache.storm.thrift.scheme.TupleScheme<WorkerTokenInfo> {

    @Override
    public void write(org.apache.storm.thrift.protocol.TProtocol prot, WorkerTokenInfo struct) throws org.apache.storm.thrift.TException {
      org.apache.storm.thrift.protocol.TTupleProtocol oprot = (org.apache.storm.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.userName);
      oprot.writeString(struct.topologyId);
      oprot.writeI64(struct.secretVersion);
      oprot.writeI64(struct.expirationTimeMillis);
    }

    @Override
    public void read(org.apache.storm.thrift.protocol.TProtocol prot, WorkerTokenInfo struct) throws org.apache.storm.thrift.TException {
      org.apache.storm.thrift.protocol.TTupleProtocol iprot = (org.apache.storm.thrift.protocol.TTupleProtocol) prot;
      struct.userName = iprot.readString();
      struct.set_userName_isSet(true);
      struct.topologyId = iprot.readString();
      struct.set_topologyId_isSet(true);
      struct.secretVersion = iprot.readI64();
      struct.set_secretVersion_isSet(true);
      struct.expirationTimeMillis = iprot.readI64();
      struct.set_expirationTimeMillis_isSet(true);
    }
  }

  private static <S extends org.apache.storm.thrift.scheme.IScheme> S scheme(org.apache.storm.thrift.protocol.TProtocol proto) {
    return (org.apache.storm.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
  }
}

