/**
 * 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.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.model.data.replica;

import org.apache.thrift.scheme.IScheme;
import org.apache.thrift.scheme.SchemeFactory;
import org.apache.thrift.scheme.StandardScheme;

import org.apache.thrift.scheme.TupleScheme;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.EncodingUtils;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.apache.thrift.server.AbstractNonblockingServer.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import javax.annotation.Generated;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

  private static final org.apache.thrift.protocol.TField REPLICA_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField PRODUCT_URI_FIELD_DESC = new org.apache.thrift.protocol.TField("productUri", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField REPLICA_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaName", org.apache.thrift.protocol.TType.STRING, (short)3);
  private static final org.apache.thrift.protocol.TField REPLICA_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaDescription", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("creationTime", org.apache.thrift.protocol.TType.I64, (short)5);
  private static final org.apache.thrift.protocol.TField LAST_MODIFIED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("lastModifiedTime", org.apache.thrift.protocol.TType.I64, (short)6);
  private static final org.apache.thrift.protocol.TField VALID_UNTIL_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("validUntilTime", org.apache.thrift.protocol.TType.I64, (short)7);
  private static final org.apache.thrift.protocol.TField REPLICA_LOCATION_CATEGORY_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaLocationCategory", org.apache.thrift.protocol.TType.I32, (short)8);
  private static final org.apache.thrift.protocol.TField REPLICA_PERSISTENT_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaPersistentType", org.apache.thrift.protocol.TType.I32, (short)9);
  private static final org.apache.thrift.protocol.TField STORAGE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("storageResourceId", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField FILE_PATH_FIELD_DESC = new org.apache.thrift.protocol.TField("filePath", org.apache.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.thrift.protocol.TField REPLICA_METADATA_FIELD_DESC = new org.apache.thrift.protocol.TField("replicaMetadata", org.apache.thrift.protocol.TType.MAP, (short)12);

  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
  static {
    schemes.put(StandardScheme.class, new DataReplicaLocationModelStandardSchemeFactory());
    schemes.put(TupleScheme.class, new DataReplicaLocationModelTupleSchemeFactory());
  }

  private String replicaId; // optional
  private String productUri; // optional
  private String replicaName; // optional
  private String replicaDescription; // optional
  private long creationTime; // optional
  private long lastModifiedTime; // optional
  private long validUntilTime; // optional
  private ReplicaLocationCategory replicaLocationCategory; // optional
  private ReplicaPersistentType replicaPersistentType; // optional
  private String storageResourceId; // optional
  private String filePath; // optional
  private Map<String,String> replicaMetadata; // optional

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
    REPLICA_ID((short)1, "replicaId"),
    PRODUCT_URI((short)2, "productUri"),
    REPLICA_NAME((short)3, "replicaName"),
    REPLICA_DESCRIPTION((short)4, "replicaDescription"),
    CREATION_TIME((short)5, "creationTime"),
    LAST_MODIFIED_TIME((short)6, "lastModifiedTime"),
    VALID_UNTIL_TIME((short)7, "validUntilTime"),
    /**
     * 
     * @see ReplicaLocationCategory
     */
    REPLICA_LOCATION_CATEGORY((short)8, "replicaLocationCategory"),
    /**
     * 
     * @see ReplicaPersistentType
     */
    REPLICA_PERSISTENT_TYPE((short)9, "replicaPersistentType"),
    STORAGE_RESOURCE_ID((short)10, "storageResourceId"),
    FILE_PATH((short)11, "filePath"),
    REPLICA_METADATA((short)12, "replicaMetadata");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // REPLICA_ID
          return REPLICA_ID;
        case 2: // PRODUCT_URI
          return PRODUCT_URI;
        case 3: // REPLICA_NAME
          return REPLICA_NAME;
        case 4: // REPLICA_DESCRIPTION
          return REPLICA_DESCRIPTION;
        case 5: // CREATION_TIME
          return CREATION_TIME;
        case 6: // LAST_MODIFIED_TIME
          return LAST_MODIFIED_TIME;
        case 7: // VALID_UNTIL_TIME
          return VALID_UNTIL_TIME;
        case 8: // REPLICA_LOCATION_CATEGORY
          return REPLICA_LOCATION_CATEGORY;
        case 9: // REPLICA_PERSISTENT_TYPE
          return REPLICA_PERSISTENT_TYPE;
        case 10: // STORAGE_RESOURCE_ID
          return STORAGE_RESOURCE_ID;
        case 11: // FILE_PATH
          return FILE_PATH;
        case 12: // REPLICA_METADATA
          return REPLICA_METADATA;
        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 IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    public static _Fields findByName(String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final String _fieldName;

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

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __CREATIONTIME_ISSET_ID = 0;
  private static final int __LASTMODIFIEDTIME_ISSET_ID = 1;
  private static final int __VALIDUNTILTIME_ISSET_ID = 2;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.REPLICA_ID,_Fields.PRODUCT_URI,_Fields.REPLICA_NAME,_Fields.REPLICA_DESCRIPTION,_Fields.CREATION_TIME,_Fields.LAST_MODIFIED_TIME,_Fields.VALID_UNTIL_TIME,_Fields.REPLICA_LOCATION_CATEGORY,_Fields.REPLICA_PERSISTENT_TYPE,_Fields.STORAGE_RESOURCE_ID,_Fields.FILE_PATH,_Fields.REPLICA_METADATA};
  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.REPLICA_ID, new org.apache.thrift.meta_data.FieldMetaData("replicaId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PRODUCT_URI, new org.apache.thrift.meta_data.FieldMetaData("productUri", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REPLICA_NAME, new org.apache.thrift.meta_data.FieldMetaData("replicaName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REPLICA_DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("replicaDescription", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("creationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.LAST_MODIFIED_TIME, new org.apache.thrift.meta_data.FieldMetaData("lastModifiedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.VALID_UNTIL_TIME, new org.apache.thrift.meta_data.FieldMetaData("validUntilTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.REPLICA_LOCATION_CATEGORY, new org.apache.thrift.meta_data.FieldMetaData("replicaLocationCategory", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, ReplicaLocationCategory.class)));
    tmpMap.put(_Fields.REPLICA_PERSISTENT_TYPE, new org.apache.thrift.meta_data.FieldMetaData("replicaPersistentType", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, ReplicaPersistentType.class)));
    tmpMap.put(_Fields.STORAGE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("storageResourceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.FILE_PATH, new org.apache.thrift.meta_data.FieldMetaData("filePath", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REPLICA_METADATA, new org.apache.thrift.meta_data.FieldMetaData("replicaMetadata", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), 
            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(DataReplicaLocationModel.class, metaDataMap);
  }

  public DataReplicaLocationModel() {
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public DataReplicaLocationModel(DataReplicaLocationModel other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetReplicaId()) {
      this.replicaId = other.replicaId;
    }
    if (other.isSetProductUri()) {
      this.productUri = other.productUri;
    }
    if (other.isSetReplicaName()) {
      this.replicaName = other.replicaName;
    }
    if (other.isSetReplicaDescription()) {
      this.replicaDescription = other.replicaDescription;
    }
    this.creationTime = other.creationTime;
    this.lastModifiedTime = other.lastModifiedTime;
    this.validUntilTime = other.validUntilTime;
    if (other.isSetReplicaLocationCategory()) {
      this.replicaLocationCategory = other.replicaLocationCategory;
    }
    if (other.isSetReplicaPersistentType()) {
      this.replicaPersistentType = other.replicaPersistentType;
    }
    if (other.isSetStorageResourceId()) {
      this.storageResourceId = other.storageResourceId;
    }
    if (other.isSetFilePath()) {
      this.filePath = other.filePath;
    }
    if (other.isSetReplicaMetadata()) {
      Map<String,String> __this__replicaMetadata = new HashMap<String,String>(other.replicaMetadata);
      this.replicaMetadata = __this__replicaMetadata;
    }
  }

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

  @Override
  public void clear() {
    this.replicaId = null;
    this.productUri = null;
    this.replicaName = null;
    this.replicaDescription = null;
    setCreationTimeIsSet(false);
    this.creationTime = 0;
    setLastModifiedTimeIsSet(false);
    this.lastModifiedTime = 0;
    setValidUntilTimeIsSet(false);
    this.validUntilTime = 0;
    this.replicaLocationCategory = null;
    this.replicaPersistentType = null;
    this.storageResourceId = null;
    this.filePath = null;
    this.replicaMetadata = null;
  }

  public String getReplicaId() {
    return this.replicaId;
  }

  public void setReplicaId(String replicaId) {
    this.replicaId = replicaId;
  }

  public void unsetReplicaId() {
    this.replicaId = null;
  }

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

  public void setReplicaIdIsSet(boolean value) {
    if (!value) {
      this.replicaId = null;
    }
  }

  public String getProductUri() {
    return this.productUri;
  }

  public void setProductUri(String productUri) {
    this.productUri = productUri;
  }

  public void unsetProductUri() {
    this.productUri = null;
  }

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

  public void setProductUriIsSet(boolean value) {
    if (!value) {
      this.productUri = null;
    }
  }

  public String getReplicaName() {
    return this.replicaName;
  }

  public void setReplicaName(String replicaName) {
    this.replicaName = replicaName;
  }

  public void unsetReplicaName() {
    this.replicaName = null;
  }

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

  public void setReplicaNameIsSet(boolean value) {
    if (!value) {
      this.replicaName = null;
    }
  }

  public String getReplicaDescription() {
    return this.replicaDescription;
  }

  public void setReplicaDescription(String replicaDescription) {
    this.replicaDescription = replicaDescription;
  }

  public void unsetReplicaDescription() {
    this.replicaDescription = null;
  }

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

  public void setReplicaDescriptionIsSet(boolean value) {
    if (!value) {
      this.replicaDescription = null;
    }
  }

  public long getCreationTime() {
    return this.creationTime;
  }

  public void setCreationTime(long creationTime) {
    this.creationTime = creationTime;
    setCreationTimeIsSet(true);
  }

  public void unsetCreationTime() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
  }

  /** Returns true if field creationTime is set (has been assigned a value) and false otherwise */
  public boolean isSetCreationTime() {
    return EncodingUtils.testBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
  }

  public void setCreationTimeIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CREATIONTIME_ISSET_ID, value);
  }

  public long getLastModifiedTime() {
    return this.lastModifiedTime;
  }

  public void setLastModifiedTime(long lastModifiedTime) {
    this.lastModifiedTime = lastModifiedTime;
    setLastModifiedTimeIsSet(true);
  }

  public void unsetLastModifiedTime() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID);
  }

  /** Returns true if field lastModifiedTime is set (has been assigned a value) and false otherwise */
  public boolean isSetLastModifiedTime() {
    return EncodingUtils.testBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID);
  }

  public void setLastModifiedTimeIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID, value);
  }

  public long getValidUntilTime() {
    return this.validUntilTime;
  }

  public void setValidUntilTime(long validUntilTime) {
    this.validUntilTime = validUntilTime;
    setValidUntilTimeIsSet(true);
  }

  public void unsetValidUntilTime() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __VALIDUNTILTIME_ISSET_ID);
  }

  /** Returns true if field validUntilTime is set (has been assigned a value) and false otherwise */
  public boolean isSetValidUntilTime() {
    return EncodingUtils.testBit(__isset_bitfield, __VALIDUNTILTIME_ISSET_ID);
  }

  public void setValidUntilTimeIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __VALIDUNTILTIME_ISSET_ID, value);
  }

  /**
   * 
   * @see ReplicaLocationCategory
   */
  public ReplicaLocationCategory getReplicaLocationCategory() {
    return this.replicaLocationCategory;
  }

  /**
   * 
   * @see ReplicaLocationCategory
   */
  public void setReplicaLocationCategory(ReplicaLocationCategory replicaLocationCategory) {
    this.replicaLocationCategory = replicaLocationCategory;
  }

  public void unsetReplicaLocationCategory() {
    this.replicaLocationCategory = null;
  }

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

  public void setReplicaLocationCategoryIsSet(boolean value) {
    if (!value) {
      this.replicaLocationCategory = null;
    }
  }

  /**
   * 
   * @see ReplicaPersistentType
   */
  public ReplicaPersistentType getReplicaPersistentType() {
    return this.replicaPersistentType;
  }

  /**
   * 
   * @see ReplicaPersistentType
   */
  public void setReplicaPersistentType(ReplicaPersistentType replicaPersistentType) {
    this.replicaPersistentType = replicaPersistentType;
  }

  public void unsetReplicaPersistentType() {
    this.replicaPersistentType = null;
  }

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

  public void setReplicaPersistentTypeIsSet(boolean value) {
    if (!value) {
      this.replicaPersistentType = null;
    }
  }

  public String getStorageResourceId() {
    return this.storageResourceId;
  }

  public void setStorageResourceId(String storageResourceId) {
    this.storageResourceId = storageResourceId;
  }

  public void unsetStorageResourceId() {
    this.storageResourceId = null;
  }

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

  public void setStorageResourceIdIsSet(boolean value) {
    if (!value) {
      this.storageResourceId = null;
    }
  }

  public String getFilePath() {
    return this.filePath;
  }

  public void setFilePath(String filePath) {
    this.filePath = filePath;
  }

  public void unsetFilePath() {
    this.filePath = null;
  }

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

  public void setFilePathIsSet(boolean value) {
    if (!value) {
      this.filePath = null;
    }
  }

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

  public void putToReplicaMetadata(String key, String val) {
    if (this.replicaMetadata == null) {
      this.replicaMetadata = new HashMap<String,String>();
    }
    this.replicaMetadata.put(key, val);
  }

  public Map<String,String> getReplicaMetadata() {
    return this.replicaMetadata;
  }

  public void setReplicaMetadata(Map<String,String> replicaMetadata) {
    this.replicaMetadata = replicaMetadata;
  }

  public void unsetReplicaMetadata() {
    this.replicaMetadata = null;
  }

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

  public void setReplicaMetadataIsSet(boolean value) {
    if (!value) {
      this.replicaMetadata = null;
    }
  }

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case REPLICA_ID:
      if (value == null) {
        unsetReplicaId();
      } else {
        setReplicaId((String)value);
      }
      break;

    case PRODUCT_URI:
      if (value == null) {
        unsetProductUri();
      } else {
        setProductUri((String)value);
      }
      break;

    case REPLICA_NAME:
      if (value == null) {
        unsetReplicaName();
      } else {
        setReplicaName((String)value);
      }
      break;

    case REPLICA_DESCRIPTION:
      if (value == null) {
        unsetReplicaDescription();
      } else {
        setReplicaDescription((String)value);
      }
      break;

    case CREATION_TIME:
      if (value == null) {
        unsetCreationTime();
      } else {
        setCreationTime((Long)value);
      }
      break;

    case LAST_MODIFIED_TIME:
      if (value == null) {
        unsetLastModifiedTime();
      } else {
        setLastModifiedTime((Long)value);
      }
      break;

    case VALID_UNTIL_TIME:
      if (value == null) {
        unsetValidUntilTime();
      } else {
        setValidUntilTime((Long)value);
      }
      break;

    case REPLICA_LOCATION_CATEGORY:
      if (value == null) {
        unsetReplicaLocationCategory();
      } else {
        setReplicaLocationCategory((ReplicaLocationCategory)value);
      }
      break;

    case REPLICA_PERSISTENT_TYPE:
      if (value == null) {
        unsetReplicaPersistentType();
      } else {
        setReplicaPersistentType((ReplicaPersistentType)value);
      }
      break;

    case STORAGE_RESOURCE_ID:
      if (value == null) {
        unsetStorageResourceId();
      } else {
        setStorageResourceId((String)value);
      }
      break;

    case FILE_PATH:
      if (value == null) {
        unsetFilePath();
      } else {
        setFilePath((String)value);
      }
      break;

    case REPLICA_METADATA:
      if (value == null) {
        unsetReplicaMetadata();
      } else {
        setReplicaMetadata((Map<String,String>)value);
      }
      break;

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    case REPLICA_ID:
      return getReplicaId();

    case PRODUCT_URI:
      return getProductUri();

    case REPLICA_NAME:
      return getReplicaName();

    case REPLICA_DESCRIPTION:
      return getReplicaDescription();

    case CREATION_TIME:
      return getCreationTime();

    case LAST_MODIFIED_TIME:
      return getLastModifiedTime();

    case VALID_UNTIL_TIME:
      return getValidUntilTime();

    case REPLICA_LOCATION_CATEGORY:
      return getReplicaLocationCategory();

    case REPLICA_PERSISTENT_TYPE:
      return getReplicaPersistentType();

    case STORAGE_RESOURCE_ID:
      return getStorageResourceId();

    case FILE_PATH:
      return getFilePath();

    case REPLICA_METADATA:
      return getReplicaMetadata();

    }
    throw new 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 IllegalArgumentException();
    }

    switch (field) {
    case REPLICA_ID:
      return isSetReplicaId();
    case PRODUCT_URI:
      return isSetProductUri();
    case REPLICA_NAME:
      return isSetReplicaName();
    case REPLICA_DESCRIPTION:
      return isSetReplicaDescription();
    case CREATION_TIME:
      return isSetCreationTime();
    case LAST_MODIFIED_TIME:
      return isSetLastModifiedTime();
    case VALID_UNTIL_TIME:
      return isSetValidUntilTime();
    case REPLICA_LOCATION_CATEGORY:
      return isSetReplicaLocationCategory();
    case REPLICA_PERSISTENT_TYPE:
      return isSetReplicaPersistentType();
    case STORAGE_RESOURCE_ID:
      return isSetStorageResourceId();
    case FILE_PATH:
      return isSetFilePath();
    case REPLICA_METADATA:
      return isSetReplicaMetadata();
    }
    throw new IllegalStateException();
  }

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

  public boolean equals(DataReplicaLocationModel that) {
    if (that == null)
      return false;

    boolean this_present_replicaId = true && this.isSetReplicaId();
    boolean that_present_replicaId = true && that.isSetReplicaId();
    if (this_present_replicaId || that_present_replicaId) {
      if (!(this_present_replicaId && that_present_replicaId))
        return false;
      if (!this.replicaId.equals(that.replicaId))
        return false;
    }

    boolean this_present_productUri = true && this.isSetProductUri();
    boolean that_present_productUri = true && that.isSetProductUri();
    if (this_present_productUri || that_present_productUri) {
      if (!(this_present_productUri && that_present_productUri))
        return false;
      if (!this.productUri.equals(that.productUri))
        return false;
    }

    boolean this_present_replicaName = true && this.isSetReplicaName();
    boolean that_present_replicaName = true && that.isSetReplicaName();
    if (this_present_replicaName || that_present_replicaName) {
      if (!(this_present_replicaName && that_present_replicaName))
        return false;
      if (!this.replicaName.equals(that.replicaName))
        return false;
    }

    boolean this_present_replicaDescription = true && this.isSetReplicaDescription();
    boolean that_present_replicaDescription = true && that.isSetReplicaDescription();
    if (this_present_replicaDescription || that_present_replicaDescription) {
      if (!(this_present_replicaDescription && that_present_replicaDescription))
        return false;
      if (!this.replicaDescription.equals(that.replicaDescription))
        return false;
    }

    boolean this_present_creationTime = true && this.isSetCreationTime();
    boolean that_present_creationTime = true && that.isSetCreationTime();
    if (this_present_creationTime || that_present_creationTime) {
      if (!(this_present_creationTime && that_present_creationTime))
        return false;
      if (this.creationTime != that.creationTime)
        return false;
    }

    boolean this_present_lastModifiedTime = true && this.isSetLastModifiedTime();
    boolean that_present_lastModifiedTime = true && that.isSetLastModifiedTime();
    if (this_present_lastModifiedTime || that_present_lastModifiedTime) {
      if (!(this_present_lastModifiedTime && that_present_lastModifiedTime))
        return false;
      if (this.lastModifiedTime != that.lastModifiedTime)
        return false;
    }

    boolean this_present_validUntilTime = true && this.isSetValidUntilTime();
    boolean that_present_validUntilTime = true && that.isSetValidUntilTime();
    if (this_present_validUntilTime || that_present_validUntilTime) {
      if (!(this_present_validUntilTime && that_present_validUntilTime))
        return false;
      if (this.validUntilTime != that.validUntilTime)
        return false;
    }

    boolean this_present_replicaLocationCategory = true && this.isSetReplicaLocationCategory();
    boolean that_present_replicaLocationCategory = true && that.isSetReplicaLocationCategory();
    if (this_present_replicaLocationCategory || that_present_replicaLocationCategory) {
      if (!(this_present_replicaLocationCategory && that_present_replicaLocationCategory))
        return false;
      if (!this.replicaLocationCategory.equals(that.replicaLocationCategory))
        return false;
    }

    boolean this_present_replicaPersistentType = true && this.isSetReplicaPersistentType();
    boolean that_present_replicaPersistentType = true && that.isSetReplicaPersistentType();
    if (this_present_replicaPersistentType || that_present_replicaPersistentType) {
      if (!(this_present_replicaPersistentType && that_present_replicaPersistentType))
        return false;
      if (!this.replicaPersistentType.equals(that.replicaPersistentType))
        return false;
    }

    boolean this_present_storageResourceId = true && this.isSetStorageResourceId();
    boolean that_present_storageResourceId = true && that.isSetStorageResourceId();
    if (this_present_storageResourceId || that_present_storageResourceId) {
      if (!(this_present_storageResourceId && that_present_storageResourceId))
        return false;
      if (!this.storageResourceId.equals(that.storageResourceId))
        return false;
    }

    boolean this_present_filePath = true && this.isSetFilePath();
    boolean that_present_filePath = true && that.isSetFilePath();
    if (this_present_filePath || that_present_filePath) {
      if (!(this_present_filePath && that_present_filePath))
        return false;
      if (!this.filePath.equals(that.filePath))
        return false;
    }

    boolean this_present_replicaMetadata = true && this.isSetReplicaMetadata();
    boolean that_present_replicaMetadata = true && that.isSetReplicaMetadata();
    if (this_present_replicaMetadata || that_present_replicaMetadata) {
      if (!(this_present_replicaMetadata && that_present_replicaMetadata))
        return false;
      if (!this.replicaMetadata.equals(that.replicaMetadata))
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    List<Object> list = new ArrayList<Object>();

    boolean present_replicaId = true && (isSetReplicaId());
    list.add(present_replicaId);
    if (present_replicaId)
      list.add(replicaId);

    boolean present_productUri = true && (isSetProductUri());
    list.add(present_productUri);
    if (present_productUri)
      list.add(productUri);

    boolean present_replicaName = true && (isSetReplicaName());
    list.add(present_replicaName);
    if (present_replicaName)
      list.add(replicaName);

    boolean present_replicaDescription = true && (isSetReplicaDescription());
    list.add(present_replicaDescription);
    if (present_replicaDescription)
      list.add(replicaDescription);

    boolean present_creationTime = true && (isSetCreationTime());
    list.add(present_creationTime);
    if (present_creationTime)
      list.add(creationTime);

    boolean present_lastModifiedTime = true && (isSetLastModifiedTime());
    list.add(present_lastModifiedTime);
    if (present_lastModifiedTime)
      list.add(lastModifiedTime);

    boolean present_validUntilTime = true && (isSetValidUntilTime());
    list.add(present_validUntilTime);
    if (present_validUntilTime)
      list.add(validUntilTime);

    boolean present_replicaLocationCategory = true && (isSetReplicaLocationCategory());
    list.add(present_replicaLocationCategory);
    if (present_replicaLocationCategory)
      list.add(replicaLocationCategory.getValue());

    boolean present_replicaPersistentType = true && (isSetReplicaPersistentType());
    list.add(present_replicaPersistentType);
    if (present_replicaPersistentType)
      list.add(replicaPersistentType.getValue());

    boolean present_storageResourceId = true && (isSetStorageResourceId());
    list.add(present_storageResourceId);
    if (present_storageResourceId)
      list.add(storageResourceId);

    boolean present_filePath = true && (isSetFilePath());
    list.add(present_filePath);
    if (present_filePath)
      list.add(filePath);

    boolean present_replicaMetadata = true && (isSetReplicaMetadata());
    list.add(present_replicaMetadata);
    if (present_replicaMetadata)
      list.add(replicaMetadata);

    return list.hashCode();
  }

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

    int lastComparison = 0;

    lastComparison = Boolean.valueOf(isSetReplicaId()).compareTo(other.isSetReplicaId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaId, other.replicaId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetProductUri()).compareTo(other.isSetProductUri());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProductUri()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.productUri, other.productUri);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetReplicaName()).compareTo(other.isSetReplicaName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaName, other.replicaName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetReplicaDescription()).compareTo(other.isSetReplicaDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaDescription, other.replicaDescription);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetCreationTime()).compareTo(other.isSetCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.creationTime, other.creationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetLastModifiedTime()).compareTo(other.isSetLastModifiedTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetLastModifiedTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.lastModifiedTime, other.lastModifiedTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetValidUntilTime()).compareTo(other.isSetValidUntilTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetValidUntilTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.validUntilTime, other.validUntilTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetReplicaLocationCategory()).compareTo(other.isSetReplicaLocationCategory());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaLocationCategory()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaLocationCategory, other.replicaLocationCategory);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetReplicaPersistentType()).compareTo(other.isSetReplicaPersistentType());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaPersistentType()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaPersistentType, other.replicaPersistentType);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetStorageResourceId()).compareTo(other.isSetStorageResourceId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStorageResourceId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.storageResourceId, other.storageResourceId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetFilePath()).compareTo(other.isSetFilePath());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetFilePath()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.filePath, other.filePath);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetReplicaMetadata()).compareTo(other.isSetReplicaMetadata());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReplicaMetadata()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replicaMetadata, other.replicaMetadata);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
  }

  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("DataReplicaLocationModel(");
    boolean first = true;

    if (isSetReplicaId()) {
      sb.append("replicaId:");
      if (this.replicaId == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaId);
      }
      first = false;
    }
    if (isSetProductUri()) {
      if (!first) sb.append(", ");
      sb.append("productUri:");
      if (this.productUri == null) {
        sb.append("null");
      } else {
        sb.append(this.productUri);
      }
      first = false;
    }
    if (isSetReplicaName()) {
      if (!first) sb.append(", ");
      sb.append("replicaName:");
      if (this.replicaName == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaName);
      }
      first = false;
    }
    if (isSetReplicaDescription()) {
      if (!first) sb.append(", ");
      sb.append("replicaDescription:");
      if (this.replicaDescription == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaDescription);
      }
      first = false;
    }
    if (isSetCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("creationTime:");
      sb.append(this.creationTime);
      first = false;
    }
    if (isSetLastModifiedTime()) {
      if (!first) sb.append(", ");
      sb.append("lastModifiedTime:");
      sb.append(this.lastModifiedTime);
      first = false;
    }
    if (isSetValidUntilTime()) {
      if (!first) sb.append(", ");
      sb.append("validUntilTime:");
      sb.append(this.validUntilTime);
      first = false;
    }
    if (isSetReplicaLocationCategory()) {
      if (!first) sb.append(", ");
      sb.append("replicaLocationCategory:");
      if (this.replicaLocationCategory == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaLocationCategory);
      }
      first = false;
    }
    if (isSetReplicaPersistentType()) {
      if (!first) sb.append(", ");
      sb.append("replicaPersistentType:");
      if (this.replicaPersistentType == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaPersistentType);
      }
      first = false;
    }
    if (isSetStorageResourceId()) {
      if (!first) sb.append(", ");
      sb.append("storageResourceId:");
      if (this.storageResourceId == null) {
        sb.append("null");
      } else {
        sb.append(this.storageResourceId);
      }
      first = false;
    }
    if (isSetFilePath()) {
      if (!first) sb.append(", ");
      sb.append("filePath:");
      if (this.filePath == null) {
        sb.append("null");
      } else {
        sb.append(this.filePath);
      }
      first = false;
    }
    if (isSetReplicaMetadata()) {
      if (!first) sb.append(", ");
      sb.append("replicaMetadata:");
      if (this.replicaMetadata == null) {
        sb.append("null");
      } else {
        sb.append(this.replicaMetadata);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.thrift.TException {
    // check for required fields
    // check for sub-struct validity
  }

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

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, 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.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    } catch (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private static class DataReplicaLocationModelStandardSchemeFactory implements SchemeFactory {
    public DataReplicaLocationModelStandardScheme getScheme() {
      return new DataReplicaLocationModelStandardScheme();
    }
  }

  private static class DataReplicaLocationModelStandardScheme extends StandardScheme<DataReplicaLocationModel> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, DataReplicaLocationModel struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TField schemeField;
      iprot.readStructBegin();
      while (true)
      {
        schemeField = iprot.readFieldBegin();
        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
          break;
        }
        switch (schemeField.id) {
          case 1: // REPLICA_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.replicaId = iprot.readString();
              struct.setReplicaIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // PRODUCT_URI
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.productUri = iprot.readString();
              struct.setProductUriIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // REPLICA_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.replicaName = iprot.readString();
              struct.setReplicaNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // REPLICA_DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.replicaDescription = iprot.readString();
              struct.setReplicaDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // CREATION_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.creationTime = iprot.readI64();
              struct.setCreationTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // LAST_MODIFIED_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.lastModifiedTime = iprot.readI64();
              struct.setLastModifiedTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // VALID_UNTIL_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.validUntilTime = iprot.readI64();
              struct.setValidUntilTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // REPLICA_LOCATION_CATEGORY
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.replicaLocationCategory = org.apache.airavata.model.data.replica.ReplicaLocationCategory.findByValue(iprot.readI32());
              struct.setReplicaLocationCategoryIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // REPLICA_PERSISTENT_TYPE
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.replicaPersistentType = org.apache.airavata.model.data.replica.ReplicaPersistentType.findByValue(iprot.readI32());
              struct.setReplicaPersistentTypeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // STORAGE_RESOURCE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.storageResourceId = iprot.readString();
              struct.setStorageResourceIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // FILE_PATH
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.filePath = iprot.readString();
              struct.setFilePathIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // REPLICA_METADATA
            if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
              {
                org.apache.thrift.protocol.TMap _map18 = iprot.readMapBegin();
                struct.replicaMetadata = new HashMap<String,String>(2*_map18.size);
                String _key19;
                String _val20;
                for (int _i21 = 0; _i21 < _map18.size; ++_i21)
                {
                  _key19 = iprot.readString();
                  _val20 = iprot.readString();
                  struct.replicaMetadata.put(_key19, _val20);
                }
                iprot.readMapEnd();
              }
              struct.setReplicaMetadataIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.replicaId != null) {
        if (struct.isSetReplicaId()) {
          oprot.writeFieldBegin(REPLICA_ID_FIELD_DESC);
          oprot.writeString(struct.replicaId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.productUri != null) {
        if (struct.isSetProductUri()) {
          oprot.writeFieldBegin(PRODUCT_URI_FIELD_DESC);
          oprot.writeString(struct.productUri);
          oprot.writeFieldEnd();
        }
      }
      if (struct.replicaName != null) {
        if (struct.isSetReplicaName()) {
          oprot.writeFieldBegin(REPLICA_NAME_FIELD_DESC);
          oprot.writeString(struct.replicaName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.replicaDescription != null) {
        if (struct.isSetReplicaDescription()) {
          oprot.writeFieldBegin(REPLICA_DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.replicaDescription);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetCreationTime()) {
        oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
        oprot.writeI64(struct.creationTime);
        oprot.writeFieldEnd();
      }
      if (struct.isSetLastModifiedTime()) {
        oprot.writeFieldBegin(LAST_MODIFIED_TIME_FIELD_DESC);
        oprot.writeI64(struct.lastModifiedTime);
        oprot.writeFieldEnd();
      }
      if (struct.isSetValidUntilTime()) {
        oprot.writeFieldBegin(VALID_UNTIL_TIME_FIELD_DESC);
        oprot.writeI64(struct.validUntilTime);
        oprot.writeFieldEnd();
      }
      if (struct.replicaLocationCategory != null) {
        if (struct.isSetReplicaLocationCategory()) {
          oprot.writeFieldBegin(REPLICA_LOCATION_CATEGORY_FIELD_DESC);
          oprot.writeI32(struct.replicaLocationCategory.getValue());
          oprot.writeFieldEnd();
        }
      }
      if (struct.replicaPersistentType != null) {
        if (struct.isSetReplicaPersistentType()) {
          oprot.writeFieldBegin(REPLICA_PERSISTENT_TYPE_FIELD_DESC);
          oprot.writeI32(struct.replicaPersistentType.getValue());
          oprot.writeFieldEnd();
        }
      }
      if (struct.storageResourceId != null) {
        if (struct.isSetStorageResourceId()) {
          oprot.writeFieldBegin(STORAGE_RESOURCE_ID_FIELD_DESC);
          oprot.writeString(struct.storageResourceId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.filePath != null) {
        if (struct.isSetFilePath()) {
          oprot.writeFieldBegin(FILE_PATH_FIELD_DESC);
          oprot.writeString(struct.filePath);
          oprot.writeFieldEnd();
        }
      }
      if (struct.replicaMetadata != null) {
        if (struct.isSetReplicaMetadata()) {
          oprot.writeFieldBegin(REPLICA_METADATA_FIELD_DESC);
          {
            oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.replicaMetadata.size()));
            for (Map.Entry<String, String> _iter22 : struct.replicaMetadata.entrySet())
            {
              oprot.writeString(_iter22.getKey());
              oprot.writeString(_iter22.getValue());
            }
            oprot.writeMapEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class DataReplicaLocationModelTupleSchemeFactory implements SchemeFactory {
    public DataReplicaLocationModelTupleScheme getScheme() {
      return new DataReplicaLocationModelTupleScheme();
    }
  }

  private static class DataReplicaLocationModelTupleScheme extends TupleScheme<DataReplicaLocationModel> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, DataReplicaLocationModel struct) throws org.apache.thrift.TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      BitSet optionals = new BitSet();
      if (struct.isSetReplicaId()) {
        optionals.set(0);
      }
      if (struct.isSetProductUri()) {
        optionals.set(1);
      }
      if (struct.isSetReplicaName()) {
        optionals.set(2);
      }
      if (struct.isSetReplicaDescription()) {
        optionals.set(3);
      }
      if (struct.isSetCreationTime()) {
        optionals.set(4);
      }
      if (struct.isSetLastModifiedTime()) {
        optionals.set(5);
      }
      if (struct.isSetValidUntilTime()) {
        optionals.set(6);
      }
      if (struct.isSetReplicaLocationCategory()) {
        optionals.set(7);
      }
      if (struct.isSetReplicaPersistentType()) {
        optionals.set(8);
      }
      if (struct.isSetStorageResourceId()) {
        optionals.set(9);
      }
      if (struct.isSetFilePath()) {
        optionals.set(10);
      }
      if (struct.isSetReplicaMetadata()) {
        optionals.set(11);
      }
      oprot.writeBitSet(optionals, 12);
      if (struct.isSetReplicaId()) {
        oprot.writeString(struct.replicaId);
      }
      if (struct.isSetProductUri()) {
        oprot.writeString(struct.productUri);
      }
      if (struct.isSetReplicaName()) {
        oprot.writeString(struct.replicaName);
      }
      if (struct.isSetReplicaDescription()) {
        oprot.writeString(struct.replicaDescription);
      }
      if (struct.isSetCreationTime()) {
        oprot.writeI64(struct.creationTime);
      }
      if (struct.isSetLastModifiedTime()) {
        oprot.writeI64(struct.lastModifiedTime);
      }
      if (struct.isSetValidUntilTime()) {
        oprot.writeI64(struct.validUntilTime);
      }
      if (struct.isSetReplicaLocationCategory()) {
        oprot.writeI32(struct.replicaLocationCategory.getValue());
      }
      if (struct.isSetReplicaPersistentType()) {
        oprot.writeI32(struct.replicaPersistentType.getValue());
      }
      if (struct.isSetStorageResourceId()) {
        oprot.writeString(struct.storageResourceId);
      }
      if (struct.isSetFilePath()) {
        oprot.writeString(struct.filePath);
      }
      if (struct.isSetReplicaMetadata()) {
        {
          oprot.writeI32(struct.replicaMetadata.size());
          for (Map.Entry<String, String> _iter23 : struct.replicaMetadata.entrySet())
          {
            oprot.writeString(_iter23.getKey());
            oprot.writeString(_iter23.getValue());
          }
        }
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, DataReplicaLocationModel struct) throws org.apache.thrift.TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      BitSet incoming = iprot.readBitSet(12);
      if (incoming.get(0)) {
        struct.replicaId = iprot.readString();
        struct.setReplicaIdIsSet(true);
      }
      if (incoming.get(1)) {
        struct.productUri = iprot.readString();
        struct.setProductUriIsSet(true);
      }
      if (incoming.get(2)) {
        struct.replicaName = iprot.readString();
        struct.setReplicaNameIsSet(true);
      }
      if (incoming.get(3)) {
        struct.replicaDescription = iprot.readString();
        struct.setReplicaDescriptionIsSet(true);
      }
      if (incoming.get(4)) {
        struct.creationTime = iprot.readI64();
        struct.setCreationTimeIsSet(true);
      }
      if (incoming.get(5)) {
        struct.lastModifiedTime = iprot.readI64();
        struct.setLastModifiedTimeIsSet(true);
      }
      if (incoming.get(6)) {
        struct.validUntilTime = iprot.readI64();
        struct.setValidUntilTimeIsSet(true);
      }
      if (incoming.get(7)) {
        struct.replicaLocationCategory = org.apache.airavata.model.data.replica.ReplicaLocationCategory.findByValue(iprot.readI32());
        struct.setReplicaLocationCategoryIsSet(true);
      }
      if (incoming.get(8)) {
        struct.replicaPersistentType = org.apache.airavata.model.data.replica.ReplicaPersistentType.findByValue(iprot.readI32());
        struct.setReplicaPersistentTypeIsSet(true);
      }
      if (incoming.get(9)) {
        struct.storageResourceId = iprot.readString();
        struct.setStorageResourceIdIsSet(true);
      }
      if (incoming.get(10)) {
        struct.filePath = iprot.readString();
        struct.setFilePathIsSet(true);
      }
      if (incoming.get(11)) {
        {
          org.apache.thrift.protocol.TMap _map24 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
          struct.replicaMetadata = new HashMap<String,String>(2*_map24.size);
          String _key25;
          String _val26;
          for (int _i27 = 0; _i27 < _map24.size; ++_i27)
          {
            _key25 = iprot.readString();
            _val26 = iprot.readString();
            struct.replicaMetadata.put(_key25, _val26);
          }
        }
        struct.setReplicaMetadataIsSet(true);
      }
    }
  }

}

