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


/**
 * Enumeration of data movement supported by Airavata
 * 
 * SCP:
 *  Job manager supporting the Portal Batch System (PBS) protocol. Some examples include TORQUE, PBSPro, Grid Engine.
 * 
 * SFTP:
 *  The Simple Linux Utility for Resource Management is a open source workload manager.
 * 
 * GridFTP:
 *  Globus File Transfer Protocol
 * 
 * UNICORE_STORAGE_SERVICE:
 *  Storage Service Provided by Unicore
 * 
 */
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.18.1)")
public enum DataMovementProtocol implements org.apache.thrift.TEnum {
  LOCAL(0),
  SCP(1),
  SFTP(2),
  GridFTP(3),
  UNICORE_STORAGE_SERVICE(4);

  private final int value;

  private DataMovementProtocol(int value) {
    this.value = value;
  }

  /**
   * Get the integer value of this enum value, as defined in the Thrift IDL.
   */
  @Override
  public int getValue() {
    return value;
  }

  /**
   * Find a the enum type by its integer value, as defined in the Thrift IDL.
   * @return null if the value is not found.
   */
  @org.apache.thrift.annotation.Nullable
  public static DataMovementProtocol findByValue(int value) { 
    switch (value) {
      case 0:
        return LOCAL;
      case 1:
        return SCP;
      case 2:
        return SFTP;
      case 3:
        return GridFTP;
      case 4:
        return UNICORE_STORAGE_SERVICE;
      default:
        return null;
    }
  }
}
