/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * 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 scouter.client.tags; import java.util.ArrayList; import java.util.Date; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import scouter.client.model.TextProxy; import scouter.client.model.XLogData; import scouter.client.sorter.TableLabelSorter; import scouter.client.util.ColorUtil; import scouter.client.xlog.actions.OpenXLogProfileJob; import scouter.lang.pack.Pack; import scouter.lang.pack.XLogPack; import scouter.util.DateUtil; import scouter.util.FormatUtil; import scouter.util.Hexa32; import scouter.util.IPUtil; public class ServiceTableComposite extends Composite { Composite parent; private TableViewer viewer; private TableColumnLayout tableColumnLayout; int serverId; String yyyymmdd; public ServiceTableComposite(Composite parent, int style) { super(parent, style); this.parent = this; initLayout(); } private void initLayout() { parent.setLayout(new FillLayout()); Composite comp = new Composite(parent, SWT.NONE); tableColumnLayout = new TableColumnLayout(); comp.setLayout(tableColumnLayout); viewer = new TableViewer(comp, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); createColumns(); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(new ArrayContentProvider()); viewer.setComparator(new TableLabelSorter(viewer)); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent e) { StructuredSelection sel = (StructuredSelection) viewer.getSelection(); Object o = sel.getFirstElement(); if (o instanceof XLogPack) { XLogPack data = (XLogPack) o; XLogData d = new XLogData(data, serverId); d.objName = TextProxy.object.getLoadText(yyyymmdd, data.objHash, serverId); d.serviceName = TextProxy.service.getLoadText(yyyymmdd, data.service, serverId); new OpenXLogProfileJob(ServiceTableComposite.this.getDisplay(), d, serverId).schedule(); } else { System.out.println(o); } } }); } public void setInput(ArrayList<Pack> packList, int serverId, String date) { this.serverId = serverId; this.yyyymmdd = date; ArrayList<Integer> serverHashes = new ArrayList<Integer>(packList.size()); for (Pack p : packList) { XLogPack xp = (XLogPack) p; serverHashes.add(xp.service); } TextProxy.service.load(yyyymmdd, serverHashes, serverId); viewer.setInput(packList); } ArrayList<XLogColumnEnum> columnList = new ArrayList<XLogColumnEnum>(); private void createColumns() { for (XLogColumnEnum column : XLogColumnEnum.values()) { createTableViewerColumn(column.getTitle(), column.getWidth(), column.getAlignment(), column.isResizable(), column.isMoveable(), column.isNumber()); columnList.add(column); } viewer.setLabelProvider(new TableItemProvider()); } class TableItemProvider implements ITableLabelProvider, IColorProvider { public Color getForeground(Object element) { if (element instanceof XLogPack) { XLogPack d = (XLogPack) element; if (d.error != 0) { return ColorUtil.getInstance().getColor("red"); } } return null; } public Color getBackground(Object element) { return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if (element instanceof XLogPack == false) { return null; } XLogPack p = (XLogPack) element; XLogColumnEnum column = columnList.get(columnIndex); switch (column) { case OBJECT : return TextProxy.object.getLoadText(yyyymmdd, p.objHash, serverId); case ELAPSED : return FormatUtil.print(p.elapsed, "#,##0"); case SERVICE : return TextProxy.service.getLoadText(yyyymmdd, p.service, serverId); case START_TIME : return FormatUtil.print(new Date(p.endTime - p.elapsed), "HH:mm:ss.SSS"); case END_TIME : return FormatUtil.print(new Date(p.endTime), "HH:mm:ss.SSS"); case TX_ID : return Hexa32.toString32(p.txid); case CPU : return FormatUtil.print(p.cpu, "#,##0"); case SQL_COUNT : return FormatUtil.print(p.sqlCount, "#,##0"); case SQL_TIME : return FormatUtil.print(p.sqlTime, "#,##0"); case KBYTES : return FormatUtil.print(p.kbytes, "#,##0"); case IP : return IPUtil.toString(p.ipaddr); case ERROR : return p.error == 0 ? "" : TextProxy.error.getLoadText(yyyymmdd, p.error, serverId); case GX_ID : return Hexa32.toString32(p.gxid); } return null; } } private TableViewerColumn createTableViewerColumn(String title, int width, int alignment, boolean resizable, boolean moveable, final boolean isNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setAlignment(alignment); column.setMoveable(moveable); tableColumnLayout.setColumnData(column, new ColumnPixelData(width, resizable)); column.setData("isNumber", isNumber); column.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { TableLabelSorter sorter = (TableLabelSorter) viewer.getComparator(); TableColumn selectedColumn = (TableColumn) e.widget; sorter.setColumn(selectedColumn); } }); return viewerColumn; } enum XLogColumnEnum { OBJECT("Object", 150, SWT.LEFT, true, true, false), ELAPSED("Elapsed", 50, SWT.RIGHT, true, true, true), SERVICE("Service", 150, SWT.LEFT, true, true, false), START_TIME("StartTime", 100, SWT.CENTER, true, true, true), END_TIME("EndTime", 100, SWT.CENTER, true, true, true), TX_ID("Txid", 30, SWT.LEFT, true, true, false), CPU("Cpu", 50, SWT.RIGHT, true, true, true), SQL_COUNT("SQL Count", 50, SWT.RIGHT, true, true, true), SQL_TIME("SQL Time", 50, SWT.RIGHT, true, true, true), KBYTES("KBytes", 50, SWT.RIGHT, true, true, true), IP("IP", 100, SWT.LEFT, true, true, false), ERROR("Error", 50, SWT.LEFT, true, true, false), GX_ID("Gxid", 30, SWT.LEFT, true, true, false); private final String title; private final int weight; private final int alignment; private final boolean resizable; private final boolean moveable; private final boolean isNumber; private XLogColumnEnum(String text, int width, int alignment, boolean resizable, boolean moveable, boolean isNumber) { this.title = text; this.weight = width; this.alignment = alignment; this.resizable = resizable; this.moveable = moveable; this.isNumber = isNumber; } public String getTitle(){ return title; } public int getAlignment(){ return alignment; } public boolean isResizable(){ return resizable; } public boolean isMoveable(){ return moveable; } public int getWidth() { return weight; } public boolean isNumber() { return this.isNumber; } } }