package com.griddynamics.jagger.webclient.client.components; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.*; import com.griddynamics.jagger.webclient.client.NodeInfoService; import com.griddynamics.jagger.dbapi.dto.NodeInfoPerSessionDto; import com.griddynamics.jagger.dbapi.dto.SessionDataDto; import com.griddynamics.jagger.webclient.client.resources.JaggerResources; import com.griddynamics.jagger.webclient.client.trends.TrendsPlace; import java.util.*; public class NodesPanel extends Composite { interface NodesPanelUiBinder extends UiBinder<Widget, NodesPanel> { } private static NodesPanelUiBinder ourUiBinder = GWT.create(NodesPanelUiBinder.class); @UiField VerticalPanel pane; private Set<String > currentSessionIds = new HashSet<String>(); private Label noDataLabel; private boolean enableShowNodeInfo = false; private boolean needToUpdateNodeInfo = true; private VerticalPanel tableBackgroundPanel; private HorizontalPanel controlBackgroundPanel; private Image loadIndicatorImage; private TrendsPlace place; public NodesPanel() { initWidget(ourUiBinder.createAndBindUi(this)); setControlBackgroundPanel(); setTableBackgroundPanel(); pane.add(controlBackgroundPanel); pane.add(tableBackgroundPanel); clear(); } public void clear() { tableBackgroundPanel.clear(); enableShowNodeInfo = false; needToUpdateNodeInfo = true; currentSessionIds.clear(); } public void updateSetup(Set<SessionDataDto> chosenSessions, TrendsPlace place) { // Update currently selected sessions for (SessionDataDto session : chosenSessions) { currentSessionIds.add(session.getSessionId()); } if (currentSessionIds.size() > 0) { needToUpdateNodeInfo = true; enableShowNodeInfo = true; } // Set place to handle exception window this.place = place; } private void setNoDataLabel() { noDataLabel = new Label("No info about nodes available"); noDataLabel.getElement().getStyle().setFontSize(12, Style.Unit.PX); noDataLabel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT); noDataLabel.setHeight("100%"); } public void getNodeInfo() { if ((enableShowNodeInfo) && (needToUpdateNodeInfo)) nodeInfoFetcher.fetchNodeInfo(currentSessionIds); } private void setLoadIndicatorImage() { ImageResource imageResource = JaggerResources.INSTANCE.getLoadIndicator(); loadIndicatorImage = new Image(imageResource); loadIndicatorImage.setVisible(false); } private void setControlBackgroundPanel() { controlBackgroundPanel = new HorizontalPanel(); controlBackgroundPanel.setWidth("100%"); setLoadIndicatorImage(); controlBackgroundPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); controlBackgroundPanel.add(loadIndicatorImage); } private void setTableBackgroundPanel() { tableBackgroundPanel = new VerticalPanel(); tableBackgroundPanel.setSpacing(10); setNoDataLabel(); } private void createTables(List<NodeInfoPerSessionDto> nodeInfoPerSessionDtoList) { if (nodeInfoPerSessionDtoList.size() > 0) { //sort by sessionId SortedSet<NodeInfoPerSessionDto> sortedNodeInfoPerSessionDtoList = new TreeSet<NodeInfoPerSessionDto>(new Comparator<NodeInfoPerSessionDto>() { @Override public int compare(NodeInfoPerSessionDto o, NodeInfoPerSessionDto o2) { return (Long.parseLong(o.getSessionId()) - Long.parseLong(o2.getSessionId())) > 0 ? 1 : -1; } }); sortedNodeInfoPerSessionDtoList.addAll(nodeInfoPerSessionDtoList); // build tables tableBackgroundPanel.setVisible(false); for (NodeInfoPerSessionDto nodeInfoPerSessionDto : sortedNodeInfoPerSessionDtoList) { NodesTablePanel nodesTablePanel = new NodesTablePanel(); nodesTablePanel.createTable(nodeInfoPerSessionDto.getSessionId(), nodeInfoPerSessionDto.getNodes()); tableBackgroundPanel.add(nodesTablePanel); } tableBackgroundPanel.setVisible(true); } else { tableBackgroundPanel.add(noDataLabel); } } private void displayBeforeLoad() { tableBackgroundPanel.clear(); enableShowNodeInfo = false; loadIndicatorImage.setVisible(true); } private void displayAfterLoad() { loadIndicatorImage.setVisible(false); enableShowNodeInfo = true; needToUpdateNodeInfo = false; } private NodeInfoFetcher nodeInfoFetcher = new NodeInfoFetcher(); private class NodeInfoFetcher { public void fetchNodeInfo(Set<String> sessionIds) { displayBeforeLoad(); NodeInfoService.Async.getInstance().getNodeInfo(sessionIds, new AsyncCallback<List<NodeInfoPerSessionDto>>() { @Override public void onFailure(Throwable caught) { caught.printStackTrace(); new ExceptionPanel(place, caught.getMessage()); displayAfterLoad(); } @Override public void onSuccess(List<NodeInfoPerSessionDto> result) { createTables(result); displayAfterLoad(); } }); } } }