Skip to content

Commit

Permalink
[TRACEUI-33] Sorting in trace view does not apply to the children of …
Browse files Browse the repository at this point in the history
…the root calls

Signed-off-by: Nils Christian Ehmke <nils@rhocas.de>
  • Loading branch information
nils-christian committed Dec 6, 2018
1 parent 131592f commit 67b5f31
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 174 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG
@@ -1,3 +1,8 @@
3.2.1
06 Dec
Bug (TRACEUI-33)
The sorting in the trace view did not apply to the children of the root calls.

3.2.0
05 Sep
Feature (TRACEUI-31)
Expand Down
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-parent</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<relativePath>../../kieker-trace-diagnosis-parent</relativePath>
</parent>

Expand Down
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-parent</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<relativePath>../../kieker-trace-diagnosis-parent</relativePath>
</parent>

Expand Down
Expand Up @@ -19,9 +19,8 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;

import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
Expand All @@ -32,9 +31,7 @@
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.SortType;
import javafx.scene.control.TreeTableView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.ColumnConstraints;
Expand All @@ -43,15 +40,10 @@
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.VBox;
import jfxtras.scene.control.LocalTimeTextField;
import kieker.diagnosis.architecture.service.properties.PropertiesService;
import kieker.diagnosis.architecture.ui.EnumStringConverter;
import kieker.diagnosis.architecture.ui.ViewBase;
import kieker.diagnosis.architecture.ui.components.LongTextField;
import kieker.diagnosis.service.data.MethodCall;
import kieker.diagnosis.service.settings.ClassAppearance;
import kieker.diagnosis.service.settings.MethodAppearance;
import kieker.diagnosis.service.settings.properties.ClassAppearanceProperty;
import kieker.diagnosis.service.settings.properties.MethodAppearanceProperty;
import kieker.diagnosis.service.traces.SearchType;
import kieker.diagnosis.ui.tabs.traces.components.ClassCellValueFactory;
import kieker.diagnosis.ui.tabs.traces.components.DurationCellValueFactory;
Expand Down Expand Up @@ -84,15 +76,7 @@ public class TracesView extends ViewBase<TracesController> {

// Table
private final TreeTableView<MethodCall> ivTreeTableView;
private TreeTableColumn<MethodCall, String> ivDurationColumn;
private TreeTableColumn<MethodCall, String> ivHostColumn;
private TreeTableColumn<MethodCall, String> ivClassColumn;
private TreeTableColumn<MethodCall, String> ivMethodColumn;
private TreeTableColumn<MethodCall, String> ivTraceDepthColumn;
private TreeTableColumn<MethodCall, String> ivTraceSizeColumn;
private TreeTableColumn<MethodCall, String> ivPercentColumn;
private TreeTableColumn<MethodCall, String> ivTimestampColumn;
private TreeTableColumn<MethodCall, String> ivTraceIdColumn;
private TreeTableColumn<MethodCall, Long> ivDurationColumn;

// Details
private final TextField ivDetailsHost;
Expand All @@ -110,9 +94,6 @@ public class TracesView extends ViewBase<TracesController> {

private final Button ivSearchButton;

@Inject
private PropertiesService ivPropertiesService;

@Inject
public TracesView( ) {
// Filter
Expand Down Expand Up @@ -347,57 +328,57 @@ public TracesView( ) {
VBox.setVgrow( ivTreeTableView, Priority.ALWAYS );

{
ivHostColumn = new TreeTableColumn<>( );
ivHostColumn.setCellValueFactory( aParam -> new ReadOnlyStringWrapper( aParam.getValue( ).getValue( ).getHost( ) ) );
ivHostColumn.setText( getLocalizedString( "columnHost" ) );
ivHostColumn.setPrefWidth( 100 );
final TreeTableColumn<MethodCall, String> column = new TreeTableColumn<>( );
column.setCellValueFactory( aParam -> new ReadOnlyObjectWrapper<>( aParam.getValue( ).getValue( ).getHost( ) ) );
column.setText( getLocalizedString( "columnHost" ) );
column.setPrefWidth( 100 );

ivTreeTableView.getColumns( ).add( ivHostColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivClassColumn = new TreeTableColumn<>( );
ivClassColumn.setCellValueFactory( new ClassCellValueFactory( ) );
ivClassColumn.setText( getLocalizedString( "columnClass" ) );
ivClassColumn.setPrefWidth( 200 );
final TreeTableColumn<MethodCall, String> column = new TreeTableColumn<>( );
column.setCellValueFactory( new ClassCellValueFactory( ) );
column.setText( getLocalizedString( "columnClass" ) );
column.setPrefWidth( 200 );

ivTreeTableView.getColumns( ).add( ivClassColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivMethodColumn = new TreeTableColumn<>( );
ivMethodColumn.setCellValueFactory( new MethodCellValueFactory( ) );
ivMethodColumn.setText( getLocalizedString( "columnMethod" ) );
ivMethodColumn.setPrefWidth( 400 );
final TreeTableColumn<MethodCall, String> column = new TreeTableColumn<>( );
column.setCellValueFactory( new MethodCellValueFactory( ) );
column.setText( getLocalizedString( "columnMethod" ) );
column.setPrefWidth( 400 );

ivTreeTableView.getColumns( ).add( ivMethodColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivTraceDepthColumn = new TreeTableColumn<>( );
ivTraceDepthColumn.setCellValueFactory( aParam -> new ReadOnlyStringWrapper( Integer.toString( aParam.getValue( ).getValue( ).getTraceDepth( ) ).intern( ) ) );
ivTraceDepthColumn.setText( getLocalizedString( "columnTraceDepth" ) );
ivTraceDepthColumn.setPrefWidth( 100 );
final TreeTableColumn<MethodCall, Integer> column = new TreeTableColumn<>( );
column.setCellValueFactory( aParam -> new ReadOnlyObjectWrapper<>( aParam.getValue( ).getValue( ).getTraceDepth( ) ) );
column.setText( getLocalizedString( "columnTraceDepth" ) );
column.setPrefWidth( 100 );

ivTreeTableView.getColumns( ).add( ivTraceDepthColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivTraceSizeColumn = new TreeTableColumn<>( );
ivTraceSizeColumn.setCellValueFactory( aParam -> new ReadOnlyStringWrapper( Integer.toString( aParam.getValue( ).getValue( ).getTraceSize( ) ).intern( ) ) );
ivTraceSizeColumn.setText( getLocalizedString( "columnTraceSize" ) );
ivTraceSizeColumn.setPrefWidth( 100 );
final TreeTableColumn<MethodCall, Integer> column = new TreeTableColumn<>( );
column.setCellValueFactory( aParam -> new ReadOnlyObjectWrapper<>( aParam.getValue( ).getValue( ).getTraceSize( ) ) );
column.setText( getLocalizedString( "columnTraceSize" ) );
column.setPrefWidth( 100 );

ivTreeTableView.getColumns( ).add( ivTraceSizeColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivPercentColumn = new TreeTableColumn<>( );
ivPercentColumn.setCellValueFactory( aParam -> new ReadOnlyStringWrapper( Float.toString( aParam.getValue( ).getValue( ).getPercent( ) ).intern( ) ) );
ivPercentColumn.setText( getLocalizedString( "columnPercent" ) );
ivPercentColumn.setPrefWidth( 100 );
final TreeTableColumn<MethodCall, Float> column = new TreeTableColumn<>( );
column.setCellValueFactory( aParam -> new ReadOnlyObjectWrapper<>( aParam.getValue( ).getValue( ).getPercent( ) ) );
column.setText( getLocalizedString( "columnPercent" ) );
column.setPrefWidth( 100 );

ivTreeTableView.getColumns( ).add( ivPercentColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
Expand All @@ -410,119 +391,23 @@ public TracesView( ) {
}

{
ivTimestampColumn = new TreeTableColumn<>( );
ivTimestampColumn.setCellValueFactory( new TimestampCellValueFactory( ) );
ivTimestampColumn.setText( getLocalizedString( "columnTimestamp" ) );
ivTimestampColumn.setPrefWidth( 150 );
final TreeTableColumn<MethodCall, String> column = new TreeTableColumn<>( );
column.setCellValueFactory( new TimestampCellValueFactory( ) );
column.setText( getLocalizedString( "columnTimestamp" ) );
column.setPrefWidth( 150 );

ivTreeTableView.getColumns( ).add( ivTimestampColumn );
ivTreeTableView.getColumns( ).add( column );
}

{
ivTraceIdColumn = new TreeTableColumn<>( );
ivTraceIdColumn.setCellValueFactory( aParam -> new ReadOnlyStringWrapper( Long.toString( aParam.getValue( ).getValue( ).getTraceId( ) ).intern( ) ) );
ivTraceIdColumn.setText( getLocalizedString( "columnTraceId" ) );
ivTraceIdColumn.setPrefWidth( 150 );
final TreeTableColumn<MethodCall, Long> column = new TreeTableColumn<>( );
column.setCellValueFactory( aParam -> new ReadOnlyObjectWrapper<>( aParam.getValue( ).getValue( ).getTraceId( ) ) );
column.setText( getLocalizedString( "columnTraceId" ) );
column.setPrefWidth( 150 );

ivTreeTableView.getColumns( ).add( ivTraceIdColumn );
ivTreeTableView.getColumns( ).add( column );
}

// The default sorting is a little bit too slow. Therefore we use a custom sort policy which sorts directly the data.
ivTreeTableView.setSortPolicy( param -> {
final ObservableList<TreeTableColumn<MethodCall, ?>> sortOrder = param.getSortOrder( );

if ( sortOrder.size( ) == 1 ) {
final TreeTableColumn<MethodCall, ?> tableColumn = sortOrder.get( 0 );

if ( tableColumn == ivHostColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> o1.getValue( ).getHost( ).compareTo( o2.getValue( ).getHost( ) ) );
} else {
items.sort( ( o1, o2 ) -> o2.getValue( ).getHost( ).compareTo( o1.getValue( ).getHost( ) ) );
}
}

if ( tableColumn == ivClassColumn ) {
final ClassAppearance classAppearance = ivPropertiesService.loadApplicationProperty( ClassAppearanceProperty.class );

final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> classAppearance.convert( o1.getValue( ).getClazz( ) ).compareTo( classAppearance.convert( o2.getValue( ).getClazz( ) ) ) );
} else {
items.sort( ( o1, o2 ) -> classAppearance.convert( o2.getValue( ).getClazz( ) ).compareTo( classAppearance.convert( o1.getValue( ).getClazz( ) ) ) );
}
}

if ( tableColumn == ivMethodColumn ) {
final MethodAppearance methodAppearance = ivPropertiesService.loadApplicationProperty( MethodAppearanceProperty.class );

final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> methodAppearance.convert( o1.getValue( ).getMethod( ) ).compareTo( methodAppearance.convert( o2.getValue( ).getMethod( ) ) ) );
} else {
items.sort( ( o1, o2 ) -> methodAppearance.convert( o2.getValue( ).getMethod( ) ).compareTo( methodAppearance.convert( o1.getValue( ).getMethod( ) ) ) );
}
}

if ( tableColumn == ivDurationColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Long.compare( o1.getValue( ).getDuration( ), o2.getValue( ).getDuration( ) ) );
} else {
items.sort( ( o1, o2 ) -> Long.compare( o2.getValue( ).getDuration( ), o1.getValue( ).getDuration( ) ) );
}
}

if ( tableColumn == ivTimestampColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Long.compare( o1.getValue( ).getTimestamp( ), o2.getValue( ).getTimestamp( ) ) );
} else {
items.sort( ( o1, o2 ) -> Long.compare( o2.getValue( ).getTimestamp( ), o1.getValue( ).getTimestamp( ) ) );
}
}

if ( tableColumn == ivTraceIdColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Long.compare( o1.getValue( ).getTraceId( ), o2.getValue( ).getTraceId( ) ) );
} else {
items.sort( ( o1, o2 ) -> Long.compare( o2.getValue( ).getTraceId( ), o1.getValue( ).getTraceId( ) ) );
}
}

if ( tableColumn == ivTraceDepthColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Long.compare( o1.getValue( ).getTraceDepth( ), o2.getValue( ).getTraceDepth( ) ) );
} else {
items.sort( ( o1, o2 ) -> Long.compare( o2.getValue( ).getTraceDepth( ), o1.getValue( ).getTraceDepth( ) ) );
}
}

if ( tableColumn == ivTraceSizeColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Long.compare( o1.getValue( ).getTraceSize( ), o2.getValue( ).getTraceSize( ) ) );
} else {
items.sort( ( o1, o2 ) -> Long.compare( o2.getValue( ).getTraceSize( ), o1.getValue( ).getTraceSize( ) ) );
}
}

if ( tableColumn == ivPercentColumn ) {
final ObservableList<TreeItem<MethodCall>> items = param.getRoot( ).getChildren( );
if ( tableColumn.getSortType( ) == SortType.ASCENDING ) {
items.sort( ( o1, o2 ) -> Float.compare( o1.getValue( ).getPercent( ), o2.getValue( ).getPercent( ) ) );
} else {
items.sort( ( o1, o2 ) -> Float.compare( o2.getValue( ).getPercent( ), o1.getValue( ).getPercent( ) ) );
}
}
}

return true;
} );

getChildren( ).add( ivTreeTableView );
}

Expand Down Expand Up @@ -869,7 +754,7 @@ Label getStatusLabel( ) {
return ivStatusLabel;
}

TreeTableColumn<MethodCall, String> getDurationColumn( ) {
TreeTableColumn<MethodCall, Long> getDurationColumn( ) {
return ivDurationColumn;
}

Expand Down
Expand Up @@ -18,7 +18,7 @@

import java.util.concurrent.TimeUnit;

import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.util.Callback;
Expand All @@ -32,14 +32,14 @@
*
* @author Nils Christian Ehmke
*/
public class DurationCellValueFactory implements Callback<CellDataFeatures<MethodCall, String>, ObservableValue<String>> {
public class DurationCellValueFactory implements Callback<CellDataFeatures<MethodCall, Long>, ObservableValue<Long>> {

private final PropertiesService ivPropertiesService = ServiceFactory.getService( PropertiesService.class );

@Override
public ObservableValue<String> call( final CellDataFeatures<MethodCall, String> aParam ) {
public ObservableValue<Long> call( final CellDataFeatures<MethodCall, Long> aParam ) {
final TimeUnit timeUnit = ivPropertiesService.loadApplicationProperty( TimeUnitProperty.class );
return new ReadOnlyStringWrapper( Long.toString( timeUnit.convert( aParam.getValue( ).getValue( ).getDuration( ), TimeUnit.NANOSECONDS ) ).intern( ) );
return new ReadOnlyObjectWrapper<>( timeUnit.convert( aParam.getValue( ).getValue( ).getDuration( ), TimeUnit.NANOSECONDS ) );
}

}
}
2 changes: 1 addition & 1 deletion kieker-trace-diagnosis-application/pom.xml
Expand Up @@ -5,7 +5,7 @@

<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-application</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<packaging>pom</packaging>

<modules>
Expand Down
2 changes: 1 addition & 1 deletion kieker-trace-diagnosis-architecture/pom.xml
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-parent</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<relativePath>../kieker-trace-diagnosis-parent</relativePath>
</parent>

Expand Down
8 changes: 4 additions & 4 deletions kieker-trace-diagnosis-dependencies/pom.xml
Expand Up @@ -6,7 +6,7 @@

<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-dependencies</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<packaging>pom</packaging>

<properties>
Expand All @@ -30,17 +30,17 @@
<dependency>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-architecture</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-application-ui</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker-trace-diagnosis-application-service</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>net.kieker-monitoring</groupId>
Expand Down

0 comments on commit 67b5f31

Please sign in to comment.