/*
 * 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 com.datastax.driver.core;

/**
 * Interface for objects that are interested in tracking schema change events in the cluster.
 *
 * <p>An implementation of this interface can be registered against a Cluster object through the
 * {@link com.datastax.driver.core.Cluster#register(SchemaChangeListener)} method.
 *
 * <p>Note that the methods defined by this interface will be executed by internal driver threads,
 * and are therefore expected to have short execution times. If you need to perform long
 * computations or blocking calls in response to schema change events, it is strongly recommended to
 * schedule them asynchronously on a separate thread provided by your application code.
 */
public interface SchemaChangeListener {

  /**
   * Called when a keyspace has been added.
   *
   * @param keyspace the keyspace that has been added.
   */
  void onKeyspaceAdded(KeyspaceMetadata keyspace);

  /**
   * Called when a keyspace has been removed.
   *
   * @param keyspace the keyspace that has been removed.
   */
  void onKeyspaceRemoved(KeyspaceMetadata keyspace);

  /**
   * Called when a keyspace has changed.
   *
   * @param current the keyspace that has changed, in its current form (after the change).
   * @param previous the keyspace that has changed, in its previous form (before the change).
   */
  void onKeyspaceChanged(KeyspaceMetadata current, KeyspaceMetadata previous);

  /**
   * Called when a table has been added.
   *
   * @param table the table that has been newly added.
   */
  void onTableAdded(TableMetadata table);

  /**
   * Called when a table has been removed.
   *
   * @param table the table that has been removed.
   */
  void onTableRemoved(TableMetadata table);

  /**
   * Called when a table has changed.
   *
   * @param current the table that has changed, in its current form (after the change).
   * @param previous the table that has changed, in its previous form (before the change).
   */
  void onTableChanged(TableMetadata current, TableMetadata previous);

  /**
   * Called when a user-defined type has been added.
   *
   * @param type the type that has been newly added.
   */
  void onUserTypeAdded(UserType type);

  /**
   * Called when a user-defined type has been removed.
   *
   * @param type the type that has been removed.
   */
  void onUserTypeRemoved(UserType type);

  /**
   * Called when a user-defined type has changed.
   *
   * @param current the type that has changed, in its current form (after the change).
   * @param previous the type that has changed, in its previous form (before the change).
   */
  void onUserTypeChanged(UserType current, UserType previous);

  /**
   * Called when a user-defined function has been added.
   *
   * @param function the function that has been newly added.
   */
  void onFunctionAdded(FunctionMetadata function);

  /**
   * Called when a user-defined function has been removed.
   *
   * @param function the function that has been removed.
   */
  void onFunctionRemoved(FunctionMetadata function);

  /**
   * Called when a user-defined function has changed.
   *
   * @param current the function that has changed, in its current form (after the change).
   * @param previous the function that has changed, in its previous form (before the change).
   */
  void onFunctionChanged(FunctionMetadata current, FunctionMetadata previous);

  /**
   * Called when a user-defined aggregate has been added.
   *
   * @param aggregate the aggregate that has been newly added.
   */
  void onAggregateAdded(AggregateMetadata aggregate);

  /**
   * Called when a user-defined aggregate has been removed.
   *
   * @param aggregate the aggregate that has been removed.
   */
  void onAggregateRemoved(AggregateMetadata aggregate);

  /**
   * Called when a user-defined aggregate has changed.
   *
   * @param current the aggregate that has changed, in its current form (after the change).
   * @param previous the aggregate that has changed, in its previous form (before the change).
   */
  void onAggregateChanged(AggregateMetadata current, AggregateMetadata previous);

  /**
   * Called when a materialized view has been added.
   *
   * @param view the materialized view that has been newly added.
   */
  void onMaterializedViewAdded(MaterializedViewMetadata view);

  /**
   * Called when a materialized view has been removed.
   *
   * @param view the materialized view that has been removed.
   */
  void onMaterializedViewRemoved(MaterializedViewMetadata view);

  /**
   * Called when a materialized view has changed.
   *
   * @param current the materialized view that has changed, in its current form (after the change).
   * @param previous the materialized view that has changed, in its previous form (before the
   *     change).
   */
  void onMaterializedViewChanged(
      MaterializedViewMetadata current, MaterializedViewMetadata previous);

  /**
   * Gets invoked when the listener is registered with a cluster.
   *
   * @param cluster the cluster that this tracker is registered with.
   */
  void onRegister(Cluster cluster);

  /**
   * Gets invoked when the listener is unregistered from a cluster, or at cluster shutdown if the
   * tracker was not unregistered.
   *
   * @param cluster the cluster that this tracker was registered with.
   */
  void onUnregister(Cluster cluster);
}
