/*
* 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.operation.reference.sys.check.node;
import io.crate.data.Input;
import io.crate.metadata.ColumnIdent;
import io.crate.metadata.sys.SysNodeChecksTableInfo;
import io.crate.operation.reference.sys.SysRowUpdater;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.component.LifecycleListener;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.inject.Singleton;
import org.elasticsearch.discovery.Discovery;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.function.BiConsumer;
@Singleton
public class SysNodeChecks implements SysRowUpdater<SysNodeCheck>, Iterable<SysNodeCheck> {
private final Map<BytesRef, SysNodeCheck> checks;
private static final BiConsumer<SysNodeCheck, Input<?>> ackWriter =
(row, input) -> row.acknowledged((Boolean) input.value());
@Inject
public SysNodeChecks(Map<Integer, SysNodeCheck> checks, Discovery discovery, ClusterService clusterService) {
this.checks = new HashMap<>(checks.size());
// we need to wait for the discovery to finish to have a local node id
discovery.addLifecycleListener(new LifecycleListener() {
@Override
public void afterStart() {
BytesRef nodeId = new BytesRef(clusterService.localNode().getId());
for (SysNodeCheck sysNodeCheck : checks.values()) {
sysNodeCheck.setNodeId(nodeId);
SysNodeChecks.this.checks.put(sysNodeCheck.rowId(), sysNodeCheck);
}
}
});
}
@Override
public SysNodeCheck getRow(Object id) {
assert id instanceof BytesRef: "an integer is required as id";
return checks.get(id);
}
@Override
public BiConsumer<SysNodeCheck, Input<?>> getWriter(ColumnIdent ci) {
if (SysNodeChecksTableInfo.Columns.ACKNOWLEDGED.equals(ci)){
return ackWriter;
}
return null;
}
@Override
public Iterator<SysNodeCheck> iterator() {
return checks.values().iterator();
}
}