/*
 * 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.geode.cache.wan;

import org.apache.geode.cache.wan.GatewaySender.OrderPolicy;

/**
 * Factory to create SerialGatewaySender
 *
 *
 * @since GemFire 7.0
 * @see GatewaySender
 *
 */
public interface GatewaySenderFactory {

  /**
   * Indicates whether all VMs need to distribute events to remote site. In this case only the
   * events originating in a particular VM will be dispatched in order.
   *
   * @param isParallel boolean to indicate whether distribution policy is parallel
   */
  GatewaySenderFactory setParallel(boolean isParallel);

  /**
   * Indicates whether events belonging to the same transaction must be
   * delivered inside the same batch, i.e. they cannot be spread across different
   * batches.
   * <code>groupTransactionEvents</code> can be enabled only on parallel gateway senders
   * or on serial gateway senders with just one dispatcher thread.
   * It cannot be enabled if batch conflation is enabled.
   *
   * @param groupTransactionEvents boolean to indicate whether events from
   *        the same transaction must be delivered inside
   *        the same batch.
   */
  GatewaySenderFactory setGroupTransactionEvents(boolean groupTransactionEvents);

  /**
   * Adds a <code>GatewayEventFilter</code>
   *
   * @param filter GatewayEventFilter
   */
  GatewaySenderFactory addGatewayEventFilter(GatewayEventFilter filter);

  /**
   * Adds a <code>GatewayTransportFilter</code>
   *
   * @param filter GatewayTransportFilter
   */
  GatewaySenderFactory addGatewayTransportFilter(GatewayTransportFilter filter);

  /**
   * Sets the buffer size in bytes of the socket connection for this <code>GatewaySender</code>. The
   * default is 32768 bytes.
   *
   * @param size The size in bytes of the socket buffer
   */
  GatewaySenderFactory setSocketBufferSize(int size);

  /**
   * Sets the number of milliseconds to wait for a response from a <code>GatewayReceiver</code>
   * before timing out the operation and trying another <code>GatewayReceiver</code> (if any are
   * available). Default is 0 which means infinite timeout.
   *
   * @param timeout number of milliseconds to wait for a response from a GatewayReceiver
   * @throws IllegalArgumentException if <code>timeout</code> is less than <code>0</code>.
   */
  GatewaySenderFactory setSocketReadTimeout(int timeout);

  /**
   * Sets the disk store name for overflow or persistence
   *
   */
  GatewaySenderFactory setDiskStoreName(String name);

  /**
   * Sets the number of dispatcher thread. Default number of dispatcher threads is 5.
   *
   */
  GatewaySenderFactory setDispatcherThreads(int numThreads);

  /**
   * Sets <code>OrderPolicy</code> for this GatewaySender. Default order policy is KEY.
   *
   */
  GatewaySenderFactory setOrderPolicy(OrderPolicy policy);

  /**
   * Sets the maximum amount of memory (in MB) for a <code>GatewaySender</code>'s queue. Default is
   * 100.
   *
   * @param maxQueueMemory The maximum amount of memory (in MB) for a <code>GatewaySender</code>'s
   *        queue.
   */
  GatewaySenderFactory setMaximumQueueMemory(int maxQueueMemory);

  /**
   * Sets the batch size to be picked at the time of dispatching from a <code>GatewaySender</code>'s
   * queue. Default batchSize is 100.
   *
   * @param size The size of batches sent from a <code>GatewaySender</code> to its corresponding
   *        <code>GatewayReceiver</code>.
   */
  GatewaySenderFactory setBatchSize(int size);

  /**
   * Sets a time interval in milliseconds to wait to form a batch to be dispatched from a
   * <code>GatewaySender</code>'s queue. Default is 1000.
   *
   * @param interval The maximum time interval (in milliseconds) that can elapse before a partial
   *        batch is sent from a <code>GatewaySender</code> to its corresponding
   *        <code>GatewayReceiver</code>.
   */
  GatewaySenderFactory setBatchTimeInterval(int interval);

  /**
   * Sets whether to enable batch conflation for a <code>GatewaySender</code>'s queue. Default is
   * false.
   *
   * @param isConflation Whether or not to enable batch conflation for batches sent from a
   *        <code>GatewaySender</code> to its corresponding <code>GatewayReceiver</code>.
   */
  GatewaySenderFactory setBatchConflationEnabled(boolean isConflation);

  /**
   * Sets whether to enable persistence for a <code>GatewaySender</code>'s queue. Default is false.
   *
   * @param isPersistence Whether to enable persistence for a <code>GatewaySender</code>'s queue
   */
  GatewaySenderFactory setPersistenceEnabled(boolean isPersistence);

  /**
   * Sets the alert threshold in milliseconds for entries in a <code>GatewaySender</code> 's queue.
   * Default value is 0.
   *
   * @param threshold the alert threshold for entries in a <code>GatewaySender</code>'s queue
   */
  GatewaySenderFactory setAlertThreshold(int threshold);

  /**
   * Sets the manual start boolean property for this <code>GatewaySender</code>. Default is false
   * i.e. the <code>GatewaySender</code> will automatically start once created.
   *
   * @param start the manual start boolean property for this <code>GatewaySender</code>
   * @deprecated - Manual start of senders is deprecated and will be removed in a later release.
   */
  @Deprecated
  GatewaySenderFactory setManualStart(boolean start);

  /**
   * Sets whether or not the writing to the disk is synchronous. Default is true.
   *
   * @param isSynchronous boolean if true indicates synchronous writes
   *
   */
  GatewaySenderFactory setDiskSynchronous(boolean isSynchronous);

  /**
   * Removes the provided <code>GatewayEventFilter</code> from this GatewaySender.
   *
   */
  GatewaySenderFactory removeGatewayEventFilter(GatewayEventFilter filter);

  /**
   * Removes the provided <code>GatewayTransportFilter</code> from this GatewaySender.
   *
   */
  GatewaySenderFactory removeGatewayTransportFilter(GatewayTransportFilter filter);

  GatewaySenderFactory setParallelFactorForReplicatedRegion(int parallel);

  /**
   * Sets the provided <code>GatewayEventSubstitutionFilter</code> in this GatewaySenderFactory.
   *
   * @param filter The <code>GatewayEventSubstitutionFilter</code>
   */
  GatewaySenderFactory setGatewayEventSubstitutionFilter(GatewayEventSubstitutionFilter filter);

  /**
   * If true, receiver member id is checked by all dispatcher threads when the connection is
   * established to ensure they connect to the same receiver. Instead of starting all dispatcher
   * threads in parallel, one thread is started first, and after that the rest are started in
   * parallel. Default is false.
   *
   * @param enforceThreadsConnectSameReceiver boolean if true threads will verify if they are
   *        connected to the same receiver
   *
   */
  GatewaySenderFactory setEnforceThreadsConnectSameReceiver(
      boolean enforceThreadsConnectSameReceiver);

  /**
   * Creates a <code>GatewaySender</code> to communicate with remote distributed system
   *
   * @param id unique id for this SerialGatewaySender
   * @param remoteDSId unique id representing the remote distributed system
   * @return instance of SerialGatewaySender
   * @throws IllegalStateException If the GatewaySender creation fails during validation due to
   *         mismatch of attributes of GatewaySender created on other nodes with same id
   */
  GatewaySender create(String id, int remoteDSId);

}
