| /** |
| * 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.blur.shell; |
| |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.atomic.AtomicBoolean; |
| |
| import jline.console.ConsoleReader; |
| |
| import org.apache.blur.thirdparty.thrift_0_9_0.TException; |
| import org.apache.blur.thrift.generated.Blur; |
| import org.apache.blur.thrift.generated.Blur.Iface; |
| import org.apache.blur.thrift.generated.BlurException; |
| import org.apache.blur.thrift.generated.CommandStatus; |
| import org.apache.blur.thrift.generated.CommandStatusState; |
| import org.apache.blur.thrift.generated.User; |
| |
| public class WatchCommands extends Command { |
| |
| @Override |
| public void doit(PrintWriter out, Blur.Iface client, String[] args) throws CommandException, TException, |
| BlurException { |
| ConsoleReader reader = this.getConsoleReader(); |
| try { |
| doitInternal(client, reader); |
| } catch (IOException e) { |
| if (Main.debug) { |
| e.printStackTrace(); |
| } |
| throw new CommandException(e.getMessage()); |
| } finally { |
| if (reader != null) { |
| reader.setPrompt(Main.PROMPT); |
| } |
| } |
| } |
| |
| private static void doitInternal(Iface client, ConsoleReader reader) throws IOException, TException, CommandException { |
| TableDisplay tableDisplay = new TableDisplay(reader); |
| tableDisplay.setSeperator("|"); |
| tableDisplay.setHeader(0, "id"); |
| tableDisplay.setHeader(1, "command"); |
| tableDisplay.setHeader(2, "user"); |
| tableDisplay.setHeader(3, "summary"); |
| |
| final AtomicBoolean running = new AtomicBoolean(true); |
| tableDisplay.addKeyHook(new Runnable() { |
| @Override |
| public void run() { |
| synchronized (running) { |
| running.set(false); |
| running.notifyAll(); |
| } |
| } |
| }, 'q'); |
| |
| try { |
| int maxL = 0; |
| while (running.get()) { |
| |
| List<String> commandStatusList = client.commandStatusList(0, Short.MAX_VALUE); |
| List<String[]> display = new ArrayList<String[]>(); |
| for (String id : commandStatusList) { |
| CommandStatus commandStatus; |
| try { |
| commandStatus = client.commandStatus(id); |
| } catch (BlurException e) { |
| String message = e.getMessage(); |
| if (message != null && message.startsWith("NOT_FOUND")) { |
| commandStatus = null; |
| } else { |
| throw e; |
| } |
| } |
| if (commandStatus == null) { |
| continue; |
| } |
| Map<String, Map<CommandStatusState, Long>> serverStateMap = commandStatus.getServerStateMap(); |
| Map<CommandStatusState, Long> summary = ListRunningPlatformCommandsCommand.getSummary(serverStateMap); |
| String executionId = commandStatus.getExecutionId(); |
| String commandName = commandStatus.getCommandName(); |
| User user = commandStatus.getUser(); |
| if (summary.containsKey(CommandStatusState.RUNNING)) { |
| String stringSummary = ListRunningPlatformCommandsCommand.toStringSummary(summary); |
| display.add(new String[] { executionId, commandName, user.toString(), stringSummary }); |
| } else if (summary.containsKey(CommandStatusState.INTERRUPTED)) { |
| display |
| .add(new String[] { executionId, commandName, user.toString(), CommandStatusState.INTERRUPTED.name() }); |
| } else { |
| display.add(new String[] { executionId, commandName, user.toString(), CommandStatusState.COMPLETE.name() }); |
| } |
| } |
| |
| int l = 0; |
| for (String[] array : display) { |
| tableDisplay.set(0, l, array[0]); |
| tableDisplay.set(1, l, array[1]); |
| tableDisplay.set(2, l, array[2]); |
| tableDisplay.set(3, l, array[3]); |
| l++; |
| } |
| if (l > maxL) { |
| maxL = l; |
| } |
| Thread.sleep(3000); |
| } |
| } catch (InterruptedException e) { |
| if (Main.debug) { |
| e.printStackTrace(); |
| } |
| throw new CommandException(e.getMessage()); |
| } finally { |
| tableDisplay.close(); |
| } |
| } |
| |
| @Override |
| public String description() { |
| return "Watch commands execute."; |
| } |
| |
| @Override |
| public String usage() { |
| return ""; |
| } |
| |
| @Override |
| public String name() { |
| return "command-watch"; |
| } |
| } |