blob: 8f03ba7e8cc9d5640b002aa9b7664a4746a26514 [file] [log] [blame]
/*
* 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.ignite.internal.management;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.apache.ignite.internal.client.GridClientNode;
import org.apache.ignite.internal.management.api.CommandUtils;
import org.apache.ignite.internal.management.api.ComputeCommand;
import org.apache.ignite.internal.util.typedef.internal.U;
import static java.util.Collections.nCopies;
import static org.apache.ignite.internal.management.SystemViewTask.SimpleType.DATE;
import static org.apache.ignite.internal.management.SystemViewTask.SimpleType.NUMBER;
import static org.apache.ignite.internal.management.SystemViewTask.SimpleType.STRING;
/** Command for printing system view content. */
public class SystemViewCommand implements ComputeCommand<SystemViewCommandArg, SystemViewTaskResult> {
/** Column separator. */
public static final String COLUMN_SEPARATOR = " ";
/** {@inheritDoc} */
@Override public String description() {
return "Print system view content";
}
/** {@inheritDoc} */
@Override public Class<SystemViewCommandArg> argClass() {
return SystemViewCommandArg.class;
}
/** {@inheritDoc} */
@Override public Class<SystemViewTask> taskClass() {
return SystemViewTask.class;
}
/** {@inheritDoc} */
@Override public Collection<GridClientNode> nodes(Collection<GridClientNode> nodes, SystemViewCommandArg arg) {
if (arg.allNodes())
return nodes;
return arg.nodeIds() != null
? CommandUtils.nodes(arg.nodeIds(), nodes)
: CommandUtils.nodeOrNull(arg.nodeId(), nodes);
}
/** {@inheritDoc} */
@Override public void printResult(SystemViewCommandArg arg, SystemViewTaskResult res, Consumer<String> printer) {
if (res != null) {
res.rows().forEach((nodeId, rows) -> {
printer.accept("Results from node with ID: " + nodeId);
printer.accept("---");
printTable(res.attributes(), res.types(), rows, printer);
printer.accept("---" + U.nl());
});
}
else
printer.accept("No system view with specified name was found [name=" + arg.systemViewName() + "]");
}
/**
* Prints specified data rows as table.
*
* @param titles Titles of the table columns.
* @param types Types of the table columns.
* @param data Table data rows.
* @param printer Result printer.
*/
public static void printTable(
List<String> titles,
List<SystemViewTask.SimpleType> types,
List<List<?>> data,
Consumer<String> printer
) {
List<Integer> colSzs;
if (titles != null)
colSzs = titles.stream().map(String::length).collect(Collectors.toList());
else
colSzs = types.stream().map(x -> 0).collect(Collectors.toList());
List<List<String>> rows = new ArrayList<>(data.size());
data.forEach(row -> {
ListIterator<Integer> colSzIter = colSzs.listIterator();
rows.add(row.stream().map(val -> {
String res = String.valueOf(val);
colSzIter.set(Math.max(colSzIter.next(), res.length()));
return res;
}).collect(Collectors.toList()));
});
if (titles != null)
printRow(titles, nCopies(titles.size(), STRING), colSzs, printer);
rows.forEach(row -> printRow(row, types, colSzs, printer));
}
/**
* Prints row content with respect to type and size of each column.
*
* @param row Row which content should be printed.
* @param types Column types in sequential order for decent row formatting.
* @param colSzs Column sizes in sequential order for decent row formatting.
* @param printer Result printer.
*/
private static void printRow(
Collection<String> row,
Collection<SystemViewTask.SimpleType> types,
Collection<Integer> colSzs,
Consumer<String> printer
) {
Iterator<SystemViewTask.SimpleType> typeIter = types.iterator();
Iterator<Integer> colSzsIter = colSzs.iterator();
printer.accept(row.stream().map(colVal -> {
SystemViewTask.SimpleType colType = typeIter.next();
int colSz = colSzsIter.next();
String format = colType == DATE || colType == NUMBER ?
"%" + colSz + "s" :
"%-" + colSz + "s";
return String.format(format, colVal);
}).collect(Collectors.joining(COLUMN_SEPARATOR)));
}
}