//
// 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.
//
package org.apache.activemq.store.kahadb.data;

option java_multiple_files = true;
option java_outer_classname = "JournalData";

enum KahaEntryType {
  //| option java_create_message="true";
  KAHA_TRACE_COMMAND = 0;
  KAHA_ADD_MESSAGE_COMMAND = 1;
  KAHA_REMOVE_MESSAGE_COMMAND = 2;
  KAHA_PREPARE_COMMAND = 3;
  KAHA_COMMIT_COMMAND = 4;
  KAHA_ROLLBACK_COMMAND = 5;
  KAHA_REMOVE_DESTINATION_COMMAND = 6;
  KAHA_SUBSCRIPTION_COMMAND = 7;
  KAHA_PRODUCER_AUDIT_COMMAND = 8;
}

message KahaTraceCommand {
  // We make use of the wonky comment style bellow because the following options
  // are not valid for protoc, but they are valid for the ActiveMQ proto compiler.
  // In the ActiveMQ proto compiler, comments terminate with the pipe character: |

  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaTraceCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";
  
  required string message = 1;
}

message KahaAddMessageCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaAddMessageCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";
  
  optional KahaTransactionInfo transaction_info=1;
  required KahaDestination destination = 2;
  required string messageId = 3;
  required bytes message = 4;
  optional int32 priority =5 [default = 4];
  optional bool prioritySupported = 6;
}

message KahaRemoveMessageCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaRemoveMessageCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  optional KahaTransactionInfo transaction_info=1;
  required KahaDestination destination = 2;
  required string messageId = 3;
  optional bytes ack = 4;
  optional string subscriptionKey = 5;  // Set if it is a topic ack.
}

message KahaPrepareCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaPrepareCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  required KahaTransactionInfo transaction_info=1;
}

message KahaCommitCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaCommitCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  required KahaTransactionInfo transaction_info=1;
}

message KahaRollbackCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaRollbackCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  required KahaTransactionInfo transaction_info=1;
}

message KahaRemoveDestinationCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaRemoveDestinationCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  required KahaDestination destination = 1;
}

message KahaSubscriptionCommand {
  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaSubscriptionCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";

  required KahaDestination destination = 1;
  required string subscriptionKey = 2;
  optional bool retroactive = 3;
  optional bytes subscriptionInfo = 4;
}

message KahaProducerAuditCommand {
  // We make use of the wonky comment style bellow because the following options
  // are not valid for protoc, but they are valid for the ActiveMQ proto compiler.
  // In the ActiveMQ proto compiler, comments terminate with the pipe character: |

  //| option java_implments = "org.apache.activemq.store.kahadb.JournalCommand<KahaProducerAuditCommand>";
  //| option java_visitor = "org.apache.activemq.store.kahadb.Visitor:void:java.io.IOException";
  //| option java_type_method = "KahaEntryType";
  
  required bytes audit = 1;
}

message KahaDestination {
  enum DestinationType {
    QUEUE = 0;
    TOPIC = 1;
    TEMP_QUEUE = 2;
    TEMP_TOPIC = 3;
  }

  required DestinationType type = 1 [default = QUEUE];
  required string name = 2;
}

message KahaTransactionInfo {
  optional KahaLocalTransactionId local_transaction_id=1;
  optional KahaXATransactionId xa_transaction_id=2;
  optional KahaLocation previous_entry=3;
}

message KahaLocalTransactionId {
  required string connection_id=1;
  required int64 transaction_id=1;
}

message KahaXATransactionId {
  required int32 format_id = 1;
  required bytes branch_qualifier = 2;
  required bytes global_transaction_id = 3;
}

message KahaLocation {
  required int32 log_id = 1;  
  required int32 offset = 2;  
}

// TODO things to ponder
// should we move more message fields
// that are set by the sender (and rarely required by the broker
// into the Properties object?
