/*
* Copyright (C) 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.jboss.errai.bus.client.util;
import java.util.Collection;
import org.jboss.errai.bus.client.ErraiBus;
import org.jboss.errai.bus.client.framework.ClientMessageBusImpl;
import org.jboss.errai.bus.client.framework.transports.TransportHandler;
import org.jboss.errai.bus.client.framework.transports.TransportStatistics;
import org.jboss.errai.common.client.logging.formatters.ErraiSimpleFormatter;
import org.jboss.errai.common.client.logging.handlers.ErraiConsoleLogHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Mike Brock
*/
public class ManagementConsole {
private final ClientMessageBusImpl clientMessageBus;
private BusErrorDialog errorDialog;
private final Logger logger = LoggerFactory.getLogger(ManagementConsole.class);
private static final String SEP = "-------------------------------------------------------------------";
public ManagementConsole(final ClientMessageBusImpl clientMessageBus) {
this.clientMessageBus = clientMessageBus;
this.errorDialog = new BusErrorDialog(clientMessageBus);
java.util.logging.Logger logger = java.util.logging.Logger.getLogger(ManagementConsole.class.getName());
ErraiSimpleFormatter esf = new ErraiSimpleFormatter("%5$s");
ErraiConsoleLogHandler eclh = new ErraiConsoleLogHandler(esf);
logger.addHandler(eclh);
logger.setUseParentHandlers(false);
declareDebugFunction();
}
public void displayError(final String message, final String additionalDetails, final Throwable e) {
errorDialog.addError(message, additionalDetails, e);
logger.error(message, e);
logger.debug(additionalDetails, e);
}
private native void declareDebugFunction() /*-{
var thisRef = this;
$wnd.errai_status = function () {
thisRef.@org.jboss.errai.bus.client.util.ManagementConsole::displayStatus()();
};
$wnd.errai_list_services = function () {
thisRef.@org.jboss.errai.bus.client.util.ManagementConsole::listServices()();
};
$wnd.errai_show_error_console = function () {
thisRef.@org.jboss.errai.bus.client.util.ManagementConsole::showErrorConsole()();
}
$wnd.errai_bus_stop = function () {
thisRef.@org.jboss.errai.bus.client.util.ManagementConsole::stopBus()();
}
$wnd.errai_bus_start = function () {
thisRef.@org.jboss.errai.bus.client.util.ManagementConsole::startBus()();
}
}-*/;
private void listServices() {
displayUtilityTitle("Service and Routing Table");
logger.info("[REMOTES]");
for (final String remoteName : clientMessageBus.getRemoteServices()) {
logger.info(remoteName);
}
logger.info("[LOCALS]");
for (final String localName : clientMessageBus.getLocalServices()) {
logger.info(localName);
}
logger.info(SEP);
}
private void showErrorConsole() {
this.errorDialog.center();
this.errorDialog.show();
}
/**
* Debugging functions.
*/
private void displayStatus() {
displayUtilityTitle("ErraiBus Transport Status");
final ClientMessageBusImpl bus = (ClientMessageBusImpl) ErraiBus.get();
final boolean federatedApp = BusToolsCli.isRemoteCommunicationEnabled();
logger.info("Bus State : " + (bus.getState()));
logger.info("Wire Protocol : V3.JSON");
logger.info("Active Channel : " + (!federatedApp ? "None" : (bus.getTransportHandler())));
logger.info(SEP);
final TransportStatistics stats = bus.getTransportHandler().getStatistics();
logger.info("Channel Details:");
if (federatedApp) {
logger.info(" Channel Description : " + (stats.getTransportDescription()));
if (stats.isFullDuplex()) {
logger.info(" Endpoint (RX/TX) : " + (stats.getRxEndpoint()));
}
else {
logger.info(" Endpoint (RX) : " + (stats.getRxEndpoint()));
logger.info(" Endpoint (TX) : " + (stats.getTxEndpoint()));
}
logger.info(" Pending Transmissions : " + (stats.getPendingMessages()));
logger.info("");
logger.info(" TX Count : " + (stats.getMessagesSent()));
logger.info(" RX Count : " + (stats.getMessagesReceived()));
final long connectedTime = stats.getConnectedTime();
if (connectedTime == -1) {
logger.info(" Time Connected : Not Connected.");
}
else {
logger.info(" Time Connected : " + ((System.currentTimeMillis() - connectedTime) / 1000) + " secs.");
}
logger.info(" Last Activity (TX/RX) : " + ((System.currentTimeMillis() - stats.getLastTransmissionTime()) / 1000) + " secs ago.");
final int measuredLatency = stats.getMeasuredLatency();
logger.info(" Measured Latency : " + (measuredLatency == -1 ? "N/A" : measuredLatency + "ms"));
}
else {
logger.info(" <No transport configured>");
}
logger.info(SEP);
logger.info("Available Handlers:");
final Collection<TransportHandler> allAvailableHandlers = bus.getAllAvailableHandlers();
if (allAvailableHandlers.isEmpty()) {
logger.info(" [none]");
}
for (final TransportHandler handler : allAvailableHandlers) {
if (handler.isUsable()) {
logger.info(" > " + handler.getStatistics().getTransportDescription() + " " + (handler == bus.getTransportHandler() ? "**" : ""));
}
}
logger.info("Unavailable Handlers");
for (final TransportHandler handler : allAvailableHandlers) {
if (!handler.isUsable()) {
logger.info(" > " + handler.getStatistics().getTransportDescription() + " [reason: " + handler.getStatistics().getUnsupportedDescription() + "]");
}
}
logger.info(SEP);
logger.info("Note: RX and TX counts are network events, not individual messages.");
logger.info(SEP);
}
private void stopBus() {
clientMessageBus.stop(false);
}
private void startBus() {
clientMessageBus.init();
}
private void displayUtilityTitle(final String title) {
logger.info(title);
logger.info(SEP);
}
}