/*******************************************************************************
* Copyright (c) 2012, 2013 AGETO Service GmbH and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Gunnar Wagenknecht - initial API and implementation
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.internal.pages.overview;
import java.io.IOException;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import org.eclipse.gyrex.admin.ui.internal.AdminUiActivator;
import org.eclipse.gyrex.admin.ui.internal.application.AdminUiUtil;
import org.eclipse.gyrex.admin.ui.internal.pages.OverviewPageItem;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.apache.commons.lang.exception.ExceptionUtils;
public class SystemStatus extends OverviewPageItem {
@Override
public Control createControl(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(AdminUiUtil.createGridLayoutWithoutMargin(1, true));
composite.setLayoutData(AdminUiUtil.createHorzFillData());
AdminUiUtil.createHeading(composite, "System Status", 1);
final Label desc = new Label(composite, SWT.WRAP);
desc.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
desc.setLayoutData(AdminUiUtil.createHorzFillData());
final IStatus status = AdminUiActivator.getInstance().getSystemStatus();
if (!status.isOK()) {
try {
final StringWriter writer = new StringWriter();
final IStatus[] children = status.getChildren();
// print details for all children of the system status
for (final IStatus child : children) {
writeStatus(child, writer);
}
desc.setText(writer.toString());
} catch (final IOException e) {
desc.setText(ExceptionUtils.getRootCauseMessage(e));
}
} else {
desc.setText("System is running.");
}
return composite;
}
private String getStatusImage(final IStatus status) {
switch (status.getSeverity()) {
case IStatus.CANCEL:
case IStatus.ERROR:
return "/static/error.gif";
case IStatus.WARNING:
return "/static/warning.gif";
case IStatus.INFO:
default:
return "/static/information.gif";
}
}
final void writeEscaped(final Writer writer, final Object object) throws IOException {
if (object == null)
return;
final String string = object.toString();
for (int i = 0; i < string.length(); i++) {
final char c = string.charAt(i);
switch (c) {
case '&':
writer.write("&");
break;
case '<':
writer.write("<");
break;
case '>':
writer.write(">");
break;
default:
if (Character.isISOControl(c) && !Character.isWhitespace(c)) {
writer.write('?');
} else {
writer.write(c);
}
}
}
}
private void writeStatus(final IStatus status, final Writer writer) throws IOException, UnsupportedEncodingException {
// ignore OK status
if (status.isOK())
return;
/*
* sometimes we have a multi status with no message but only children;
* in this case we just print out all children
*/
final String statusMessage = status.getMessage();
if (status.isMultiStatus() && ((statusMessage == null) || (statusMessage.trim().length() == 0))) {
// write only children if a multi status has no message
final IStatus[] children = status.getChildren();
for (final IStatus child : children) {
writeStatusItem(child, writer, 0);
}
} else {
writeStatusItem(status, writer, 0);
}
}
private void writeStatusItem(final IStatus status, final Writer writer, final int identSize) throws IOException {
// ignore OK status
if (status.isOK())
return;
// message
writer.write("<img src=\"" + getStatusImage(status) + "\" height=\"16\" width=\"16\"/> ");
writeEscaped(writer, status.getMessage());
writer.write(" <small><code>(");
writeEscaped(writer, status.getPlugin());
writer.write(", code ");
writeEscaped(writer, String.valueOf(status.getCode()));
writer.write(")</code></small>");
if (status.isMultiStatus()) {
writer.write("<br/>");
final IStatus[] children = status.getChildren();
for (final IStatus child : children) {
writeStatusItem(child, writer, identSize + 4);
}
}
}
}