/*
* Copyright 2010 JBoss Inc
*
* 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.drools.guvnor.client.admin;
import java.util.ArrayList;
import java.util.List;
import org.drools.guvnor.client.common.GenericCallback;
import org.drools.guvnor.client.common.LoadingPopup;
import org.drools.guvnor.client.resources.Images;
import org.drools.guvnor.client.rpc.LogEntry;
import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
import org.drools.guvnor.client.messages.Constants;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.Image;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.SortDir;
import com.gwtext.client.data.ArrayReader;
import com.gwtext.client.data.DateFieldDef;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.MemoryProxy;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.ToolbarSeparator;
import com.gwtext.client.widgets.ToolbarTextItem;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.grid.CellMetadata;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.Renderer;
public class LogViewer extends Composite {
private static Images images = (Images) GWT.create( Images.class );
private Constants constants = ((Constants) GWT.create( Constants.class )); ;
private VerticalPanel layout;
public LogViewer() {
layout = new VerticalPanel();
layout.setHeight( "100%" );
layout.setWidth( "100%" );
refresh();
initWidget( layout );
}
private void refresh() {
LoadingPopup.showMessage( constants.LoadingLogMessages() );
RepositoryServiceFactory.getService().showLog( new GenericCallback<LogEntry[]>() {
public void onSuccess(LogEntry[] logs) {
showLogs( logs );
LoadingPopup.close();
}
} );
}
private void cleanLog() {
LoadingPopup.showMessage( constants.CleaningLogMessages() );
RepositoryServiceFactory.getService().cleanLog( new GenericCallback<java.lang.Void>() {
public void onSuccess(Void v) {
refresh();
LoadingPopup.close();
}
} );
}
private void showLogs(LogEntry[] logs) {
List<LogEntry> entries = new ArrayList<LogEntry>();
// Drop the null rows
for ( int i = 0; i < logs.length; i++ ) {
LogEntry e = logs[i];
if ( e != null ) {
entries.add( e );
}
}
Object[][] data = new Object[entries.size()][3];
for ( int i = 0; i < entries.size(); i++ ) {
LogEntry e = entries.get( i );
data[i][0] = Integer.valueOf( e.severity );
data[i][1] = e.timestamp;
data[i][2] = e.message;
}
MemoryProxy proxy = new MemoryProxy( data );
RecordDef recordDef = new RecordDef( new FieldDef[]{new IntegerFieldDef( "severity" ), new DateFieldDef( "timestamp" ), new StringFieldDef( "message" ),} );
ArrayReader reader = new ArrayReader( recordDef );
Store store = new Store( proxy,
reader );
store.setDefaultSort( "timestamp",
SortDir.DESC );
store.load();
ColumnModel cm = new ColumnModel( new ColumnConfig[]{new ColumnConfig() {
{
setDataIndex( "severity" ); //NON-NLS
setHeader( constants.Severity() );
setSortable( true );
setRenderer( new Renderer() {
public String render(Object value,
CellMetadata cellMetadata,
Record record,
int rowIndex,
int colNum,
Store store) {
Integer i = (Integer) value;
if ( i.intValue() == 0 ) {
return "<img src='" + new Image( images.error() ).getUrl() + "'/>";
} else if ( i.intValue() == 1 ) {
return "<img src='" + new Image( images.information() ).getUrl() + "'/>";
} else {
return "";
}
}
} );
setWidth( 50 );
}
}, new ColumnConfig() {
{
setHeader( constants.Timestamp() );
setSortable( true );
setDataIndex( "timestamp" );
setWidth( 180 );
}
}, new ColumnConfig() {
{
setHeader( constants.Message() );
setSortable( true );
setDataIndex( "message" ); //NON-NLS
setWidth( 580 );
setRenderer( new Renderer() {
public String render(Object value,
CellMetadata cellMetadata,
Record record,
int rowIndex,
int colNum,
Store store) {
if ( value != null ) {
cellMetadata.setHtmlAttribute( "style=\"overflow:auto;\"" ); //NON-NLS
return value.toString();
} else {
return "";
}
}
} );
}
}} );
final GridPanel g = new GridPanel( store,
cm );
g.setWidth( 800 );
g.setHeight( 600 );
Toolbar tb = new Toolbar();
g.setTopToolbar( tb );
tb.addItem( new ToolbarTextItem( constants.ShowRecentLogTip() ) );
tb.addItem( new ToolbarSeparator() );
layout.add( g );
ToolbarButton reload = new ToolbarButton( constants.Reload() );
reload.addListener( new ButtonListenerAdapter() {
public void onClick(Button button,
EventObject e) {
layout.remove( g );
refresh();
}
} );
tb.addButton( reload );
ToolbarButton clean = new ToolbarButton( constants.Clean() );
clean.addListener( new ButtonListenerAdapter() {
public void onClick(Button button,
EventObject e) {
layout.remove( g );
cleanLog();
}
} );
tb.addButton( clean );
}
}