/**
 * 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.12.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.12.0)")
public class TopologyPageInfo implements org.apache.storm.thrift.TBase<TopologyPageInfo, TopologyPageInfo._Fields>, java.io.Serializable, Cloneable, Comparable<TopologyPageInfo> {
  private static final org.apache.storm.thrift.protocol.TStruct STRUCT_DESC = new org.apache.storm.thrift.protocol.TStruct("TopologyPageInfo");

  private static final org.apache.storm.thrift.protocol.TField ID_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("id", org.apache.storm.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.storm.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("name", org.apache.storm.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.storm.thrift.protocol.TField UPTIME_SECS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("uptime_secs", org.apache.storm.thrift.protocol.TType.I32, (short)3);
  private static final org.apache.storm.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("status", org.apache.storm.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.storm.thrift.protocol.TField NUM_TASKS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("num_tasks", org.apache.storm.thrift.protocol.TType.I32, (short)5);
  private static final org.apache.storm.thrift.protocol.TField NUM_WORKERS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("num_workers", org.apache.storm.thrift.protocol.TType.I32, (short)6);
  private static final org.apache.storm.thrift.protocol.TField NUM_EXECUTORS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("num_executors", org.apache.storm.thrift.protocol.TType.I32, (short)7);
  private static final org.apache.storm.thrift.protocol.TField TOPOLOGY_CONF_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("topology_conf", org.apache.storm.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.storm.thrift.protocol.TField ID_TO_SPOUT_AGG_STATS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("id_to_spout_agg_stats", org.apache.storm.thrift.protocol.TType.MAP, (short)9);
  private static final org.apache.storm.thrift.protocol.TField ID_TO_BOLT_AGG_STATS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("id_to_bolt_agg_stats", org.apache.storm.thrift.protocol.TType.MAP, (short)10);
  private static final org.apache.storm.thrift.protocol.TField SCHED_STATUS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("sched_status", org.apache.storm.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.storm.thrift.protocol.TField TOPOLOGY_STATS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("topology_stats", org.apache.storm.thrift.protocol.TType.STRUCT, (short)12);
  private static final org.apache.storm.thrift.protocol.TField OWNER_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("owner", org.apache.storm.thrift.protocol.TType.STRING, (short)13);
  private static final org.apache.storm.thrift.protocol.TField DEBUG_OPTIONS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("debug_options", org.apache.storm.thrift.protocol.TType.STRUCT, (short)14);
  private static final org.apache.storm.thrift.protocol.TField REPLICATION_COUNT_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("replication_count", org.apache.storm.thrift.protocol.TType.I32, (short)15);
  private static final org.apache.storm.thrift.protocol.TField WORKERS_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("workers", org.apache.storm.thrift.protocol.TType.LIST, (short)16);
  private static final org.apache.storm.thrift.protocol.TField STORM_VERSION_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("storm_version", org.apache.storm.thrift.protocol.TType.STRING, (short)17);
  private static final org.apache.storm.thrift.protocol.TField TOPOLOGY_VERSION_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("topology_version", org.apache.storm.thrift.protocol.TType.STRING, (short)18);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_MEMONHEAP_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_memonheap", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)521);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_MEMOFFHEAP_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_memoffheap", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)522);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_CPU_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_cpu", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)523);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_MEMONHEAP_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_memonheap", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)524);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_MEMOFFHEAP_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_memoffheap", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)525);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_CPU_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_cpu", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)526);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_REGULAR_ON_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_regular_on_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)527);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_SHARED_ON_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_shared_on_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)528);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_REGULAR_OFF_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_regular_off_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)529);
  private static final org.apache.storm.thrift.protocol.TField REQUESTED_SHARED_OFF_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("requested_shared_off_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)530);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_REGULAR_ON_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_regular_on_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)531);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_SHARED_ON_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_shared_on_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)532);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_REGULAR_OFF_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_regular_off_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)533);
  private static final org.apache.storm.thrift.protocol.TField ASSIGNED_SHARED_OFF_HEAP_MEMORY_FIELD_DESC = new org.apache.storm.thrift.protocol.TField("assigned_shared_off_heap_memory", org.apache.storm.thrift.protocol.TType.DOUBLE, (short)534);

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

  private @org.apache.storm.thrift.annotation.Nullable java.lang.String id; // required
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String name; // optional
  private int uptime_secs; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String status; // optional
  private int num_tasks; // optional
  private int num_workers; // optional
  private int num_executors; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String topology_conf; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.util.Map<java.lang.String,ComponentAggregateStats> id_to_spout_agg_stats; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.util.Map<java.lang.String,ComponentAggregateStats> id_to_bolt_agg_stats; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String sched_status; // optional
  private @org.apache.storm.thrift.annotation.Nullable TopologyStats topology_stats; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String owner; // optional
  private @org.apache.storm.thrift.annotation.Nullable DebugOptions debug_options; // optional
  private int replication_count; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.util.List<WorkerSummary> workers; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String storm_version; // optional
  private @org.apache.storm.thrift.annotation.Nullable java.lang.String topology_version; // optional
  private double requested_memonheap; // optional
  private double requested_memoffheap; // optional
  private double requested_cpu; // optional
  private double assigned_memonheap; // optional
  private double assigned_memoffheap; // optional
  private double assigned_cpu; // optional
  private double requested_regular_on_heap_memory; // optional
  private double requested_shared_on_heap_memory; // optional
  private double requested_regular_off_heap_memory; // optional
  private double requested_shared_off_heap_memory; // optional
  private double assigned_regular_on_heap_memory; // optional
  private double assigned_shared_on_heap_memory; // optional
  private double assigned_regular_off_heap_memory; // optional
  private double assigned_shared_off_heap_memory; // optional

  /** 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 {
    ID((short)1, "id"),
    NAME((short)2, "name"),
    UPTIME_SECS((short)3, "uptime_secs"),
    STATUS((short)4, "status"),
    NUM_TASKS((short)5, "num_tasks"),
    NUM_WORKERS((short)6, "num_workers"),
    NUM_EXECUTORS((short)7, "num_executors"),
    TOPOLOGY_CONF((short)8, "topology_conf"),
    ID_TO_SPOUT_AGG_STATS((short)9, "id_to_spout_agg_stats"),
    ID_TO_BOLT_AGG_STATS((short)10, "id_to_bolt_agg_stats"),
    SCHED_STATUS((short)11, "sched_status"),
    TOPOLOGY_STATS((short)12, "topology_stats"),
    OWNER((short)13, "owner"),
    DEBUG_OPTIONS((short)14, "debug_options"),
    REPLICATION_COUNT((short)15, "replication_count"),
    WORKERS((short)16, "workers"),
    STORM_VERSION((short)17, "storm_version"),
    TOPOLOGY_VERSION((short)18, "topology_version"),
    REQUESTED_MEMONHEAP((short)521, "requested_memonheap"),
    REQUESTED_MEMOFFHEAP((short)522, "requested_memoffheap"),
    REQUESTED_CPU((short)523, "requested_cpu"),
    ASSIGNED_MEMONHEAP((short)524, "assigned_memonheap"),
    ASSIGNED_MEMOFFHEAP((short)525, "assigned_memoffheap"),
    ASSIGNED_CPU((short)526, "assigned_cpu"),
    REQUESTED_REGULAR_ON_HEAP_MEMORY((short)527, "requested_regular_on_heap_memory"),
    REQUESTED_SHARED_ON_HEAP_MEMORY((short)528, "requested_shared_on_heap_memory"),
    REQUESTED_REGULAR_OFF_HEAP_MEMORY((short)529, "requested_regular_off_heap_memory"),
    REQUESTED_SHARED_OFF_HEAP_MEMORY((short)530, "requested_shared_off_heap_memory"),
    ASSIGNED_REGULAR_ON_HEAP_MEMORY((short)531, "assigned_regular_on_heap_memory"),
    ASSIGNED_SHARED_ON_HEAP_MEMORY((short)532, "assigned_shared_on_heap_memory"),
    ASSIGNED_REGULAR_OFF_HEAP_MEMORY((short)533, "assigned_regular_off_heap_memory"),
    ASSIGNED_SHARED_OFF_HEAP_MEMORY((short)534, "assigned_shared_off_heap_memory");

    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: // ID
          return ID;
        case 2: // NAME
          return NAME;
        case 3: // UPTIME_SECS
          return UPTIME_SECS;
        case 4: // STATUS
          return STATUS;
        case 5: // NUM_TASKS
          return NUM_TASKS;
        case 6: // NUM_WORKERS
          return NUM_WORKERS;
        case 7: // NUM_EXECUTORS
          return NUM_EXECUTORS;
        case 8: // TOPOLOGY_CONF
          return TOPOLOGY_CONF;
        case 9: // ID_TO_SPOUT_AGG_STATS
          return ID_TO_SPOUT_AGG_STATS;
        case 10: // ID_TO_BOLT_AGG_STATS
          return ID_TO_BOLT_AGG_STATS;
        case 11: // SCHED_STATUS
          return SCHED_STATUS;
        case 12: // TOPOLOGY_STATS
          return TOPOLOGY_STATS;
        case 13: // OWNER
          return OWNER;
        case 14: // DEBUG_OPTIONS
          return DEBUG_OPTIONS;
        case 15: // REPLICATION_COUNT
          return REPLICATION_COUNT;
        case 16: // WORKERS
          return WORKERS;
        case 17: // STORM_VERSION
          return STORM_VERSION;
        case 18: // TOPOLOGY_VERSION
          return TOPOLOGY_VERSION;
        case 521: // REQUESTED_MEMONHEAP
          return REQUESTED_MEMONHEAP;
        case 522: // REQUESTED_MEMOFFHEAP
          return REQUESTED_MEMOFFHEAP;
        case 523: // REQUESTED_CPU
          return REQUESTED_CPU;
        case 524: // ASSIGNED_MEMONHEAP
          return ASSIGNED_MEMONHEAP;
        case 525: // ASSIGNED_MEMOFFHEAP
          return ASSIGNED_MEMOFFHEAP;
        case 526: // ASSIGNED_CPU
          return ASSIGNED_CPU;
        case 527: // REQUESTED_REGULAR_ON_HEAP_MEMORY
          return REQUESTED_REGULAR_ON_HEAP_MEMORY;
        case 528: // REQUESTED_SHARED_ON_HEAP_MEMORY
          return REQUESTED_SHARED_ON_HEAP_MEMORY;
        case 529: // REQUESTED_REGULAR_OFF_HEAP_MEMORY
          return REQUESTED_REGULAR_OFF_HEAP_MEMORY;
        case 530: // REQUESTED_SHARED_OFF_HEAP_MEMORY
          return REQUESTED_SHARED_OFF_HEAP_MEMORY;
        case 531: // ASSIGNED_REGULAR_ON_HEAP_MEMORY
          return ASSIGNED_REGULAR_ON_HEAP_MEMORY;
        case 532: // ASSIGNED_SHARED_ON_HEAP_MEMORY
          return ASSIGNED_SHARED_ON_HEAP_MEMORY;
        case 533: // ASSIGNED_REGULAR_OFF_HEAP_MEMORY
          return ASSIGNED_REGULAR_OFF_HEAP_MEMORY;
        case 534: // ASSIGNED_SHARED_OFF_HEAP_MEMORY
          return ASSIGNED_SHARED_OFF_HEAP_MEMORY;
        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 __UPTIME_SECS_ISSET_ID = 0;
  private static final int __NUM_TASKS_ISSET_ID = 1;
  private static final int __NUM_WORKERS_ISSET_ID = 2;
  private static final int __NUM_EXECUTORS_ISSET_ID = 3;
  private static final int __REPLICATION_COUNT_ISSET_ID = 4;
  private static final int __REQUESTED_MEMONHEAP_ISSET_ID = 5;
  private static final int __REQUESTED_MEMOFFHEAP_ISSET_ID = 6;
  private static final int __REQUESTED_CPU_ISSET_ID = 7;
  private static final int __ASSIGNED_MEMONHEAP_ISSET_ID = 8;
  private static final int __ASSIGNED_MEMOFFHEAP_ISSET_ID = 9;
  private static final int __ASSIGNED_CPU_ISSET_ID = 10;
  private static final int __REQUESTED_REGULAR_ON_HEAP_MEMORY_ISSET_ID = 11;
  private static final int __REQUESTED_SHARED_ON_HEAP_MEMORY_ISSET_ID = 12;
  private static final int __REQUESTED_REGULAR_OFF_HEAP_MEMORY_ISSET_ID = 13;
  private static final int __REQUESTED_SHARED_OFF_HEAP_MEMORY_ISSET_ID = 14;
  private static final int __ASSIGNED_REGULAR_ON_HEAP_MEMORY_ISSET_ID = 15;
  private static final int __ASSIGNED_SHARED_ON_HEAP_MEMORY_ISSET_ID = 16;
  private static final int __ASSIGNED_REGULAR_OFF_HEAP_MEMORY_ISSET_ID = 17;
  private static final int __ASSIGNED_SHARED_OFF_HEAP_MEMORY_ISSET_ID = 18;
  private int __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.NAME,_Fields.UPTIME_SECS,_Fields.STATUS,_Fields.NUM_TASKS,_Fields.NUM_WORKERS,_Fields.NUM_EXECUTORS,_Fields.TOPOLOGY_CONF,_Fields.ID_TO_SPOUT_AGG_STATS,_Fields.ID_TO_BOLT_AGG_STATS,_Fields.SCHED_STATUS,_Fields.TOPOLOGY_STATS,_Fields.OWNER,_Fields.DEBUG_OPTIONS,_Fields.REPLICATION_COUNT,_Fields.WORKERS,_Fields.STORM_VERSION,_Fields.TOPOLOGY_VERSION,_Fields.REQUESTED_MEMONHEAP,_Fields.REQUESTED_MEMOFFHEAP,_Fields.REQUESTED_CPU,_Fields.ASSIGNED_MEMONHEAP,_Fields.ASSIGNED_MEMOFFHEAP,_Fields.ASSIGNED_CPU,_Fields.REQUESTED_REGULAR_ON_HEAP_MEMORY,_Fields.REQUESTED_SHARED_ON_HEAP_MEMORY,_Fields.REQUESTED_REGULAR_OFF_HEAP_MEMORY,_Fields.REQUESTED_SHARED_OFF_HEAP_MEMORY,_Fields.ASSIGNED_REGULAR_ON_HEAP_MEMORY,_Fields.ASSIGNED_SHARED_ON_HEAP_MEMORY,_Fields.ASSIGNED_REGULAR_OFF_HEAP_MEMORY,_Fields.ASSIGNED_SHARED_OFF_HEAP_MEMORY};
  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.ID, new org.apache.storm.thrift.meta_data.FieldMetaData("id", org.apache.storm.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.NAME, new org.apache.storm.thrift.meta_data.FieldMetaData("name", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.UPTIME_SECS, new org.apache.storm.thrift.meta_data.FieldMetaData("uptime_secs", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.STATUS, new org.apache.storm.thrift.meta_data.FieldMetaData("status", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.NUM_TASKS, new org.apache.storm.thrift.meta_data.FieldMetaData("num_tasks", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.NUM_WORKERS, new org.apache.storm.thrift.meta_data.FieldMetaData("num_workers", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.NUM_EXECUTORS, new org.apache.storm.thrift.meta_data.FieldMetaData("num_executors", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.TOPOLOGY_CONF, new org.apache.storm.thrift.meta_data.FieldMetaData("topology_conf", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.ID_TO_SPOUT_AGG_STATS, new org.apache.storm.thrift.meta_data.FieldMetaData("id_to_spout_agg_stats", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.MapMetaData(org.apache.storm.thrift.protocol.TType.MAP, 
            new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING), 
            new org.apache.storm.thrift.meta_data.StructMetaData(org.apache.storm.thrift.protocol.TType.STRUCT, ComponentAggregateStats.class))));
    tmpMap.put(_Fields.ID_TO_BOLT_AGG_STATS, new org.apache.storm.thrift.meta_data.FieldMetaData("id_to_bolt_agg_stats", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.MapMetaData(org.apache.storm.thrift.protocol.TType.MAP, 
            new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING), 
            new org.apache.storm.thrift.meta_data.StructMetaData(org.apache.storm.thrift.protocol.TType.STRUCT, ComponentAggregateStats.class))));
    tmpMap.put(_Fields.SCHED_STATUS, new org.apache.storm.thrift.meta_data.FieldMetaData("sched_status", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TOPOLOGY_STATS, new org.apache.storm.thrift.meta_data.FieldMetaData("topology_stats", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.StructMetaData(org.apache.storm.thrift.protocol.TType.STRUCT, TopologyStats.class)));
    tmpMap.put(_Fields.OWNER, new org.apache.storm.thrift.meta_data.FieldMetaData("owner", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.DEBUG_OPTIONS, new org.apache.storm.thrift.meta_data.FieldMetaData("debug_options", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.StructMetaData(org.apache.storm.thrift.protocol.TType.STRUCT, DebugOptions.class)));
    tmpMap.put(_Fields.REPLICATION_COUNT, new org.apache.storm.thrift.meta_data.FieldMetaData("replication_count", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.WORKERS, new org.apache.storm.thrift.meta_data.FieldMetaData("workers", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.ListMetaData(org.apache.storm.thrift.protocol.TType.LIST, 
            new org.apache.storm.thrift.meta_data.StructMetaData(org.apache.storm.thrift.protocol.TType.STRUCT, WorkerSummary.class))));
    tmpMap.put(_Fields.STORM_VERSION, new org.apache.storm.thrift.meta_data.FieldMetaData("storm_version", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TOPOLOGY_VERSION, new org.apache.storm.thrift.meta_data.FieldMetaData("topology_version", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REQUESTED_MEMONHEAP, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_memonheap", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_MEMOFFHEAP, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_memoffheap", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_CPU, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_cpu", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_MEMONHEAP, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_memonheap", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_MEMOFFHEAP, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_memoffheap", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_CPU, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_cpu", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_REGULAR_ON_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_regular_on_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_SHARED_ON_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_shared_on_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_REGULAR_OFF_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_regular_off_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.REQUESTED_SHARED_OFF_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("requested_shared_off_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_REGULAR_ON_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_regular_on_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_SHARED_ON_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_shared_on_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_REGULAR_OFF_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_regular_off_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.ASSIGNED_SHARED_OFF_HEAP_MEMORY, new org.apache.storm.thrift.meta_data.FieldMetaData("assigned_shared_off_heap_memory", org.apache.storm.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.storm.thrift.meta_data.FieldValueMetaData(org.apache.storm.thrift.protocol.TType.DOUBLE)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.storm.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TopologyPageInfo.class, metaDataMap);
  }

  public TopologyPageInfo() {
  }

  public TopologyPageInfo(
    java.lang.String id)
  {
    this();
    this.id = id;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public TopologyPageInfo(TopologyPageInfo other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.is_set_id()) {
      this.id = other.id;
    }
    if (other.is_set_name()) {
      this.name = other.name;
    }
    this.uptime_secs = other.uptime_secs;
    if (other.is_set_status()) {
      this.status = other.status;
    }
    this.num_tasks = other.num_tasks;
    this.num_workers = other.num_workers;
    this.num_executors = other.num_executors;
    if (other.is_set_topology_conf()) {
      this.topology_conf = other.topology_conf;
    }
    if (other.is_set_id_to_spout_agg_stats()) {
      java.util.Map<java.lang.String,ComponentAggregateStats> __this__id_to_spout_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(other.id_to_spout_agg_stats.size());
      for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> other_element : other.id_to_spout_agg_stats.entrySet()) {

        java.lang.String other_element_key = other_element.getKey();
        ComponentAggregateStats other_element_value = other_element.getValue();

        java.lang.String __this__id_to_spout_agg_stats_copy_key = other_element_key;

        ComponentAggregateStats __this__id_to_spout_agg_stats_copy_value = new ComponentAggregateStats(other_element_value);

        __this__id_to_spout_agg_stats.put(__this__id_to_spout_agg_stats_copy_key, __this__id_to_spout_agg_stats_copy_value);
      }
      this.id_to_spout_agg_stats = __this__id_to_spout_agg_stats;
    }
    if (other.is_set_id_to_bolt_agg_stats()) {
      java.util.Map<java.lang.String,ComponentAggregateStats> __this__id_to_bolt_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(other.id_to_bolt_agg_stats.size());
      for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> other_element : other.id_to_bolt_agg_stats.entrySet()) {

        java.lang.String other_element_key = other_element.getKey();
        ComponentAggregateStats other_element_value = other_element.getValue();

        java.lang.String __this__id_to_bolt_agg_stats_copy_key = other_element_key;

        ComponentAggregateStats __this__id_to_bolt_agg_stats_copy_value = new ComponentAggregateStats(other_element_value);

        __this__id_to_bolt_agg_stats.put(__this__id_to_bolt_agg_stats_copy_key, __this__id_to_bolt_agg_stats_copy_value);
      }
      this.id_to_bolt_agg_stats = __this__id_to_bolt_agg_stats;
    }
    if (other.is_set_sched_status()) {
      this.sched_status = other.sched_status;
    }
    if (other.is_set_topology_stats()) {
      this.topology_stats = new TopologyStats(other.topology_stats);
    }
    if (other.is_set_owner()) {
      this.owner = other.owner;
    }
    if (other.is_set_debug_options()) {
      this.debug_options = new DebugOptions(other.debug_options);
    }
    this.replication_count = other.replication_count;
    if (other.is_set_workers()) {
      java.util.List<WorkerSummary> __this__workers = new java.util.ArrayList<WorkerSummary>(other.workers.size());
      for (WorkerSummary other_element : other.workers) {
        __this__workers.add(new WorkerSummary(other_element));
      }
      this.workers = __this__workers;
    }
    if (other.is_set_storm_version()) {
      this.storm_version = other.storm_version;
    }
    if (other.is_set_topology_version()) {
      this.topology_version = other.topology_version;
    }
    this.requested_memonheap = other.requested_memonheap;
    this.requested_memoffheap = other.requested_memoffheap;
    this.requested_cpu = other.requested_cpu;
    this.assigned_memonheap = other.assigned_memonheap;
    this.assigned_memoffheap = other.assigned_memoffheap;
    this.assigned_cpu = other.assigned_cpu;
    this.requested_regular_on_heap_memory = other.requested_regular_on_heap_memory;
    this.requested_shared_on_heap_memory = other.requested_shared_on_heap_memory;
    this.requested_regular_off_heap_memory = other.requested_regular_off_heap_memory;
    this.requested_shared_off_heap_memory = other.requested_shared_off_heap_memory;
    this.assigned_regular_on_heap_memory = other.assigned_regular_on_heap_memory;
    this.assigned_shared_on_heap_memory = other.assigned_shared_on_heap_memory;
    this.assigned_regular_off_heap_memory = other.assigned_regular_off_heap_memory;
    this.assigned_shared_off_heap_memory = other.assigned_shared_off_heap_memory;
  }

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

  @Override
  public void clear() {
    this.id = null;
    this.name = null;
    set_uptime_secs_isSet(false);
    this.uptime_secs = 0;
    this.status = null;
    set_num_tasks_isSet(false);
    this.num_tasks = 0;
    set_num_workers_isSet(false);
    this.num_workers = 0;
    set_num_executors_isSet(false);
    this.num_executors = 0;
    this.topology_conf = null;
    this.id_to_spout_agg_stats = null;
    this.id_to_bolt_agg_stats = null;
    this.sched_status = null;
    this.topology_stats = null;
    this.owner = null;
    this.debug_options = null;
    set_replication_count_isSet(false);
    this.replication_count = 0;
    this.workers = null;
    this.storm_version = null;
    this.topology_version = null;
    set_requested_memonheap_isSet(false);
    this.requested_memonheap = 0.0;
    set_requested_memoffheap_isSet(false);
    this.requested_memoffheap = 0.0;
    set_requested_cpu_isSet(false);
    this.requested_cpu = 0.0;
    set_assigned_memonheap_isSet(false);
    this.assigned_memonheap = 0.0;
    set_assigned_memoffheap_isSet(false);
    this.assigned_memoffheap = 0.0;
    set_assigned_cpu_isSet(false);
    this.assigned_cpu = 0.0;
    set_requested_regular_on_heap_memory_isSet(false);
    this.requested_regular_on_heap_memory = 0.0;
    set_requested_shared_on_heap_memory_isSet(false);
    this.requested_shared_on_heap_memory = 0.0;
    set_requested_regular_off_heap_memory_isSet(false);
    this.requested_regular_off_heap_memory = 0.0;
    set_requested_shared_off_heap_memory_isSet(false);
    this.requested_shared_off_heap_memory = 0.0;
    set_assigned_regular_on_heap_memory_isSet(false);
    this.assigned_regular_on_heap_memory = 0.0;
    set_assigned_shared_on_heap_memory_isSet(false);
    this.assigned_shared_on_heap_memory = 0.0;
    set_assigned_regular_off_heap_memory_isSet(false);
    this.assigned_regular_off_heap_memory = 0.0;
    set_assigned_shared_off_heap_memory_isSet(false);
    this.assigned_shared_off_heap_memory = 0.0;
  }

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

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

  public void unset_id() {
    this.id = null;
  }

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

  public void set_id_isSet(boolean value) {
    if (!value) {
      this.id = null;
    }
  }

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

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

  public void unset_name() {
    this.name = null;
  }

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

  public void set_name_isSet(boolean value) {
    if (!value) {
      this.name = null;
    }
  }

  public int get_uptime_secs() {
    return this.uptime_secs;
  }

  public void set_uptime_secs(int uptime_secs) {
    this.uptime_secs = uptime_secs;
    set_uptime_secs_isSet(true);
  }

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

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

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

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

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

  public void unset_status() {
    this.status = null;
  }

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

  public void set_status_isSet(boolean value) {
    if (!value) {
      this.status = null;
    }
  }

  public int get_num_tasks() {
    return this.num_tasks;
  }

  public void set_num_tasks(int num_tasks) {
    this.num_tasks = num_tasks;
    set_num_tasks_isSet(true);
  }

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

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

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

  public int get_num_workers() {
    return this.num_workers;
  }

  public void set_num_workers(int num_workers) {
    this.num_workers = num_workers;
    set_num_workers_isSet(true);
  }

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

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

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

  public int get_num_executors() {
    return this.num_executors;
  }

  public void set_num_executors(int num_executors) {
    this.num_executors = num_executors;
    set_num_executors_isSet(true);
  }

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

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

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

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

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

  public void unset_topology_conf() {
    this.topology_conf = null;
  }

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

  public void set_topology_conf_isSet(boolean value) {
    if (!value) {
      this.topology_conf = null;
    }
  }

  public int get_id_to_spout_agg_stats_size() {
    return (this.id_to_spout_agg_stats == null) ? 0 : this.id_to_spout_agg_stats.size();
  }

  public void put_to_id_to_spout_agg_stats(java.lang.String key, ComponentAggregateStats val) {
    if (this.id_to_spout_agg_stats == null) {
      this.id_to_spout_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>();
    }
    this.id_to_spout_agg_stats.put(key, val);
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.util.Map<java.lang.String,ComponentAggregateStats> get_id_to_spout_agg_stats() {
    return this.id_to_spout_agg_stats;
  }

  public void set_id_to_spout_agg_stats(@org.apache.storm.thrift.annotation.Nullable java.util.Map<java.lang.String,ComponentAggregateStats> id_to_spout_agg_stats) {
    this.id_to_spout_agg_stats = id_to_spout_agg_stats;
  }

  public void unset_id_to_spout_agg_stats() {
    this.id_to_spout_agg_stats = null;
  }

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

  public void set_id_to_spout_agg_stats_isSet(boolean value) {
    if (!value) {
      this.id_to_spout_agg_stats = null;
    }
  }

  public int get_id_to_bolt_agg_stats_size() {
    return (this.id_to_bolt_agg_stats == null) ? 0 : this.id_to_bolt_agg_stats.size();
  }

  public void put_to_id_to_bolt_agg_stats(java.lang.String key, ComponentAggregateStats val) {
    if (this.id_to_bolt_agg_stats == null) {
      this.id_to_bolt_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>();
    }
    this.id_to_bolt_agg_stats.put(key, val);
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.util.Map<java.lang.String,ComponentAggregateStats> get_id_to_bolt_agg_stats() {
    return this.id_to_bolt_agg_stats;
  }

  public void set_id_to_bolt_agg_stats(@org.apache.storm.thrift.annotation.Nullable java.util.Map<java.lang.String,ComponentAggregateStats> id_to_bolt_agg_stats) {
    this.id_to_bolt_agg_stats = id_to_bolt_agg_stats;
  }

  public void unset_id_to_bolt_agg_stats() {
    this.id_to_bolt_agg_stats = null;
  }

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

  public void set_id_to_bolt_agg_stats_isSet(boolean value) {
    if (!value) {
      this.id_to_bolt_agg_stats = null;
    }
  }

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

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

  public void unset_sched_status() {
    this.sched_status = null;
  }

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

  public void set_sched_status_isSet(boolean value) {
    if (!value) {
      this.sched_status = null;
    }
  }

  @org.apache.storm.thrift.annotation.Nullable
  public TopologyStats get_topology_stats() {
    return this.topology_stats;
  }

  public void set_topology_stats(@org.apache.storm.thrift.annotation.Nullable TopologyStats topology_stats) {
    this.topology_stats = topology_stats;
  }

  public void unset_topology_stats() {
    this.topology_stats = null;
  }

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

  public void set_topology_stats_isSet(boolean value) {
    if (!value) {
      this.topology_stats = null;
    }
  }

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

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

  public void unset_owner() {
    this.owner = null;
  }

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

  public void set_owner_isSet(boolean value) {
    if (!value) {
      this.owner = null;
    }
  }

  @org.apache.storm.thrift.annotation.Nullable
  public DebugOptions get_debug_options() {
    return this.debug_options;
  }

  public void set_debug_options(@org.apache.storm.thrift.annotation.Nullable DebugOptions debug_options) {
    this.debug_options = debug_options;
  }

  public void unset_debug_options() {
    this.debug_options = null;
  }

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

  public void set_debug_options_isSet(boolean value) {
    if (!value) {
      this.debug_options = null;
    }
  }

  public int get_replication_count() {
    return this.replication_count;
  }

  public void set_replication_count(int replication_count) {
    this.replication_count = replication_count;
    set_replication_count_isSet(true);
  }

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

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

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

  public int get_workers_size() {
    return (this.workers == null) ? 0 : this.workers.size();
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.util.Iterator<WorkerSummary> get_workers_iterator() {
    return (this.workers == null) ? null : this.workers.iterator();
  }

  public void add_to_workers(WorkerSummary elem) {
    if (this.workers == null) {
      this.workers = new java.util.ArrayList<WorkerSummary>();
    }
    this.workers.add(elem);
  }

  @org.apache.storm.thrift.annotation.Nullable
  public java.util.List<WorkerSummary> get_workers() {
    return this.workers;
  }

  public void set_workers(@org.apache.storm.thrift.annotation.Nullable java.util.List<WorkerSummary> workers) {
    this.workers = workers;
  }

  public void unset_workers() {
    this.workers = null;
  }

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

  public void set_workers_isSet(boolean value) {
    if (!value) {
      this.workers = null;
    }
  }

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

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

  public void unset_storm_version() {
    this.storm_version = null;
  }

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

  public void set_storm_version_isSet(boolean value) {
    if (!value) {
      this.storm_version = null;
    }
  }

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

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

  public void unset_topology_version() {
    this.topology_version = null;
  }

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

  public void set_topology_version_isSet(boolean value) {
    if (!value) {
      this.topology_version = null;
    }
  }

  public double get_requested_memonheap() {
    return this.requested_memonheap;
  }

  public void set_requested_memonheap(double requested_memonheap) {
    this.requested_memonheap = requested_memonheap;
    set_requested_memonheap_isSet(true);
  }

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

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

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

  public double get_requested_memoffheap() {
    return this.requested_memoffheap;
  }

  public void set_requested_memoffheap(double requested_memoffheap) {
    this.requested_memoffheap = requested_memoffheap;
    set_requested_memoffheap_isSet(true);
  }

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

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

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

  public double get_requested_cpu() {
    return this.requested_cpu;
  }

  public void set_requested_cpu(double requested_cpu) {
    this.requested_cpu = requested_cpu;
    set_requested_cpu_isSet(true);
  }

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

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

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

  public double get_assigned_memonheap() {
    return this.assigned_memonheap;
  }

  public void set_assigned_memonheap(double assigned_memonheap) {
    this.assigned_memonheap = assigned_memonheap;
    set_assigned_memonheap_isSet(true);
  }

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

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

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

  public double get_assigned_memoffheap() {
    return this.assigned_memoffheap;
  }

  public void set_assigned_memoffheap(double assigned_memoffheap) {
    this.assigned_memoffheap = assigned_memoffheap;
    set_assigned_memoffheap_isSet(true);
  }

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

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

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

  public double get_assigned_cpu() {
    return this.assigned_cpu;
  }

  public void set_assigned_cpu(double assigned_cpu) {
    this.assigned_cpu = assigned_cpu;
    set_assigned_cpu_isSet(true);
  }

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

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

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

  public double get_requested_regular_on_heap_memory() {
    return this.requested_regular_on_heap_memory;
  }

  public void set_requested_regular_on_heap_memory(double requested_regular_on_heap_memory) {
    this.requested_regular_on_heap_memory = requested_regular_on_heap_memory;
    set_requested_regular_on_heap_memory_isSet(true);
  }

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

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

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

  public double get_requested_shared_on_heap_memory() {
    return this.requested_shared_on_heap_memory;
  }

  public void set_requested_shared_on_heap_memory(double requested_shared_on_heap_memory) {
    this.requested_shared_on_heap_memory = requested_shared_on_heap_memory;
    set_requested_shared_on_heap_memory_isSet(true);
  }

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

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

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

  public double get_requested_regular_off_heap_memory() {
    return this.requested_regular_off_heap_memory;
  }

  public void set_requested_regular_off_heap_memory(double requested_regular_off_heap_memory) {
    this.requested_regular_off_heap_memory = requested_regular_off_heap_memory;
    set_requested_regular_off_heap_memory_isSet(true);
  }

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

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

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

  public double get_requested_shared_off_heap_memory() {
    return this.requested_shared_off_heap_memory;
  }

  public void set_requested_shared_off_heap_memory(double requested_shared_off_heap_memory) {
    this.requested_shared_off_heap_memory = requested_shared_off_heap_memory;
    set_requested_shared_off_heap_memory_isSet(true);
  }

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

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

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

  public double get_assigned_regular_on_heap_memory() {
    return this.assigned_regular_on_heap_memory;
  }

  public void set_assigned_regular_on_heap_memory(double assigned_regular_on_heap_memory) {
    this.assigned_regular_on_heap_memory = assigned_regular_on_heap_memory;
    set_assigned_regular_on_heap_memory_isSet(true);
  }

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

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

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

  public double get_assigned_shared_on_heap_memory() {
    return this.assigned_shared_on_heap_memory;
  }

  public void set_assigned_shared_on_heap_memory(double assigned_shared_on_heap_memory) {
    this.assigned_shared_on_heap_memory = assigned_shared_on_heap_memory;
    set_assigned_shared_on_heap_memory_isSet(true);
  }

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

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

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

  public double get_assigned_regular_off_heap_memory() {
    return this.assigned_regular_off_heap_memory;
  }

  public void set_assigned_regular_off_heap_memory(double assigned_regular_off_heap_memory) {
    this.assigned_regular_off_heap_memory = assigned_regular_off_heap_memory;
    set_assigned_regular_off_heap_memory_isSet(true);
  }

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

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

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

  public double get_assigned_shared_off_heap_memory() {
    return this.assigned_shared_off_heap_memory;
  }

  public void set_assigned_shared_off_heap_memory(double assigned_shared_off_heap_memory) {
    this.assigned_shared_off_heap_memory = assigned_shared_off_heap_memory;
    set_assigned_shared_off_heap_memory_isSet(true);
  }

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

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

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

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

    case NAME:
      if (value == null) {
        unset_name();
      } else {
        set_name((java.lang.String)value);
      }
      break;

    case UPTIME_SECS:
      if (value == null) {
        unset_uptime_secs();
      } else {
        set_uptime_secs((java.lang.Integer)value);
      }
      break;

    case STATUS:
      if (value == null) {
        unset_status();
      } else {
        set_status((java.lang.String)value);
      }
      break;

    case NUM_TASKS:
      if (value == null) {
        unset_num_tasks();
      } else {
        set_num_tasks((java.lang.Integer)value);
      }
      break;

    case NUM_WORKERS:
      if (value == null) {
        unset_num_workers();
      } else {
        set_num_workers((java.lang.Integer)value);
      }
      break;

    case NUM_EXECUTORS:
      if (value == null) {
        unset_num_executors();
      } else {
        set_num_executors((java.lang.Integer)value);
      }
      break;

    case TOPOLOGY_CONF:
      if (value == null) {
        unset_topology_conf();
      } else {
        set_topology_conf((java.lang.String)value);
      }
      break;

    case ID_TO_SPOUT_AGG_STATS:
      if (value == null) {
        unset_id_to_spout_agg_stats();
      } else {
        set_id_to_spout_agg_stats((java.util.Map<java.lang.String,ComponentAggregateStats>)value);
      }
      break;

    case ID_TO_BOLT_AGG_STATS:
      if (value == null) {
        unset_id_to_bolt_agg_stats();
      } else {
        set_id_to_bolt_agg_stats((java.util.Map<java.lang.String,ComponentAggregateStats>)value);
      }
      break;

    case SCHED_STATUS:
      if (value == null) {
        unset_sched_status();
      } else {
        set_sched_status((java.lang.String)value);
      }
      break;

    case TOPOLOGY_STATS:
      if (value == null) {
        unset_topology_stats();
      } else {
        set_topology_stats((TopologyStats)value);
      }
      break;

    case OWNER:
      if (value == null) {
        unset_owner();
      } else {
        set_owner((java.lang.String)value);
      }
      break;

    case DEBUG_OPTIONS:
      if (value == null) {
        unset_debug_options();
      } else {
        set_debug_options((DebugOptions)value);
      }
      break;

    case REPLICATION_COUNT:
      if (value == null) {
        unset_replication_count();
      } else {
        set_replication_count((java.lang.Integer)value);
      }
      break;

    case WORKERS:
      if (value == null) {
        unset_workers();
      } else {
        set_workers((java.util.List<WorkerSummary>)value);
      }
      break;

    case STORM_VERSION:
      if (value == null) {
        unset_storm_version();
      } else {
        set_storm_version((java.lang.String)value);
      }
      break;

    case TOPOLOGY_VERSION:
      if (value == null) {
        unset_topology_version();
      } else {
        set_topology_version((java.lang.String)value);
      }
      break;

    case REQUESTED_MEMONHEAP:
      if (value == null) {
        unset_requested_memonheap();
      } else {
        set_requested_memonheap((java.lang.Double)value);
      }
      break;

    case REQUESTED_MEMOFFHEAP:
      if (value == null) {
        unset_requested_memoffheap();
      } else {
        set_requested_memoffheap((java.lang.Double)value);
      }
      break;

    case REQUESTED_CPU:
      if (value == null) {
        unset_requested_cpu();
      } else {
        set_requested_cpu((java.lang.Double)value);
      }
      break;

    case ASSIGNED_MEMONHEAP:
      if (value == null) {
        unset_assigned_memonheap();
      } else {
        set_assigned_memonheap((java.lang.Double)value);
      }
      break;

    case ASSIGNED_MEMOFFHEAP:
      if (value == null) {
        unset_assigned_memoffheap();
      } else {
        set_assigned_memoffheap((java.lang.Double)value);
      }
      break;

    case ASSIGNED_CPU:
      if (value == null) {
        unset_assigned_cpu();
      } else {
        set_assigned_cpu((java.lang.Double)value);
      }
      break;

    case REQUESTED_REGULAR_ON_HEAP_MEMORY:
      if (value == null) {
        unset_requested_regular_on_heap_memory();
      } else {
        set_requested_regular_on_heap_memory((java.lang.Double)value);
      }
      break;

    case REQUESTED_SHARED_ON_HEAP_MEMORY:
      if (value == null) {
        unset_requested_shared_on_heap_memory();
      } else {
        set_requested_shared_on_heap_memory((java.lang.Double)value);
      }
      break;

    case REQUESTED_REGULAR_OFF_HEAP_MEMORY:
      if (value == null) {
        unset_requested_regular_off_heap_memory();
      } else {
        set_requested_regular_off_heap_memory((java.lang.Double)value);
      }
      break;

    case REQUESTED_SHARED_OFF_HEAP_MEMORY:
      if (value == null) {
        unset_requested_shared_off_heap_memory();
      } else {
        set_requested_shared_off_heap_memory((java.lang.Double)value);
      }
      break;

    case ASSIGNED_REGULAR_ON_HEAP_MEMORY:
      if (value == null) {
        unset_assigned_regular_on_heap_memory();
      } else {
        set_assigned_regular_on_heap_memory((java.lang.Double)value);
      }
      break;

    case ASSIGNED_SHARED_ON_HEAP_MEMORY:
      if (value == null) {
        unset_assigned_shared_on_heap_memory();
      } else {
        set_assigned_shared_on_heap_memory((java.lang.Double)value);
      }
      break;

    case ASSIGNED_REGULAR_OFF_HEAP_MEMORY:
      if (value == null) {
        unset_assigned_regular_off_heap_memory();
      } else {
        set_assigned_regular_off_heap_memory((java.lang.Double)value);
      }
      break;

    case ASSIGNED_SHARED_OFF_HEAP_MEMORY:
      if (value == null) {
        unset_assigned_shared_off_heap_memory();
      } else {
        set_assigned_shared_off_heap_memory((java.lang.Double)value);
      }
      break;

    }
  }

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

    case NAME:
      return get_name();

    case UPTIME_SECS:
      return get_uptime_secs();

    case STATUS:
      return get_status();

    case NUM_TASKS:
      return get_num_tasks();

    case NUM_WORKERS:
      return get_num_workers();

    case NUM_EXECUTORS:
      return get_num_executors();

    case TOPOLOGY_CONF:
      return get_topology_conf();

    case ID_TO_SPOUT_AGG_STATS:
      return get_id_to_spout_agg_stats();

    case ID_TO_BOLT_AGG_STATS:
      return get_id_to_bolt_agg_stats();

    case SCHED_STATUS:
      return get_sched_status();

    case TOPOLOGY_STATS:
      return get_topology_stats();

    case OWNER:
      return get_owner();

    case DEBUG_OPTIONS:
      return get_debug_options();

    case REPLICATION_COUNT:
      return get_replication_count();

    case WORKERS:
      return get_workers();

    case STORM_VERSION:
      return get_storm_version();

    case TOPOLOGY_VERSION:
      return get_topology_version();

    case REQUESTED_MEMONHEAP:
      return get_requested_memonheap();

    case REQUESTED_MEMOFFHEAP:
      return get_requested_memoffheap();

    case REQUESTED_CPU:
      return get_requested_cpu();

    case ASSIGNED_MEMONHEAP:
      return get_assigned_memonheap();

    case ASSIGNED_MEMOFFHEAP:
      return get_assigned_memoffheap();

    case ASSIGNED_CPU:
      return get_assigned_cpu();

    case REQUESTED_REGULAR_ON_HEAP_MEMORY:
      return get_requested_regular_on_heap_memory();

    case REQUESTED_SHARED_ON_HEAP_MEMORY:
      return get_requested_shared_on_heap_memory();

    case REQUESTED_REGULAR_OFF_HEAP_MEMORY:
      return get_requested_regular_off_heap_memory();

    case REQUESTED_SHARED_OFF_HEAP_MEMORY:
      return get_requested_shared_off_heap_memory();

    case ASSIGNED_REGULAR_ON_HEAP_MEMORY:
      return get_assigned_regular_on_heap_memory();

    case ASSIGNED_SHARED_ON_HEAP_MEMORY:
      return get_assigned_shared_on_heap_memory();

    case ASSIGNED_REGULAR_OFF_HEAP_MEMORY:
      return get_assigned_regular_off_heap_memory();

    case ASSIGNED_SHARED_OFF_HEAP_MEMORY:
      return get_assigned_shared_off_heap_memory();

    }
    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 ID:
      return is_set_id();
    case NAME:
      return is_set_name();
    case UPTIME_SECS:
      return is_set_uptime_secs();
    case STATUS:
      return is_set_status();
    case NUM_TASKS:
      return is_set_num_tasks();
    case NUM_WORKERS:
      return is_set_num_workers();
    case NUM_EXECUTORS:
      return is_set_num_executors();
    case TOPOLOGY_CONF:
      return is_set_topology_conf();
    case ID_TO_SPOUT_AGG_STATS:
      return is_set_id_to_spout_agg_stats();
    case ID_TO_BOLT_AGG_STATS:
      return is_set_id_to_bolt_agg_stats();
    case SCHED_STATUS:
      return is_set_sched_status();
    case TOPOLOGY_STATS:
      return is_set_topology_stats();
    case OWNER:
      return is_set_owner();
    case DEBUG_OPTIONS:
      return is_set_debug_options();
    case REPLICATION_COUNT:
      return is_set_replication_count();
    case WORKERS:
      return is_set_workers();
    case STORM_VERSION:
      return is_set_storm_version();
    case TOPOLOGY_VERSION:
      return is_set_topology_version();
    case REQUESTED_MEMONHEAP:
      return is_set_requested_memonheap();
    case REQUESTED_MEMOFFHEAP:
      return is_set_requested_memoffheap();
    case REQUESTED_CPU:
      return is_set_requested_cpu();
    case ASSIGNED_MEMONHEAP:
      return is_set_assigned_memonheap();
    case ASSIGNED_MEMOFFHEAP:
      return is_set_assigned_memoffheap();
    case ASSIGNED_CPU:
      return is_set_assigned_cpu();
    case REQUESTED_REGULAR_ON_HEAP_MEMORY:
      return is_set_requested_regular_on_heap_memory();
    case REQUESTED_SHARED_ON_HEAP_MEMORY:
      return is_set_requested_shared_on_heap_memory();
    case REQUESTED_REGULAR_OFF_HEAP_MEMORY:
      return is_set_requested_regular_off_heap_memory();
    case REQUESTED_SHARED_OFF_HEAP_MEMORY:
      return is_set_requested_shared_off_heap_memory();
    case ASSIGNED_REGULAR_ON_HEAP_MEMORY:
      return is_set_assigned_regular_on_heap_memory();
    case ASSIGNED_SHARED_ON_HEAP_MEMORY:
      return is_set_assigned_shared_on_heap_memory();
    case ASSIGNED_REGULAR_OFF_HEAP_MEMORY:
      return is_set_assigned_regular_off_heap_memory();
    case ASSIGNED_SHARED_OFF_HEAP_MEMORY:
      return is_set_assigned_shared_off_heap_memory();
    }
    throw new java.lang.IllegalStateException();
  }

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

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

    boolean this_present_id = true && this.is_set_id();
    boolean that_present_id = true && that.is_set_id();
    if (this_present_id || that_present_id) {
      if (!(this_present_id && that_present_id))
        return false;
      if (!this.id.equals(that.id))
        return false;
    }

    boolean this_present_name = true && this.is_set_name();
    boolean that_present_name = true && that.is_set_name();
    if (this_present_name || that_present_name) {
      if (!(this_present_name && that_present_name))
        return false;
      if (!this.name.equals(that.name))
        return false;
    }

    boolean this_present_uptime_secs = true && this.is_set_uptime_secs();
    boolean that_present_uptime_secs = true && that.is_set_uptime_secs();
    if (this_present_uptime_secs || that_present_uptime_secs) {
      if (!(this_present_uptime_secs && that_present_uptime_secs))
        return false;
      if (this.uptime_secs != that.uptime_secs)
        return false;
    }

    boolean this_present_status = true && this.is_set_status();
    boolean that_present_status = true && that.is_set_status();
    if (this_present_status || that_present_status) {
      if (!(this_present_status && that_present_status))
        return false;
      if (!this.status.equals(that.status))
        return false;
    }

    boolean this_present_num_tasks = true && this.is_set_num_tasks();
    boolean that_present_num_tasks = true && that.is_set_num_tasks();
    if (this_present_num_tasks || that_present_num_tasks) {
      if (!(this_present_num_tasks && that_present_num_tasks))
        return false;
      if (this.num_tasks != that.num_tasks)
        return false;
    }

    boolean this_present_num_workers = true && this.is_set_num_workers();
    boolean that_present_num_workers = true && that.is_set_num_workers();
    if (this_present_num_workers || that_present_num_workers) {
      if (!(this_present_num_workers && that_present_num_workers))
        return false;
      if (this.num_workers != that.num_workers)
        return false;
    }

    boolean this_present_num_executors = true && this.is_set_num_executors();
    boolean that_present_num_executors = true && that.is_set_num_executors();
    if (this_present_num_executors || that_present_num_executors) {
      if (!(this_present_num_executors && that_present_num_executors))
        return false;
      if (this.num_executors != that.num_executors)
        return false;
    }

    boolean this_present_topology_conf = true && this.is_set_topology_conf();
    boolean that_present_topology_conf = true && that.is_set_topology_conf();
    if (this_present_topology_conf || that_present_topology_conf) {
      if (!(this_present_topology_conf && that_present_topology_conf))
        return false;
      if (!this.topology_conf.equals(that.topology_conf))
        return false;
    }

    boolean this_present_id_to_spout_agg_stats = true && this.is_set_id_to_spout_agg_stats();
    boolean that_present_id_to_spout_agg_stats = true && that.is_set_id_to_spout_agg_stats();
    if (this_present_id_to_spout_agg_stats || that_present_id_to_spout_agg_stats) {
      if (!(this_present_id_to_spout_agg_stats && that_present_id_to_spout_agg_stats))
        return false;
      if (!this.id_to_spout_agg_stats.equals(that.id_to_spout_agg_stats))
        return false;
    }

    boolean this_present_id_to_bolt_agg_stats = true && this.is_set_id_to_bolt_agg_stats();
    boolean that_present_id_to_bolt_agg_stats = true && that.is_set_id_to_bolt_agg_stats();
    if (this_present_id_to_bolt_agg_stats || that_present_id_to_bolt_agg_stats) {
      if (!(this_present_id_to_bolt_agg_stats && that_present_id_to_bolt_agg_stats))
        return false;
      if (!this.id_to_bolt_agg_stats.equals(that.id_to_bolt_agg_stats))
        return false;
    }

    boolean this_present_sched_status = true && this.is_set_sched_status();
    boolean that_present_sched_status = true && that.is_set_sched_status();
    if (this_present_sched_status || that_present_sched_status) {
      if (!(this_present_sched_status && that_present_sched_status))
        return false;
      if (!this.sched_status.equals(that.sched_status))
        return false;
    }

    boolean this_present_topology_stats = true && this.is_set_topology_stats();
    boolean that_present_topology_stats = true && that.is_set_topology_stats();
    if (this_present_topology_stats || that_present_topology_stats) {
      if (!(this_present_topology_stats && that_present_topology_stats))
        return false;
      if (!this.topology_stats.equals(that.topology_stats))
        return false;
    }

    boolean this_present_owner = true && this.is_set_owner();
    boolean that_present_owner = true && that.is_set_owner();
    if (this_present_owner || that_present_owner) {
      if (!(this_present_owner && that_present_owner))
        return false;
      if (!this.owner.equals(that.owner))
        return false;
    }

    boolean this_present_debug_options = true && this.is_set_debug_options();
    boolean that_present_debug_options = true && that.is_set_debug_options();
    if (this_present_debug_options || that_present_debug_options) {
      if (!(this_present_debug_options && that_present_debug_options))
        return false;
      if (!this.debug_options.equals(that.debug_options))
        return false;
    }

    boolean this_present_replication_count = true && this.is_set_replication_count();
    boolean that_present_replication_count = true && that.is_set_replication_count();
    if (this_present_replication_count || that_present_replication_count) {
      if (!(this_present_replication_count && that_present_replication_count))
        return false;
      if (this.replication_count != that.replication_count)
        return false;
    }

    boolean this_present_workers = true && this.is_set_workers();
    boolean that_present_workers = true && that.is_set_workers();
    if (this_present_workers || that_present_workers) {
      if (!(this_present_workers && that_present_workers))
        return false;
      if (!this.workers.equals(that.workers))
        return false;
    }

    boolean this_present_storm_version = true && this.is_set_storm_version();
    boolean that_present_storm_version = true && that.is_set_storm_version();
    if (this_present_storm_version || that_present_storm_version) {
      if (!(this_present_storm_version && that_present_storm_version))
        return false;
      if (!this.storm_version.equals(that.storm_version))
        return false;
    }

    boolean this_present_topology_version = true && this.is_set_topology_version();
    boolean that_present_topology_version = true && that.is_set_topology_version();
    if (this_present_topology_version || that_present_topology_version) {
      if (!(this_present_topology_version && that_present_topology_version))
        return false;
      if (!this.topology_version.equals(that.topology_version))
        return false;
    }

    boolean this_present_requested_memonheap = true && this.is_set_requested_memonheap();
    boolean that_present_requested_memonheap = true && that.is_set_requested_memonheap();
    if (this_present_requested_memonheap || that_present_requested_memonheap) {
      if (!(this_present_requested_memonheap && that_present_requested_memonheap))
        return false;
      if (this.requested_memonheap != that.requested_memonheap)
        return false;
    }

    boolean this_present_requested_memoffheap = true && this.is_set_requested_memoffheap();
    boolean that_present_requested_memoffheap = true && that.is_set_requested_memoffheap();
    if (this_present_requested_memoffheap || that_present_requested_memoffheap) {
      if (!(this_present_requested_memoffheap && that_present_requested_memoffheap))
        return false;
      if (this.requested_memoffheap != that.requested_memoffheap)
        return false;
    }

    boolean this_present_requested_cpu = true && this.is_set_requested_cpu();
    boolean that_present_requested_cpu = true && that.is_set_requested_cpu();
    if (this_present_requested_cpu || that_present_requested_cpu) {
      if (!(this_present_requested_cpu && that_present_requested_cpu))
        return false;
      if (this.requested_cpu != that.requested_cpu)
        return false;
    }

    boolean this_present_assigned_memonheap = true && this.is_set_assigned_memonheap();
    boolean that_present_assigned_memonheap = true && that.is_set_assigned_memonheap();
    if (this_present_assigned_memonheap || that_present_assigned_memonheap) {
      if (!(this_present_assigned_memonheap && that_present_assigned_memonheap))
        return false;
      if (this.assigned_memonheap != that.assigned_memonheap)
        return false;
    }

    boolean this_present_assigned_memoffheap = true && this.is_set_assigned_memoffheap();
    boolean that_present_assigned_memoffheap = true && that.is_set_assigned_memoffheap();
    if (this_present_assigned_memoffheap || that_present_assigned_memoffheap) {
      if (!(this_present_assigned_memoffheap && that_present_assigned_memoffheap))
        return false;
      if (this.assigned_memoffheap != that.assigned_memoffheap)
        return false;
    }

    boolean this_present_assigned_cpu = true && this.is_set_assigned_cpu();
    boolean that_present_assigned_cpu = true && that.is_set_assigned_cpu();
    if (this_present_assigned_cpu || that_present_assigned_cpu) {
      if (!(this_present_assigned_cpu && that_present_assigned_cpu))
        return false;
      if (this.assigned_cpu != that.assigned_cpu)
        return false;
    }

    boolean this_present_requested_regular_on_heap_memory = true && this.is_set_requested_regular_on_heap_memory();
    boolean that_present_requested_regular_on_heap_memory = true && that.is_set_requested_regular_on_heap_memory();
    if (this_present_requested_regular_on_heap_memory || that_present_requested_regular_on_heap_memory) {
      if (!(this_present_requested_regular_on_heap_memory && that_present_requested_regular_on_heap_memory))
        return false;
      if (this.requested_regular_on_heap_memory != that.requested_regular_on_heap_memory)
        return false;
    }

    boolean this_present_requested_shared_on_heap_memory = true && this.is_set_requested_shared_on_heap_memory();
    boolean that_present_requested_shared_on_heap_memory = true && that.is_set_requested_shared_on_heap_memory();
    if (this_present_requested_shared_on_heap_memory || that_present_requested_shared_on_heap_memory) {
      if (!(this_present_requested_shared_on_heap_memory && that_present_requested_shared_on_heap_memory))
        return false;
      if (this.requested_shared_on_heap_memory != that.requested_shared_on_heap_memory)
        return false;
    }

    boolean this_present_requested_regular_off_heap_memory = true && this.is_set_requested_regular_off_heap_memory();
    boolean that_present_requested_regular_off_heap_memory = true && that.is_set_requested_regular_off_heap_memory();
    if (this_present_requested_regular_off_heap_memory || that_present_requested_regular_off_heap_memory) {
      if (!(this_present_requested_regular_off_heap_memory && that_present_requested_regular_off_heap_memory))
        return false;
      if (this.requested_regular_off_heap_memory != that.requested_regular_off_heap_memory)
        return false;
    }

    boolean this_present_requested_shared_off_heap_memory = true && this.is_set_requested_shared_off_heap_memory();
    boolean that_present_requested_shared_off_heap_memory = true && that.is_set_requested_shared_off_heap_memory();
    if (this_present_requested_shared_off_heap_memory || that_present_requested_shared_off_heap_memory) {
      if (!(this_present_requested_shared_off_heap_memory && that_present_requested_shared_off_heap_memory))
        return false;
      if (this.requested_shared_off_heap_memory != that.requested_shared_off_heap_memory)
        return false;
    }

    boolean this_present_assigned_regular_on_heap_memory = true && this.is_set_assigned_regular_on_heap_memory();
    boolean that_present_assigned_regular_on_heap_memory = true && that.is_set_assigned_regular_on_heap_memory();
    if (this_present_assigned_regular_on_heap_memory || that_present_assigned_regular_on_heap_memory) {
      if (!(this_present_assigned_regular_on_heap_memory && that_present_assigned_regular_on_heap_memory))
        return false;
      if (this.assigned_regular_on_heap_memory != that.assigned_regular_on_heap_memory)
        return false;
    }

    boolean this_present_assigned_shared_on_heap_memory = true && this.is_set_assigned_shared_on_heap_memory();
    boolean that_present_assigned_shared_on_heap_memory = true && that.is_set_assigned_shared_on_heap_memory();
    if (this_present_assigned_shared_on_heap_memory || that_present_assigned_shared_on_heap_memory) {
      if (!(this_present_assigned_shared_on_heap_memory && that_present_assigned_shared_on_heap_memory))
        return false;
      if (this.assigned_shared_on_heap_memory != that.assigned_shared_on_heap_memory)
        return false;
    }

    boolean this_present_assigned_regular_off_heap_memory = true && this.is_set_assigned_regular_off_heap_memory();
    boolean that_present_assigned_regular_off_heap_memory = true && that.is_set_assigned_regular_off_heap_memory();
    if (this_present_assigned_regular_off_heap_memory || that_present_assigned_regular_off_heap_memory) {
      if (!(this_present_assigned_regular_off_heap_memory && that_present_assigned_regular_off_heap_memory))
        return false;
      if (this.assigned_regular_off_heap_memory != that.assigned_regular_off_heap_memory)
        return false;
    }

    boolean this_present_assigned_shared_off_heap_memory = true && this.is_set_assigned_shared_off_heap_memory();
    boolean that_present_assigned_shared_off_heap_memory = true && that.is_set_assigned_shared_off_heap_memory();
    if (this_present_assigned_shared_off_heap_memory || that_present_assigned_shared_off_heap_memory) {
      if (!(this_present_assigned_shared_off_heap_memory && that_present_assigned_shared_off_heap_memory))
        return false;
      if (this.assigned_shared_off_heap_memory != that.assigned_shared_off_heap_memory)
        return false;
    }

    return true;
  }

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

    hashCode = hashCode * 8191 + ((is_set_id()) ? 131071 : 524287);
    if (is_set_id())
      hashCode = hashCode * 8191 + id.hashCode();

    hashCode = hashCode * 8191 + ((is_set_name()) ? 131071 : 524287);
    if (is_set_name())
      hashCode = hashCode * 8191 + name.hashCode();

    hashCode = hashCode * 8191 + ((is_set_uptime_secs()) ? 131071 : 524287);
    if (is_set_uptime_secs())
      hashCode = hashCode * 8191 + uptime_secs;

    hashCode = hashCode * 8191 + ((is_set_status()) ? 131071 : 524287);
    if (is_set_status())
      hashCode = hashCode * 8191 + status.hashCode();

    hashCode = hashCode * 8191 + ((is_set_num_tasks()) ? 131071 : 524287);
    if (is_set_num_tasks())
      hashCode = hashCode * 8191 + num_tasks;

    hashCode = hashCode * 8191 + ((is_set_num_workers()) ? 131071 : 524287);
    if (is_set_num_workers())
      hashCode = hashCode * 8191 + num_workers;

    hashCode = hashCode * 8191 + ((is_set_num_executors()) ? 131071 : 524287);
    if (is_set_num_executors())
      hashCode = hashCode * 8191 + num_executors;

    hashCode = hashCode * 8191 + ((is_set_topology_conf()) ? 131071 : 524287);
    if (is_set_topology_conf())
      hashCode = hashCode * 8191 + topology_conf.hashCode();

    hashCode = hashCode * 8191 + ((is_set_id_to_spout_agg_stats()) ? 131071 : 524287);
    if (is_set_id_to_spout_agg_stats())
      hashCode = hashCode * 8191 + id_to_spout_agg_stats.hashCode();

    hashCode = hashCode * 8191 + ((is_set_id_to_bolt_agg_stats()) ? 131071 : 524287);
    if (is_set_id_to_bolt_agg_stats())
      hashCode = hashCode * 8191 + id_to_bolt_agg_stats.hashCode();

    hashCode = hashCode * 8191 + ((is_set_sched_status()) ? 131071 : 524287);
    if (is_set_sched_status())
      hashCode = hashCode * 8191 + sched_status.hashCode();

    hashCode = hashCode * 8191 + ((is_set_topology_stats()) ? 131071 : 524287);
    if (is_set_topology_stats())
      hashCode = hashCode * 8191 + topology_stats.hashCode();

    hashCode = hashCode * 8191 + ((is_set_owner()) ? 131071 : 524287);
    if (is_set_owner())
      hashCode = hashCode * 8191 + owner.hashCode();

    hashCode = hashCode * 8191 + ((is_set_debug_options()) ? 131071 : 524287);
    if (is_set_debug_options())
      hashCode = hashCode * 8191 + debug_options.hashCode();

    hashCode = hashCode * 8191 + ((is_set_replication_count()) ? 131071 : 524287);
    if (is_set_replication_count())
      hashCode = hashCode * 8191 + replication_count;

    hashCode = hashCode * 8191 + ((is_set_workers()) ? 131071 : 524287);
    if (is_set_workers())
      hashCode = hashCode * 8191 + workers.hashCode();

    hashCode = hashCode * 8191 + ((is_set_storm_version()) ? 131071 : 524287);
    if (is_set_storm_version())
      hashCode = hashCode * 8191 + storm_version.hashCode();

    hashCode = hashCode * 8191 + ((is_set_topology_version()) ? 131071 : 524287);
    if (is_set_topology_version())
      hashCode = hashCode * 8191 + topology_version.hashCode();

    hashCode = hashCode * 8191 + ((is_set_requested_memonheap()) ? 131071 : 524287);
    if (is_set_requested_memonheap())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_memonheap);

    hashCode = hashCode * 8191 + ((is_set_requested_memoffheap()) ? 131071 : 524287);
    if (is_set_requested_memoffheap())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_memoffheap);

    hashCode = hashCode * 8191 + ((is_set_requested_cpu()) ? 131071 : 524287);
    if (is_set_requested_cpu())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_cpu);

    hashCode = hashCode * 8191 + ((is_set_assigned_memonheap()) ? 131071 : 524287);
    if (is_set_assigned_memonheap())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_memonheap);

    hashCode = hashCode * 8191 + ((is_set_assigned_memoffheap()) ? 131071 : 524287);
    if (is_set_assigned_memoffheap())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_memoffheap);

    hashCode = hashCode * 8191 + ((is_set_assigned_cpu()) ? 131071 : 524287);
    if (is_set_assigned_cpu())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_cpu);

    hashCode = hashCode * 8191 + ((is_set_requested_regular_on_heap_memory()) ? 131071 : 524287);
    if (is_set_requested_regular_on_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_regular_on_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_requested_shared_on_heap_memory()) ? 131071 : 524287);
    if (is_set_requested_shared_on_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_shared_on_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_requested_regular_off_heap_memory()) ? 131071 : 524287);
    if (is_set_requested_regular_off_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_regular_off_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_requested_shared_off_heap_memory()) ? 131071 : 524287);
    if (is_set_requested_shared_off_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(requested_shared_off_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_assigned_regular_on_heap_memory()) ? 131071 : 524287);
    if (is_set_assigned_regular_on_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_regular_on_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_assigned_shared_on_heap_memory()) ? 131071 : 524287);
    if (is_set_assigned_shared_on_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_shared_on_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_assigned_regular_off_heap_memory()) ? 131071 : 524287);
    if (is_set_assigned_regular_off_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_regular_off_heap_memory);

    hashCode = hashCode * 8191 + ((is_set_assigned_shared_off_heap_memory()) ? 131071 : 524287);
    if (is_set_assigned_shared_off_heap_memory())
      hashCode = hashCode * 8191 + org.apache.storm.thrift.TBaseHelper.hashCode(assigned_shared_off_heap_memory);

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.valueOf(is_set_id()).compareTo(other.is_set_id());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_id()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.id, other.id);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_name()).compareTo(other.is_set_name());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_name()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.name, other.name);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_uptime_secs()).compareTo(other.is_set_uptime_secs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_uptime_secs()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.uptime_secs, other.uptime_secs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_status()).compareTo(other.is_set_status());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_status()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.status, other.status);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_num_tasks()).compareTo(other.is_set_num_tasks());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_num_tasks()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.num_tasks, other.num_tasks);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_num_workers()).compareTo(other.is_set_num_workers());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_num_workers()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.num_workers, other.num_workers);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_num_executors()).compareTo(other.is_set_num_executors());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_num_executors()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.num_executors, other.num_executors);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_topology_conf()).compareTo(other.is_set_topology_conf());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_topology_conf()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.topology_conf, other.topology_conf);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_id_to_spout_agg_stats()).compareTo(other.is_set_id_to_spout_agg_stats());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_id_to_spout_agg_stats()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.id_to_spout_agg_stats, other.id_to_spout_agg_stats);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_id_to_bolt_agg_stats()).compareTo(other.is_set_id_to_bolt_agg_stats());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_id_to_bolt_agg_stats()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.id_to_bolt_agg_stats, other.id_to_bolt_agg_stats);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_sched_status()).compareTo(other.is_set_sched_status());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_sched_status()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.sched_status, other.sched_status);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_topology_stats()).compareTo(other.is_set_topology_stats());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_topology_stats()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.topology_stats, other.topology_stats);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_owner()).compareTo(other.is_set_owner());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_owner()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.owner, other.owner);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_debug_options()).compareTo(other.is_set_debug_options());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_debug_options()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.debug_options, other.debug_options);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_replication_count()).compareTo(other.is_set_replication_count());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_replication_count()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.replication_count, other.replication_count);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_workers()).compareTo(other.is_set_workers());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_workers()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.workers, other.workers);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_storm_version()).compareTo(other.is_set_storm_version());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_storm_version()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.storm_version, other.storm_version);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_topology_version()).compareTo(other.is_set_topology_version());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_topology_version()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.topology_version, other.topology_version);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_memonheap()).compareTo(other.is_set_requested_memonheap());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_memonheap()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_memonheap, other.requested_memonheap);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_memoffheap()).compareTo(other.is_set_requested_memoffheap());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_memoffheap()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_memoffheap, other.requested_memoffheap);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_cpu()).compareTo(other.is_set_requested_cpu());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_cpu()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_cpu, other.requested_cpu);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_memonheap()).compareTo(other.is_set_assigned_memonheap());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_memonheap()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_memonheap, other.assigned_memonheap);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_memoffheap()).compareTo(other.is_set_assigned_memoffheap());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_memoffheap()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_memoffheap, other.assigned_memoffheap);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_cpu()).compareTo(other.is_set_assigned_cpu());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_cpu()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_cpu, other.assigned_cpu);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_regular_on_heap_memory()).compareTo(other.is_set_requested_regular_on_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_regular_on_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_regular_on_heap_memory, other.requested_regular_on_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_shared_on_heap_memory()).compareTo(other.is_set_requested_shared_on_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_shared_on_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_shared_on_heap_memory, other.requested_shared_on_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_regular_off_heap_memory()).compareTo(other.is_set_requested_regular_off_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_regular_off_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_regular_off_heap_memory, other.requested_regular_off_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_requested_shared_off_heap_memory()).compareTo(other.is_set_requested_shared_off_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_requested_shared_off_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.requested_shared_off_heap_memory, other.requested_shared_off_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_regular_on_heap_memory()).compareTo(other.is_set_assigned_regular_on_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_regular_on_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_regular_on_heap_memory, other.assigned_regular_on_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_shared_on_heap_memory()).compareTo(other.is_set_assigned_shared_on_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_shared_on_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_shared_on_heap_memory, other.assigned_shared_on_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_regular_off_heap_memory()).compareTo(other.is_set_assigned_regular_off_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_regular_off_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_regular_off_heap_memory, other.assigned_regular_off_heap_memory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(is_set_assigned_shared_off_heap_memory()).compareTo(other.is_set_assigned_shared_off_heap_memory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_assigned_shared_off_heap_memory()) {
      lastComparison = org.apache.storm.thrift.TBaseHelper.compareTo(this.assigned_shared_off_heap_memory, other.assigned_shared_off_heap_memory);
      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("TopologyPageInfo(");
    boolean first = true;

    sb.append("id:");
    if (this.id == null) {
      sb.append("null");
    } else {
      sb.append(this.id);
    }
    first = false;
    if (is_set_name()) {
      if (!first) sb.append(", ");
      sb.append("name:");
      if (this.name == null) {
        sb.append("null");
      } else {
        sb.append(this.name);
      }
      first = false;
    }
    if (is_set_uptime_secs()) {
      if (!first) sb.append(", ");
      sb.append("uptime_secs:");
      sb.append(this.uptime_secs);
      first = false;
    }
    if (is_set_status()) {
      if (!first) sb.append(", ");
      sb.append("status:");
      if (this.status == null) {
        sb.append("null");
      } else {
        sb.append(this.status);
      }
      first = false;
    }
    if (is_set_num_tasks()) {
      if (!first) sb.append(", ");
      sb.append("num_tasks:");
      sb.append(this.num_tasks);
      first = false;
    }
    if (is_set_num_workers()) {
      if (!first) sb.append(", ");
      sb.append("num_workers:");
      sb.append(this.num_workers);
      first = false;
    }
    if (is_set_num_executors()) {
      if (!first) sb.append(", ");
      sb.append("num_executors:");
      sb.append(this.num_executors);
      first = false;
    }
    if (is_set_topology_conf()) {
      if (!first) sb.append(", ");
      sb.append("topology_conf:");
      if (this.topology_conf == null) {
        sb.append("null");
      } else {
        sb.append(this.topology_conf);
      }
      first = false;
    }
    if (is_set_id_to_spout_agg_stats()) {
      if (!first) sb.append(", ");
      sb.append("id_to_spout_agg_stats:");
      if (this.id_to_spout_agg_stats == null) {
        sb.append("null");
      } else {
        sb.append(this.id_to_spout_agg_stats);
      }
      first = false;
    }
    if (is_set_id_to_bolt_agg_stats()) {
      if (!first) sb.append(", ");
      sb.append("id_to_bolt_agg_stats:");
      if (this.id_to_bolt_agg_stats == null) {
        sb.append("null");
      } else {
        sb.append(this.id_to_bolt_agg_stats);
      }
      first = false;
    }
    if (is_set_sched_status()) {
      if (!first) sb.append(", ");
      sb.append("sched_status:");
      if (this.sched_status == null) {
        sb.append("null");
      } else {
        sb.append(this.sched_status);
      }
      first = false;
    }
    if (is_set_topology_stats()) {
      if (!first) sb.append(", ");
      sb.append("topology_stats:");
      if (this.topology_stats == null) {
        sb.append("null");
      } else {
        sb.append(this.topology_stats);
      }
      first = false;
    }
    if (is_set_owner()) {
      if (!first) sb.append(", ");
      sb.append("owner:");
      if (this.owner == null) {
        sb.append("null");
      } else {
        sb.append(this.owner);
      }
      first = false;
    }
    if (is_set_debug_options()) {
      if (!first) sb.append(", ");
      sb.append("debug_options:");
      if (this.debug_options == null) {
        sb.append("null");
      } else {
        sb.append(this.debug_options);
      }
      first = false;
    }
    if (is_set_replication_count()) {
      if (!first) sb.append(", ");
      sb.append("replication_count:");
      sb.append(this.replication_count);
      first = false;
    }
    if (is_set_workers()) {
      if (!first) sb.append(", ");
      sb.append("workers:");
      if (this.workers == null) {
        sb.append("null");
      } else {
        sb.append(this.workers);
      }
      first = false;
    }
    if (is_set_storm_version()) {
      if (!first) sb.append(", ");
      sb.append("storm_version:");
      if (this.storm_version == null) {
        sb.append("null");
      } else {
        sb.append(this.storm_version);
      }
      first = false;
    }
    if (is_set_topology_version()) {
      if (!first) sb.append(", ");
      sb.append("topology_version:");
      if (this.topology_version == null) {
        sb.append("null");
      } else {
        sb.append(this.topology_version);
      }
      first = false;
    }
    if (is_set_requested_memonheap()) {
      if (!first) sb.append(", ");
      sb.append("requested_memonheap:");
      sb.append(this.requested_memonheap);
      first = false;
    }
    if (is_set_requested_memoffheap()) {
      if (!first) sb.append(", ");
      sb.append("requested_memoffheap:");
      sb.append(this.requested_memoffheap);
      first = false;
    }
    if (is_set_requested_cpu()) {
      if (!first) sb.append(", ");
      sb.append("requested_cpu:");
      sb.append(this.requested_cpu);
      first = false;
    }
    if (is_set_assigned_memonheap()) {
      if (!first) sb.append(", ");
      sb.append("assigned_memonheap:");
      sb.append(this.assigned_memonheap);
      first = false;
    }
    if (is_set_assigned_memoffheap()) {
      if (!first) sb.append(", ");
      sb.append("assigned_memoffheap:");
      sb.append(this.assigned_memoffheap);
      first = false;
    }
    if (is_set_assigned_cpu()) {
      if (!first) sb.append(", ");
      sb.append("assigned_cpu:");
      sb.append(this.assigned_cpu);
      first = false;
    }
    if (is_set_requested_regular_on_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("requested_regular_on_heap_memory:");
      sb.append(this.requested_regular_on_heap_memory);
      first = false;
    }
    if (is_set_requested_shared_on_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("requested_shared_on_heap_memory:");
      sb.append(this.requested_shared_on_heap_memory);
      first = false;
    }
    if (is_set_requested_regular_off_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("requested_regular_off_heap_memory:");
      sb.append(this.requested_regular_off_heap_memory);
      first = false;
    }
    if (is_set_requested_shared_off_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("requested_shared_off_heap_memory:");
      sb.append(this.requested_shared_off_heap_memory);
      first = false;
    }
    if (is_set_assigned_regular_on_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("assigned_regular_on_heap_memory:");
      sb.append(this.assigned_regular_on_heap_memory);
      first = false;
    }
    if (is_set_assigned_shared_on_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("assigned_shared_on_heap_memory:");
      sb.append(this.assigned_shared_on_heap_memory);
      first = false;
    }
    if (is_set_assigned_regular_off_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("assigned_regular_off_heap_memory:");
      sb.append(this.assigned_regular_off_heap_memory);
      first = false;
    }
    if (is_set_assigned_shared_off_heap_memory()) {
      if (!first) sb.append(", ");
      sb.append("assigned_shared_off_heap_memory:");
      sb.append(this.assigned_shared_off_heap_memory);
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

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

    // check for sub-struct validity
    if (topology_stats != null) {
      topology_stats.validate();
    }
    if (debug_options != null) {
      debug_options.validate();
    }
  }

  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 TopologyPageInfoStandardSchemeFactory implements org.apache.storm.thrift.scheme.SchemeFactory {
    public TopologyPageInfoStandardScheme getScheme() {
      return new TopologyPageInfoStandardScheme();
    }
  }

  private static class TopologyPageInfoStandardScheme extends org.apache.storm.thrift.scheme.StandardScheme<TopologyPageInfo> {

    public void read(org.apache.storm.thrift.protocol.TProtocol iprot, TopologyPageInfo 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: // ID
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.id = iprot.readString();
              struct.set_id_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // NAME
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.name = iprot.readString();
              struct.set_name_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // UPTIME_SECS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I32) {
              struct.uptime_secs = iprot.readI32();
              struct.set_uptime_secs_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // STATUS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.status = iprot.readString();
              struct.set_status_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // NUM_TASKS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I32) {
              struct.num_tasks = iprot.readI32();
              struct.set_num_tasks_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // NUM_WORKERS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I32) {
              struct.num_workers = iprot.readI32();
              struct.set_num_workers_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // NUM_EXECUTORS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I32) {
              struct.num_executors = iprot.readI32();
              struct.set_num_executors_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // TOPOLOGY_CONF
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.topology_conf = iprot.readString();
              struct.set_topology_conf_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // ID_TO_SPOUT_AGG_STATS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.MAP) {
              {
                org.apache.storm.thrift.protocol.TMap _map482 = iprot.readMapBegin();
                struct.id_to_spout_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(2*_map482.size);
                @org.apache.storm.thrift.annotation.Nullable java.lang.String _key483;
                @org.apache.storm.thrift.annotation.Nullable ComponentAggregateStats _val484;
                for (int _i485 = 0; _i485 < _map482.size; ++_i485)
                {
                  _key483 = iprot.readString();
                  _val484 = new ComponentAggregateStats();
                  _val484.read(iprot);
                  struct.id_to_spout_agg_stats.put(_key483, _val484);
                }
                iprot.readMapEnd();
              }
              struct.set_id_to_spout_agg_stats_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // ID_TO_BOLT_AGG_STATS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.MAP) {
              {
                org.apache.storm.thrift.protocol.TMap _map486 = iprot.readMapBegin();
                struct.id_to_bolt_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(2*_map486.size);
                @org.apache.storm.thrift.annotation.Nullable java.lang.String _key487;
                @org.apache.storm.thrift.annotation.Nullable ComponentAggregateStats _val488;
                for (int _i489 = 0; _i489 < _map486.size; ++_i489)
                {
                  _key487 = iprot.readString();
                  _val488 = new ComponentAggregateStats();
                  _val488.read(iprot);
                  struct.id_to_bolt_agg_stats.put(_key487, _val488);
                }
                iprot.readMapEnd();
              }
              struct.set_id_to_bolt_agg_stats_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // SCHED_STATUS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.sched_status = iprot.readString();
              struct.set_sched_status_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // TOPOLOGY_STATS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRUCT) {
              struct.topology_stats = new TopologyStats();
              struct.topology_stats.read(iprot);
              struct.set_topology_stats_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // OWNER
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.owner = iprot.readString();
              struct.set_owner_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // DEBUG_OPTIONS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRUCT) {
              struct.debug_options = new DebugOptions();
              struct.debug_options.read(iprot);
              struct.set_debug_options_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // REPLICATION_COUNT
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.I32) {
              struct.replication_count = iprot.readI32();
              struct.set_replication_count_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // WORKERS
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.LIST) {
              {
                org.apache.storm.thrift.protocol.TList _list490 = iprot.readListBegin();
                struct.workers = new java.util.ArrayList<WorkerSummary>(_list490.size);
                @org.apache.storm.thrift.annotation.Nullable WorkerSummary _elem491;
                for (int _i492 = 0; _i492 < _list490.size; ++_i492)
                {
                  _elem491 = new WorkerSummary();
                  _elem491.read(iprot);
                  struct.workers.add(_elem491);
                }
                iprot.readListEnd();
              }
              struct.set_workers_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 17: // STORM_VERSION
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.storm_version = iprot.readString();
              struct.set_storm_version_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // TOPOLOGY_VERSION
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.STRING) {
              struct.topology_version = iprot.readString();
              struct.set_topology_version_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 521: // REQUESTED_MEMONHEAP
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_memonheap = iprot.readDouble();
              struct.set_requested_memonheap_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 522: // REQUESTED_MEMOFFHEAP
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_memoffheap = iprot.readDouble();
              struct.set_requested_memoffheap_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 523: // REQUESTED_CPU
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_cpu = iprot.readDouble();
              struct.set_requested_cpu_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 524: // ASSIGNED_MEMONHEAP
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_memonheap = iprot.readDouble();
              struct.set_assigned_memonheap_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 525: // ASSIGNED_MEMOFFHEAP
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_memoffheap = iprot.readDouble();
              struct.set_assigned_memoffheap_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 526: // ASSIGNED_CPU
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_cpu = iprot.readDouble();
              struct.set_assigned_cpu_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 527: // REQUESTED_REGULAR_ON_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_regular_on_heap_memory = iprot.readDouble();
              struct.set_requested_regular_on_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 528: // REQUESTED_SHARED_ON_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_shared_on_heap_memory = iprot.readDouble();
              struct.set_requested_shared_on_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 529: // REQUESTED_REGULAR_OFF_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_regular_off_heap_memory = iprot.readDouble();
              struct.set_requested_regular_off_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 530: // REQUESTED_SHARED_OFF_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.requested_shared_off_heap_memory = iprot.readDouble();
              struct.set_requested_shared_off_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 531: // ASSIGNED_REGULAR_ON_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_regular_on_heap_memory = iprot.readDouble();
              struct.set_assigned_regular_on_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 532: // ASSIGNED_SHARED_ON_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_shared_on_heap_memory = iprot.readDouble();
              struct.set_assigned_shared_on_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 533: // ASSIGNED_REGULAR_OFF_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_regular_off_heap_memory = iprot.readDouble();
              struct.set_assigned_regular_off_heap_memory_isSet(true);
            } else { 
              org.apache.storm.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 534: // ASSIGNED_SHARED_OFF_HEAP_MEMORY
            if (schemeField.type == org.apache.storm.thrift.protocol.TType.DOUBLE) {
              struct.assigned_shared_off_heap_memory = iprot.readDouble();
              struct.set_assigned_shared_off_heap_memory_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, TopologyPageInfo struct) throws org.apache.storm.thrift.TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.id != null) {
        oprot.writeFieldBegin(ID_FIELD_DESC);
        oprot.writeString(struct.id);
        oprot.writeFieldEnd();
      }
      if (struct.name != null) {
        if (struct.is_set_name()) {
          oprot.writeFieldBegin(NAME_FIELD_DESC);
          oprot.writeString(struct.name);
          oprot.writeFieldEnd();
        }
      }
      if (struct.is_set_uptime_secs()) {
        oprot.writeFieldBegin(UPTIME_SECS_FIELD_DESC);
        oprot.writeI32(struct.uptime_secs);
        oprot.writeFieldEnd();
      }
      if (struct.status != null) {
        if (struct.is_set_status()) {
          oprot.writeFieldBegin(STATUS_FIELD_DESC);
          oprot.writeString(struct.status);
          oprot.writeFieldEnd();
        }
      }
      if (struct.is_set_num_tasks()) {
        oprot.writeFieldBegin(NUM_TASKS_FIELD_DESC);
        oprot.writeI32(struct.num_tasks);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_num_workers()) {
        oprot.writeFieldBegin(NUM_WORKERS_FIELD_DESC);
        oprot.writeI32(struct.num_workers);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_num_executors()) {
        oprot.writeFieldBegin(NUM_EXECUTORS_FIELD_DESC);
        oprot.writeI32(struct.num_executors);
        oprot.writeFieldEnd();
      }
      if (struct.topology_conf != null) {
        if (struct.is_set_topology_conf()) {
          oprot.writeFieldBegin(TOPOLOGY_CONF_FIELD_DESC);
          oprot.writeString(struct.topology_conf);
          oprot.writeFieldEnd();
        }
      }
      if (struct.id_to_spout_agg_stats != null) {
        if (struct.is_set_id_to_spout_agg_stats()) {
          oprot.writeFieldBegin(ID_TO_SPOUT_AGG_STATS_FIELD_DESC);
          {
            oprot.writeMapBegin(new org.apache.storm.thrift.protocol.TMap(org.apache.storm.thrift.protocol.TType.STRING, org.apache.storm.thrift.protocol.TType.STRUCT, struct.id_to_spout_agg_stats.size()));
            for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> _iter493 : struct.id_to_spout_agg_stats.entrySet())
            {
              oprot.writeString(_iter493.getKey());
              _iter493.getValue().write(oprot);
            }
            oprot.writeMapEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.id_to_bolt_agg_stats != null) {
        if (struct.is_set_id_to_bolt_agg_stats()) {
          oprot.writeFieldBegin(ID_TO_BOLT_AGG_STATS_FIELD_DESC);
          {
            oprot.writeMapBegin(new org.apache.storm.thrift.protocol.TMap(org.apache.storm.thrift.protocol.TType.STRING, org.apache.storm.thrift.protocol.TType.STRUCT, struct.id_to_bolt_agg_stats.size()));
            for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> _iter494 : struct.id_to_bolt_agg_stats.entrySet())
            {
              oprot.writeString(_iter494.getKey());
              _iter494.getValue().write(oprot);
            }
            oprot.writeMapEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.sched_status != null) {
        if (struct.is_set_sched_status()) {
          oprot.writeFieldBegin(SCHED_STATUS_FIELD_DESC);
          oprot.writeString(struct.sched_status);
          oprot.writeFieldEnd();
        }
      }
      if (struct.topology_stats != null) {
        if (struct.is_set_topology_stats()) {
          oprot.writeFieldBegin(TOPOLOGY_STATS_FIELD_DESC);
          struct.topology_stats.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.owner != null) {
        if (struct.is_set_owner()) {
          oprot.writeFieldBegin(OWNER_FIELD_DESC);
          oprot.writeString(struct.owner);
          oprot.writeFieldEnd();
        }
      }
      if (struct.debug_options != null) {
        if (struct.is_set_debug_options()) {
          oprot.writeFieldBegin(DEBUG_OPTIONS_FIELD_DESC);
          struct.debug_options.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.is_set_replication_count()) {
        oprot.writeFieldBegin(REPLICATION_COUNT_FIELD_DESC);
        oprot.writeI32(struct.replication_count);
        oprot.writeFieldEnd();
      }
      if (struct.workers != null) {
        if (struct.is_set_workers()) {
          oprot.writeFieldBegin(WORKERS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.storm.thrift.protocol.TList(org.apache.storm.thrift.protocol.TType.STRUCT, struct.workers.size()));
            for (WorkerSummary _iter495 : struct.workers)
            {
              _iter495.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.storm_version != null) {
        if (struct.is_set_storm_version()) {
          oprot.writeFieldBegin(STORM_VERSION_FIELD_DESC);
          oprot.writeString(struct.storm_version);
          oprot.writeFieldEnd();
        }
      }
      if (struct.topology_version != null) {
        if (struct.is_set_topology_version()) {
          oprot.writeFieldBegin(TOPOLOGY_VERSION_FIELD_DESC);
          oprot.writeString(struct.topology_version);
          oprot.writeFieldEnd();
        }
      }
      if (struct.is_set_requested_memonheap()) {
        oprot.writeFieldBegin(REQUESTED_MEMONHEAP_FIELD_DESC);
        oprot.writeDouble(struct.requested_memonheap);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_memoffheap()) {
        oprot.writeFieldBegin(REQUESTED_MEMOFFHEAP_FIELD_DESC);
        oprot.writeDouble(struct.requested_memoffheap);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_cpu()) {
        oprot.writeFieldBegin(REQUESTED_CPU_FIELD_DESC);
        oprot.writeDouble(struct.requested_cpu);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_memonheap()) {
        oprot.writeFieldBegin(ASSIGNED_MEMONHEAP_FIELD_DESC);
        oprot.writeDouble(struct.assigned_memonheap);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_memoffheap()) {
        oprot.writeFieldBegin(ASSIGNED_MEMOFFHEAP_FIELD_DESC);
        oprot.writeDouble(struct.assigned_memoffheap);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_cpu()) {
        oprot.writeFieldBegin(ASSIGNED_CPU_FIELD_DESC);
        oprot.writeDouble(struct.assigned_cpu);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_regular_on_heap_memory()) {
        oprot.writeFieldBegin(REQUESTED_REGULAR_ON_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.requested_regular_on_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_shared_on_heap_memory()) {
        oprot.writeFieldBegin(REQUESTED_SHARED_ON_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.requested_shared_on_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_regular_off_heap_memory()) {
        oprot.writeFieldBegin(REQUESTED_REGULAR_OFF_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.requested_regular_off_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_requested_shared_off_heap_memory()) {
        oprot.writeFieldBegin(REQUESTED_SHARED_OFF_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.requested_shared_off_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_regular_on_heap_memory()) {
        oprot.writeFieldBegin(ASSIGNED_REGULAR_ON_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.assigned_regular_on_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_shared_on_heap_memory()) {
        oprot.writeFieldBegin(ASSIGNED_SHARED_ON_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.assigned_shared_on_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_regular_off_heap_memory()) {
        oprot.writeFieldBegin(ASSIGNED_REGULAR_OFF_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.assigned_regular_off_heap_memory);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_assigned_shared_off_heap_memory()) {
        oprot.writeFieldBegin(ASSIGNED_SHARED_OFF_HEAP_MEMORY_FIELD_DESC);
        oprot.writeDouble(struct.assigned_shared_off_heap_memory);
        oprot.writeFieldEnd();
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

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

  private static class TopologyPageInfoTupleScheme extends org.apache.storm.thrift.scheme.TupleScheme<TopologyPageInfo> {

    @Override
    public void write(org.apache.storm.thrift.protocol.TProtocol prot, TopologyPageInfo struct) throws org.apache.storm.thrift.TException {
      org.apache.storm.thrift.protocol.TTupleProtocol oprot = (org.apache.storm.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.id);
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.is_set_name()) {
        optionals.set(0);
      }
      if (struct.is_set_uptime_secs()) {
        optionals.set(1);
      }
      if (struct.is_set_status()) {
        optionals.set(2);
      }
      if (struct.is_set_num_tasks()) {
        optionals.set(3);
      }
      if (struct.is_set_num_workers()) {
        optionals.set(4);
      }
      if (struct.is_set_num_executors()) {
        optionals.set(5);
      }
      if (struct.is_set_topology_conf()) {
        optionals.set(6);
      }
      if (struct.is_set_id_to_spout_agg_stats()) {
        optionals.set(7);
      }
      if (struct.is_set_id_to_bolt_agg_stats()) {
        optionals.set(8);
      }
      if (struct.is_set_sched_status()) {
        optionals.set(9);
      }
      if (struct.is_set_topology_stats()) {
        optionals.set(10);
      }
      if (struct.is_set_owner()) {
        optionals.set(11);
      }
      if (struct.is_set_debug_options()) {
        optionals.set(12);
      }
      if (struct.is_set_replication_count()) {
        optionals.set(13);
      }
      if (struct.is_set_workers()) {
        optionals.set(14);
      }
      if (struct.is_set_storm_version()) {
        optionals.set(15);
      }
      if (struct.is_set_topology_version()) {
        optionals.set(16);
      }
      if (struct.is_set_requested_memonheap()) {
        optionals.set(17);
      }
      if (struct.is_set_requested_memoffheap()) {
        optionals.set(18);
      }
      if (struct.is_set_requested_cpu()) {
        optionals.set(19);
      }
      if (struct.is_set_assigned_memonheap()) {
        optionals.set(20);
      }
      if (struct.is_set_assigned_memoffheap()) {
        optionals.set(21);
      }
      if (struct.is_set_assigned_cpu()) {
        optionals.set(22);
      }
      if (struct.is_set_requested_regular_on_heap_memory()) {
        optionals.set(23);
      }
      if (struct.is_set_requested_shared_on_heap_memory()) {
        optionals.set(24);
      }
      if (struct.is_set_requested_regular_off_heap_memory()) {
        optionals.set(25);
      }
      if (struct.is_set_requested_shared_off_heap_memory()) {
        optionals.set(26);
      }
      if (struct.is_set_assigned_regular_on_heap_memory()) {
        optionals.set(27);
      }
      if (struct.is_set_assigned_shared_on_heap_memory()) {
        optionals.set(28);
      }
      if (struct.is_set_assigned_regular_off_heap_memory()) {
        optionals.set(29);
      }
      if (struct.is_set_assigned_shared_off_heap_memory()) {
        optionals.set(30);
      }
      oprot.writeBitSet(optionals, 31);
      if (struct.is_set_name()) {
        oprot.writeString(struct.name);
      }
      if (struct.is_set_uptime_secs()) {
        oprot.writeI32(struct.uptime_secs);
      }
      if (struct.is_set_status()) {
        oprot.writeString(struct.status);
      }
      if (struct.is_set_num_tasks()) {
        oprot.writeI32(struct.num_tasks);
      }
      if (struct.is_set_num_workers()) {
        oprot.writeI32(struct.num_workers);
      }
      if (struct.is_set_num_executors()) {
        oprot.writeI32(struct.num_executors);
      }
      if (struct.is_set_topology_conf()) {
        oprot.writeString(struct.topology_conf);
      }
      if (struct.is_set_id_to_spout_agg_stats()) {
        {
          oprot.writeI32(struct.id_to_spout_agg_stats.size());
          for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> _iter496 : struct.id_to_spout_agg_stats.entrySet())
          {
            oprot.writeString(_iter496.getKey());
            _iter496.getValue().write(oprot);
          }
        }
      }
      if (struct.is_set_id_to_bolt_agg_stats()) {
        {
          oprot.writeI32(struct.id_to_bolt_agg_stats.size());
          for (java.util.Map.Entry<java.lang.String, ComponentAggregateStats> _iter497 : struct.id_to_bolt_agg_stats.entrySet())
          {
            oprot.writeString(_iter497.getKey());
            _iter497.getValue().write(oprot);
          }
        }
      }
      if (struct.is_set_sched_status()) {
        oprot.writeString(struct.sched_status);
      }
      if (struct.is_set_topology_stats()) {
        struct.topology_stats.write(oprot);
      }
      if (struct.is_set_owner()) {
        oprot.writeString(struct.owner);
      }
      if (struct.is_set_debug_options()) {
        struct.debug_options.write(oprot);
      }
      if (struct.is_set_replication_count()) {
        oprot.writeI32(struct.replication_count);
      }
      if (struct.is_set_workers()) {
        {
          oprot.writeI32(struct.workers.size());
          for (WorkerSummary _iter498 : struct.workers)
          {
            _iter498.write(oprot);
          }
        }
      }
      if (struct.is_set_storm_version()) {
        oprot.writeString(struct.storm_version);
      }
      if (struct.is_set_topology_version()) {
        oprot.writeString(struct.topology_version);
      }
      if (struct.is_set_requested_memonheap()) {
        oprot.writeDouble(struct.requested_memonheap);
      }
      if (struct.is_set_requested_memoffheap()) {
        oprot.writeDouble(struct.requested_memoffheap);
      }
      if (struct.is_set_requested_cpu()) {
        oprot.writeDouble(struct.requested_cpu);
      }
      if (struct.is_set_assigned_memonheap()) {
        oprot.writeDouble(struct.assigned_memonheap);
      }
      if (struct.is_set_assigned_memoffheap()) {
        oprot.writeDouble(struct.assigned_memoffheap);
      }
      if (struct.is_set_assigned_cpu()) {
        oprot.writeDouble(struct.assigned_cpu);
      }
      if (struct.is_set_requested_regular_on_heap_memory()) {
        oprot.writeDouble(struct.requested_regular_on_heap_memory);
      }
      if (struct.is_set_requested_shared_on_heap_memory()) {
        oprot.writeDouble(struct.requested_shared_on_heap_memory);
      }
      if (struct.is_set_requested_regular_off_heap_memory()) {
        oprot.writeDouble(struct.requested_regular_off_heap_memory);
      }
      if (struct.is_set_requested_shared_off_heap_memory()) {
        oprot.writeDouble(struct.requested_shared_off_heap_memory);
      }
      if (struct.is_set_assigned_regular_on_heap_memory()) {
        oprot.writeDouble(struct.assigned_regular_on_heap_memory);
      }
      if (struct.is_set_assigned_shared_on_heap_memory()) {
        oprot.writeDouble(struct.assigned_shared_on_heap_memory);
      }
      if (struct.is_set_assigned_regular_off_heap_memory()) {
        oprot.writeDouble(struct.assigned_regular_off_heap_memory);
      }
      if (struct.is_set_assigned_shared_off_heap_memory()) {
        oprot.writeDouble(struct.assigned_shared_off_heap_memory);
      }
    }

    @Override
    public void read(org.apache.storm.thrift.protocol.TProtocol prot, TopologyPageInfo struct) throws org.apache.storm.thrift.TException {
      org.apache.storm.thrift.protocol.TTupleProtocol iprot = (org.apache.storm.thrift.protocol.TTupleProtocol) prot;
      struct.id = iprot.readString();
      struct.set_id_isSet(true);
      java.util.BitSet incoming = iprot.readBitSet(31);
      if (incoming.get(0)) {
        struct.name = iprot.readString();
        struct.set_name_isSet(true);
      }
      if (incoming.get(1)) {
        struct.uptime_secs = iprot.readI32();
        struct.set_uptime_secs_isSet(true);
      }
      if (incoming.get(2)) {
        struct.status = iprot.readString();
        struct.set_status_isSet(true);
      }
      if (incoming.get(3)) {
        struct.num_tasks = iprot.readI32();
        struct.set_num_tasks_isSet(true);
      }
      if (incoming.get(4)) {
        struct.num_workers = iprot.readI32();
        struct.set_num_workers_isSet(true);
      }
      if (incoming.get(5)) {
        struct.num_executors = iprot.readI32();
        struct.set_num_executors_isSet(true);
      }
      if (incoming.get(6)) {
        struct.topology_conf = iprot.readString();
        struct.set_topology_conf_isSet(true);
      }
      if (incoming.get(7)) {
        {
          org.apache.storm.thrift.protocol.TMap _map499 = new org.apache.storm.thrift.protocol.TMap(org.apache.storm.thrift.protocol.TType.STRING, org.apache.storm.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.id_to_spout_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(2*_map499.size);
          @org.apache.storm.thrift.annotation.Nullable java.lang.String _key500;
          @org.apache.storm.thrift.annotation.Nullable ComponentAggregateStats _val501;
          for (int _i502 = 0; _i502 < _map499.size; ++_i502)
          {
            _key500 = iprot.readString();
            _val501 = new ComponentAggregateStats();
            _val501.read(iprot);
            struct.id_to_spout_agg_stats.put(_key500, _val501);
          }
        }
        struct.set_id_to_spout_agg_stats_isSet(true);
      }
      if (incoming.get(8)) {
        {
          org.apache.storm.thrift.protocol.TMap _map503 = new org.apache.storm.thrift.protocol.TMap(org.apache.storm.thrift.protocol.TType.STRING, org.apache.storm.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.id_to_bolt_agg_stats = new java.util.HashMap<java.lang.String,ComponentAggregateStats>(2*_map503.size);
          @org.apache.storm.thrift.annotation.Nullable java.lang.String _key504;
          @org.apache.storm.thrift.annotation.Nullable ComponentAggregateStats _val505;
          for (int _i506 = 0; _i506 < _map503.size; ++_i506)
          {
            _key504 = iprot.readString();
            _val505 = new ComponentAggregateStats();
            _val505.read(iprot);
            struct.id_to_bolt_agg_stats.put(_key504, _val505);
          }
        }
        struct.set_id_to_bolt_agg_stats_isSet(true);
      }
      if (incoming.get(9)) {
        struct.sched_status = iprot.readString();
        struct.set_sched_status_isSet(true);
      }
      if (incoming.get(10)) {
        struct.topology_stats = new TopologyStats();
        struct.topology_stats.read(iprot);
        struct.set_topology_stats_isSet(true);
      }
      if (incoming.get(11)) {
        struct.owner = iprot.readString();
        struct.set_owner_isSet(true);
      }
      if (incoming.get(12)) {
        struct.debug_options = new DebugOptions();
        struct.debug_options.read(iprot);
        struct.set_debug_options_isSet(true);
      }
      if (incoming.get(13)) {
        struct.replication_count = iprot.readI32();
        struct.set_replication_count_isSet(true);
      }
      if (incoming.get(14)) {
        {
          org.apache.storm.thrift.protocol.TList _list507 = new org.apache.storm.thrift.protocol.TList(org.apache.storm.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.workers = new java.util.ArrayList<WorkerSummary>(_list507.size);
          @org.apache.storm.thrift.annotation.Nullable WorkerSummary _elem508;
          for (int _i509 = 0; _i509 < _list507.size; ++_i509)
          {
            _elem508 = new WorkerSummary();
            _elem508.read(iprot);
            struct.workers.add(_elem508);
          }
        }
        struct.set_workers_isSet(true);
      }
      if (incoming.get(15)) {
        struct.storm_version = iprot.readString();
        struct.set_storm_version_isSet(true);
      }
      if (incoming.get(16)) {
        struct.topology_version = iprot.readString();
        struct.set_topology_version_isSet(true);
      }
      if (incoming.get(17)) {
        struct.requested_memonheap = iprot.readDouble();
        struct.set_requested_memonheap_isSet(true);
      }
      if (incoming.get(18)) {
        struct.requested_memoffheap = iprot.readDouble();
        struct.set_requested_memoffheap_isSet(true);
      }
      if (incoming.get(19)) {
        struct.requested_cpu = iprot.readDouble();
        struct.set_requested_cpu_isSet(true);
      }
      if (incoming.get(20)) {
        struct.assigned_memonheap = iprot.readDouble();
        struct.set_assigned_memonheap_isSet(true);
      }
      if (incoming.get(21)) {
        struct.assigned_memoffheap = iprot.readDouble();
        struct.set_assigned_memoffheap_isSet(true);
      }
      if (incoming.get(22)) {
        struct.assigned_cpu = iprot.readDouble();
        struct.set_assigned_cpu_isSet(true);
      }
      if (incoming.get(23)) {
        struct.requested_regular_on_heap_memory = iprot.readDouble();
        struct.set_requested_regular_on_heap_memory_isSet(true);
      }
      if (incoming.get(24)) {
        struct.requested_shared_on_heap_memory = iprot.readDouble();
        struct.set_requested_shared_on_heap_memory_isSet(true);
      }
      if (incoming.get(25)) {
        struct.requested_regular_off_heap_memory = iprot.readDouble();
        struct.set_requested_regular_off_heap_memory_isSet(true);
      }
      if (incoming.get(26)) {
        struct.requested_shared_off_heap_memory = iprot.readDouble();
        struct.set_requested_shared_off_heap_memory_isSet(true);
      }
      if (incoming.get(27)) {
        struct.assigned_regular_on_heap_memory = iprot.readDouble();
        struct.set_assigned_regular_on_heap_memory_isSet(true);
      }
      if (incoming.get(28)) {
        struct.assigned_shared_on_heap_memory = iprot.readDouble();
        struct.set_assigned_shared_on_heap_memory_isSet(true);
      }
      if (incoming.get(29)) {
        struct.assigned_regular_off_heap_memory = iprot.readDouble();
        struct.set_assigned_regular_off_heap_memory_isSet(true);
      }
      if (incoming.get(30)) {
        struct.assigned_shared_off_heap_memory = iprot.readDouble();
        struct.set_assigned_shared_off_heap_memory_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();
  }
}

