//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

// Generated from: reef_service_protos.proto
namespace Org.Apache.REEF.Common.Protobuf.ReefProtocol

{
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"FileResourceProto")]
  public partial class FileResourceProto : global::ProtoBuf.IExtensible
  {
    public FileResourceProto() {}
    
    private FileType _type;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public FileType type
    {
      get { return _type; }
      set { _type = value; }
    }
    private string _name;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string name
    {
      get { return _name; }
      set { _name = value; }
    }
    private string _path;
    [global::ProtoBuf.ProtoMember(3, IsRequired = true, Name=@"path", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string path
    {
      get { return _path; }
      set { _path = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"RuntimeErrorProto")]
  public partial class RuntimeErrorProto : global::ProtoBuf.IExtensible
  {
    public RuntimeErrorProto() {}
    
    private string _name;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string name
    {
      get { return _name; }
      set { _name = value; }
    }
    private string _message;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string message
    {
      get { return _message; }
      set { _message = value; }
    }
    private byte[] _exception = null;
    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"exception", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] exception
    {
      get { return _exception; }
      set { _exception = value; }
    }
    private string _identifier = "";
    [global::ProtoBuf.ProtoMember(5, IsRequired = false, Name=@"identifier", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue("")]
    public string identifier
    {
      get { return _identifier; }
      set { _identifier = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"JobStatusProto")]
  public partial class JobStatusProto : global::ProtoBuf.IExtensible
  {
    public JobStatusProto() {}
    
    private string _identifier;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"identifier", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string identifier
    {
      get { return _identifier; }
      set { _identifier = value; }
    }
    private State _state;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"state", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public State state
    {
      get { return _state; }
      set { _state = value; }
    }
    private byte[] _message = null;
    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] message
    {
      get { return _message; }
      set { _message = value; }
    }
    private byte[] _exception = null;
    [global::ProtoBuf.ProtoMember(4, IsRequired = false, Name=@"exception", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] exception
    {
      get { return _exception; }
      set { _exception = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"ContextStatusProto")]
  public partial class ContextStatusProto : global::ProtoBuf.IExtensible
  {
    public ContextStatusProto() {}
    
    private ContextStatusProto.State _context_state;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"context_state", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public ContextStatusProto.State context_state
    {
      get { return _context_state; }
      set { _context_state = value; }
    }
    private string _context_id;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"context_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string context_id
    {
      get { return _context_id; }
      set { _context_id = value; }
    }
    private string _parent_id = "";
    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"parent_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue("")]
    public string parent_id
    {
      get { return _parent_id; }
      set { _parent_id = value; }
    }
    private byte[] _error = null;
    [global::ProtoBuf.ProtoMember(5, IsRequired = false, Name=@"error", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] error
    {
      get { return _error; }
      set { _error = value; }
    }
    private bool _recovery = false;
    [global::ProtoBuf.ProtoMember(6, IsRequired = false, Name = @"recovery", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(false)]
    public bool recovery
    {
        get { return _recovery; }
        set { _recovery = value; }
    }
    private readonly global::System.Collections.Generic.List<ContextStatusProto.ContextMessageProto> _context_message = new global::System.Collections.Generic.List<ContextStatusProto.ContextMessageProto>();
    [global::ProtoBuf.ProtoMember(7, Name=@"context_message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public global::System.Collections.Generic.List<ContextStatusProto.ContextMessageProto> context_message
    {
      get { return _context_message; }
    }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"ContextMessageProto")]
  public partial class ContextMessageProto : global::ProtoBuf.IExtensible
  {
    public ContextMessageProto() {}
    
    private string _source_id;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"source_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string source_id
    {
      get { return _source_id; }
      set { _source_id = value; }
    }
    private byte[] _message;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public byte[] message
    {
      get { return _message; }
      set { _message = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
    [global::ProtoBuf.ProtoContract(Name=@"State")]
    public enum State
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"READY", Value=0)]
      READY = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DONE", Value=1)]
      DONE = 1,
            
      [global::ProtoBuf.ProtoEnum(Name=@"FAIL", Value=2)]
      FAIL = 2
    }
  
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"TaskStatusProto")]
  public partial class TaskStatusProto : global::ProtoBuf.IExtensible
  {
    public TaskStatusProto() {}
    
    private string _task_id;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"task_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string task_id
    {
      get { return _task_id; }
      set { _task_id = value; }
    }
    private string _context_id;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"context_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string context_id
    {
      get { return _context_id; }
      set { _context_id = value; }
    }
    private State _state;
    [global::ProtoBuf.ProtoMember(3, IsRequired = true, Name=@"state", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public State state
    {
      get { return _state; }
      set { _state = value; }
    }
    private byte[] _result = null;
    [global::ProtoBuf.ProtoMember(4, IsRequired = false, Name=@"result", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] result
    {
      get { return _result; }
      set { _result = value; }
    }
    private bool _recovery = false;
    [global::ProtoBuf.ProtoMember(5, IsRequired = false, Name = @"recovery", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(false)]
    public bool recovery
    {
        get { return _recovery; }
        set { _recovery = value; }
    }
    private readonly global::System.Collections.Generic.List<TaskStatusProto.TaskMessageProto> _task_message = new global::System.Collections.Generic.List<TaskStatusProto.TaskMessageProto>();
    [global::ProtoBuf.ProtoMember(6, Name=@"task_message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public global::System.Collections.Generic.List<TaskStatusProto.TaskMessageProto> task_message
    {
      get { return _task_message; }
    }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"TaskMessageProto")]
  public partial class TaskMessageProto : global::ProtoBuf.IExtensible
  {
    public TaskMessageProto() {}
    
    private string _source_id;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"source_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string source_id
    {
      get { return _source_id; }
      set { _source_id = value; }
    }
    private byte[] _message;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"message", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public byte[] message
    {
      get { return _message; }
      set { _message = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"EvaluatorStatusProto")]
  public partial class EvaluatorStatusProto : global::ProtoBuf.IExtensible
  {
    public EvaluatorStatusProto() {}
    
    private string _evaluator_id;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"evaluator_id", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string evaluator_id
    {
      get { return _evaluator_id; }
      set { _evaluator_id = value; }
    }
    private State _state;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"state", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public State state
    {
      get { return _state; }
      set { _state = value; }
    }
    private byte[] _error = null;
    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"error", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue(null)]
    public byte[] error
    {
      get { return _error; }
      set { _error = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
    [global::ProtoBuf.ProtoContract(Name=@"State")]
    public enum State
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"INIT", Value=0)]
      INIT = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"RUNNING", Value=1)]
      RUNNING = 1,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DONE", Value=2)]
      DONE = 2,
            
      [global::ProtoBuf.ProtoEnum(Name=@"SUSPEND", Value=3)]
      SUSPEND = 3,
            
      [global::ProtoBuf.ProtoEnum(Name=@"FAILED", Value=4)]
      FAILED = 4,
            
      [global::ProtoBuf.ProtoEnum(Name=@"KILLED", Value=5)]
      KILLED = 5
    }
  
    [global::ProtoBuf.ProtoContract(Name=@"FileType")]
    public enum FileType
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"PLAIN", Value=0)]
      PLAIN = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"LIB", Value=1)]
      LIB = 1,
            
      [global::ProtoBuf.ProtoEnum(Name=@"ARCHIVE", Value=2)]
      ARCHIVE = 2
    }
  
    [global::ProtoBuf.ProtoContract(Name=@"SIZE")]
    public enum SIZE
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"SMALL", Value=0)]
      SMALL = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"MEDIUM", Value=1)]
      MEDIUM = 1,
            
      [global::ProtoBuf.ProtoEnum(Name=@"LARGE", Value=2)]
      LARGE = 2,
            
      [global::ProtoBuf.ProtoEnum(Name=@"XLARGE", Value=3)]
      XLARGE = 3
    }
  
    [global::ProtoBuf.ProtoContract(Name=@"ProcessType")]
    public enum ProcessType
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"JVM", Value=0)]
      JVM = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"CLR", Value=1)]
      CLR = 1
    }
  
}