/*
* Licensed to Crate under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership. Crate 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.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial
* agreement.
*/
package io.crate.plugin;
import org.elasticsearch.cluster.routing.ShardRouting;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexService;
import org.elasticsearch.index.shard.IndexEventListener;
import org.elasticsearch.index.shard.IndexShard;
import org.elasticsearch.index.shard.IndexShardState;
import org.elasticsearch.index.shard.ShardId;
import java.util.ArrayList;
import java.util.List;
/**
* Class that delegates to one or more IndexEventListener which can be set via
* {@link #addFirst(IndexEventListener)} or {@link #addLast(IndexEventListener)}
*
* This is a bit of a hack:
*
* - IndexEventListener can only be registered on the IndexModule during the initialization of a Plugin
* - A IndexEventListener in the SQL module depends on the IndexEventListener of the BLOB module.
* The ordering is important, blob must trigger before sql
*
* This class acts as a proxy that is created during plugin initialization and enables other components to register
* real IndexEventListener lazy/later.
*/
public class IndexEventListenerProxy implements IndexEventListener {
private final List<IndexEventListener> listeners = new ArrayList<>();
public IndexEventListenerProxy() {
}
public void addFirst(IndexEventListener indexEventListener) {
listeners.add(0, indexEventListener);
}
public void addLast(IndexEventListener indexEventListener) {
listeners.add(indexEventListener);
}
@Override
public void shardRoutingChanged(IndexShard indexShard, @Nullable ShardRouting oldRouting, ShardRouting newRouting) {
for (IndexEventListener listener : listeners) {
listener.shardRoutingChanged(indexShard, oldRouting, newRouting);
}
}
@Override
public void afterIndexShardCreated(IndexShard indexShard) {
for (IndexEventListener listener : listeners) {
listener.afterIndexShardCreated(indexShard);
}
}
@Override
public void afterIndexShardStarted(IndexShard indexShard) {
for (IndexEventListener listener : listeners) {
listener.afterIndexShardStarted(indexShard);
}
}
@Override
public void beforeIndexShardClosed(ShardId shardId, @Nullable IndexShard indexShard, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexShardClosed(shardId, indexShard, indexSettings);
}
}
@Override
public void afterIndexShardClosed(ShardId shardId, @Nullable IndexShard indexShard, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.afterIndexShardClosed(shardId, indexShard, indexSettings);
}
}
@Override
public void indexShardStateChanged(IndexShard indexShard, @Nullable IndexShardState previousState, IndexShardState currentState, @Nullable String reason) {
for (IndexEventListener listener : listeners) {
listener.indexShardStateChanged(indexShard, previousState, currentState, reason);
}
}
@Override
public void onShardInactive(IndexShard indexShard) {
for (IndexEventListener listener : listeners) {
listener.onShardInactive(indexShard);
}
}
@Override
public void beforeIndexCreated(Index index, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexCreated(index, indexSettings);
}
}
@Override
public void afterIndexCreated(IndexService indexService) {
for (IndexEventListener listener : listeners) {
listener.afterIndexCreated(indexService);
}
}
@Override
public void beforeIndexShardCreated(ShardId shardId, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexShardCreated(shardId, indexSettings);
}
}
@Override
public void beforeIndexClosed(IndexService indexService) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexClosed(indexService);
}
}
@Override
public void afterIndexClosed(Index index, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.afterIndexClosed(index, indexSettings);
}
}
@Override
public void beforeIndexShardDeleted(ShardId shardId, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexShardDeleted(shardId, indexSettings);
}
}
@Override
public void afterIndexShardDeleted(ShardId shardId, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.afterIndexShardDeleted(shardId, indexSettings);
}
}
@Override
public void afterIndexDeleted(Index index, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.afterIndexDeleted(index, indexSettings);
}
}
@Override
public void beforeIndexDeleted(IndexService indexService) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexDeleted(indexService);
}
}
@Override
public void beforeIndexAddedToCluster(Index index, Settings indexSettings) {
for (IndexEventListener listener : listeners) {
listener.beforeIndexAddedToCluster(index, indexSettings);
}
}
@Override
public void onStoreClosed(ShardId shardId) {
for (IndexEventListener listener : listeners) {
listener.onStoreClosed(shardId);
}
}
}