package com.hazelcast.samples.spring.data.migration;
import com.hazelcast.core.DistributedObject;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.shell.core.CommandMarker;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Debug diagnostic print of database and Hazelcast content.
*/
@Component
@Slf4j
public class DebugCommands implements CommandMarker {
@Autowired(required = false)
private HazelcastInstance hazelcastInstance;
@Autowired(required = false)
private JdbcTemplate jdbcTemplate;
/**
* Show what is in the database. Would be cleaner with lambdas.
*/
@CliCommand(value = "debugDB", help = "List the database content")
public void debugDB() {
if (this.jdbcTemplate == null) {
log.info("JDBC Template is null");
return;
}
for (String tableName : new String[]{"noun", "verb"}) {
log.info("");
try {
List<Map<String, Object>> resultSet = this.jdbcTemplate.queryForList("SELECT * FROM " + tableName);
log.info("Table '{}'", tableName);
for (int i = 0; i < resultSet.size(); i++) {
Map<String, Object> map = resultSet.get(i);
log.info(" -> Row {}", i);
for (Map.Entry<String, Object> entry : map.entrySet()) {
log.info(" -> {}=='{}'", entry.getKey().toLowerCase(), entry.getValue());
}
}
log.info("[{} row{}]", resultSet.size(), (resultSet.size() == 1 ? "" : "s"));
} catch (Exception e) {
log.error(tableName, e.getMessage());
}
}
log.info("");
}
/**
* Show what is in Hazelcast. Would be cleaner with lambdas.
*
* Don't assume keys are {@link Comparable} though they will be here.
* Hence Map contents aren't sorted.
*/
@CliCommand(value = "debugHZ", help = "List the Hazelcast content")
public void debugHZ() {
if (this.hazelcastInstance == null) {
log.info("Hazelcast instance is null");
return;
}
Collection<DistributedObject> distributedObjects = this.hazelcastInstance.getDistributedObjects();
int mapCount = 0;
for (DistributedObject distributedObject : distributedObjects) {
if (distributedObject instanceof IMap) {
mapCount++;
try {
IMap<?, ?> iMap = (IMap<?, ?>) distributedObject;
log.info("IMap '{}'", iMap.getName());
int count = 0;
for (Map.Entry<?, ?> entry : iMap.entrySet()) {
count++;
log.info(" -> {}=='{}'", entry.getKey(), entry.getValue().toString().toLowerCase());
}
log.info("[{} row{}]", count, (count == 1 ? "" : "s"));
} catch (Exception e) {
log.error(distributedObject.getName(), e);
}
}
}
if (mapCount == 0) {
// Maps created lazily
log.info("Hazelcast is empty");
}
log.info("");
}
}