/*
 * 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.gossip;

import java.util.HashMap;
import java.util.Map;

/**
 * In this object the settings used by the GossipService are held.
 * 
 */
public class GossipSettings {

  /** Time between gossip'ing in ms. Default is 1 second. */
  private int gossipInterval = 10;

  /** Time between cleanups in ms. Default is 10 seconds. */
  private int cleanupInterval = 5000;

  /** the minimum samples needed before reporting a result */
  private int minimumSamples = 5;
  
  /** the number of samples to keep per host */
  private int windowSize = 5000;
  
  /** the threshold for the detector */
  private double convictThreshold = 10;
  
  private String distribution = "normal";
  
  private String activeGossipClass = "org.apache.gossip.manager.SimpleActiveGossipper";
  
  private Map<String,String> activeGossipProperties = new HashMap<>();
  
  private String pathToRingState = "./";
  
  private boolean persistRingState = true;
  
  private String pathToDataState = "./";
  
  private boolean persistDataState = true;
  
  private String pathToKeyStore = "./keys";
  
  private boolean signMessages = false;
  
  
  /**
   * Construct GossipSettings with default settings.
   */
  public GossipSettings() {
  }

  /**
   * Construct GossipSettings with given settings.
   * 
   * @param gossipInterval
   *          The gossip interval in ms.
   * @param cleanupInterval
   *          The cleanup interval in ms.
   */
  public GossipSettings(int gossipInterval, int cleanupInterval, int windowSize, 
          int minimumSamples, double convictThreshold, String distribution) {
    this.gossipInterval = gossipInterval;
    this.cleanupInterval = cleanupInterval;
    this.windowSize = windowSize;
    this.minimumSamples = minimumSamples;
    this.convictThreshold = convictThreshold;
    this.distribution = distribution;
  }

  /**
   * Set the gossip interval. This is the time between a gossip message is send.
   * 
   * @param gossipInterval
   *          The gossip interval in ms.
   */
  public void setGossipTimeout(int gossipInterval) {
    this.gossipInterval = gossipInterval;
  }

  /**
   * Set the cleanup interval. This is the time between the last heartbeat received from a member
   * and when it will be marked as dead.
   * 
   * @param cleanupInterval
   *          The cleanup interval in ms.
   */
  public void setCleanupInterval(int cleanupInterval) {
    this.cleanupInterval = cleanupInterval;
  }

  /**
   * Get the gossip interval.
   * 
   * @return The gossip interval in ms.
   */
  public int getGossipInterval() {
    return gossipInterval;
  }

  /**
   * Get the clean interval.
   * 
   * @return The cleanup interval.
   */
  public int getCleanupInterval() {
    return cleanupInterval;
  }

  public int getMinimumSamples() {
    return minimumSamples;
  }

  public void setMinimumSamples(int minimumSamples) {
    this.minimumSamples = minimumSamples;
  }

  public int getWindowSize() {
    return windowSize;
  }

  public void setWindowSize(int windowSize) {
    this.windowSize = windowSize;
  }

  public double getConvictThreshold() {
    return convictThreshold;
  }

  public void setConvictThreshold(double convictThreshold) {
    this.convictThreshold = convictThreshold;
  }

  public void setGossipInterval(int gossipInterval) {
    this.gossipInterval = gossipInterval;
  }

  public String getDistribution() {
    return distribution;
  }

  public void setDistribution(String distribution) {
    this.distribution = distribution;
  }

  public String getActiveGossipClass() {
    return activeGossipClass;
  }

  public void setActiveGossipClass(String activeGossipClass) {
    this.activeGossipClass = activeGossipClass;
  }

  public Map<String, String> getActiveGossipProperties() {
    return activeGossipProperties;
  }

  public void setActiveGossipProperties(Map<String, String> activeGossipProperties) {
    this.activeGossipProperties = activeGossipProperties;
  }

  public String getPathToRingState() {
    return pathToRingState;
  }

  public void setPathToRingState(String pathToRingState) {
    this.pathToRingState = pathToRingState;
  }

  public boolean isPersistRingState() {
    return persistRingState;
  }

  public void setPersistRingState(boolean persistRingState) {
    this.persistRingState = persistRingState;
  }

  public String getPathToDataState() {
    return pathToDataState;
  }

  public void setPathToDataState(String pathToDataState) {
    this.pathToDataState = pathToDataState;
  }

  public boolean isPersistDataState() {
    return persistDataState;
  }

  public void setPersistDataState(boolean persistDataState) {
    this.persistDataState = persistDataState;
  }

  public String getPathToKeyStore() {
    return pathToKeyStore;
  }

  public void setPathToKeyStore(String pathToKeyStore) {
    this.pathToKeyStore = pathToKeyStore;
  }

  public boolean isSignMessages() {
    return signMessages;
  }

  public void setSignMessages(boolean signMessages) {
    this.signMessages = signMessages;
  }
  
}
