/*
* 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.openjpa.trader.client;
import java.util.List;
import org.apache.openjpa.trader.client.event.ServiceEvent;
import org.apache.openjpa.trader.client.event.ServiceEventHandler.AddTradableHandler;
import org.apache.openjpa.trader.client.event.ServiceEventHandler.AddTradeHandler;
import org.apache.openjpa.trader.client.event.ServiceEventHandler.RemoveTradableHandler;
import org.apache.openjpa.trader.client.event.ServiceEventHandler.UpdateStockHandler;
import org.apache.openjpa.trader.client.ui.GridCellRenderer;
import org.apache.openjpa.trader.client.ui.ScrollableTable;
import org.apache.openjpa.trader.domain.LogStatement;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
/**
* One of the component widgets to display the server logs.
* The log messages are parsed to determine whether they are SQL statements and further
* categorized as SELECT, INSERT, UPDATE or DELETE to add a decorative CSS style.
* <br>
* CSS styles are
* <LI>sql-insert
* <LI>sql-update
* <LI>sql-select
* <LI>sql-delete
*
* @author Pinaki Poddar
*
*/
public class ServerLogPanel extends ScrollableTable<LogStatement>
implements AddTradableHandler, RemoveTradableHandler,
AddTradeHandler, UpdateStockHandler {
final OpenTrader session;
public static final String[] MARKERS_AND_STYLES = {"SELECT", "INSERT", "UPDATE", "DELETE"};
public ServerLogPanel(final OpenTrader session, final int w, final int h) {
super("Server Log (" + session.getServiceURI() + ")", w,h, false);
this.session = session;
session.registerHandler(ServiceEvent.TradableAdded.TYPE, this);
session.registerHandler(ServiceEvent.TradableRemoved.TYPE, this);
session.registerHandler(ServiceEvent.TradeCommitted.TYPE, this);
session.registerHandler(ServiceEvent.StockUpdated.TYPE, this);
setColumnHeader(0, "Context", "10%");
setColumnHeader(1, "Message", "90%");
setRenderer(0, new GridCellRenderer<LogStatement>() {
public Widget render(LogStatement log) {
return new Label(log.getContext());
}
});
setRenderer(1, new GridCellRenderer<LogStatement>() {
public Widget render(LogStatement log) {
return decorate(log.getMessage(), MARKERS_AND_STYLES);
}
});
}
HTML decorate(String s, String[] markersAndStyles) {
HTML html = new HTML(s);
String style = getStyle(s, MARKERS_AND_STYLES);
if (style != null)
html.addStyleName(style);
return html;
}
static String getStyle(String s, String[] markersAndStyles) {
String style = null;
for (int i = 0; i < markersAndStyles.length; i++) {
String marker = markersAndStyles[i];
int n = marker.length();
if (s.length() < n) {
continue;
}
String preamble = s.substring(0,n);
if (preamble.equalsIgnoreCase(marker)) {
style = "sql-"+marker.toLowerCase();
return style;
}
}
return null;
}
private void log() {
session.getService().getLog(new LoggingCallback());
}
/**
* ---------------------------------------------------------------------------------
* Service Event Response Management
*
* This widget receives all service event update and logs the corresponding server
* logs.
* ---------------------------------------------------------------------------------
*/
public void onTradableAdded(ServiceEvent.TradableAdded event) {
log();
}
public void onTradableRemoved(ServiceEvent.TradableRemoved event) {
log();
}
public void onTradeCommitted(ServiceEvent.TradeCommitted event) {
log();
}
public void onStockUpdated(ServiceEvent.StockUpdated event) {
log();
}
/**
* ---------------------------------------------------------------------------------
* Asynchronous RPC service callbacks
* ---------------------------------------------------------------------------------
*/
/**
* Unlike other callbacks, this callback on completion does not broadcast the log messages.
* Instead it simply inserts the message in its own tabular display.
*/
public class LoggingCallback implements AsyncCallback<List<LogStatement>> {
public void onFailure(Throwable caught) {
session.handleError(caught);
}
public void onSuccess(List<LogStatement> messages) {
if (messages == null)
return;
int N = messages.size();
for (int i = 0; i < N; i++) {
insert(messages.get(i));
}
}
}
}