/*
* Copyright 2013 lorislab.org.
*
* 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.lorislab.smonitor.admin.client;
import org.lorislab.smonitor.admin.client.listener.AgentChangeListener;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableRowElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.watopi.chosen.client.ChosenOptions;
import com.watopi.chosen.client.gwt.ChosenListBox;
import com.watopi.chosen.client.resources.ChozenCss;
import com.watopi.chosen.client.resources.Resources;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.lorislab.smonitor.admin.client.factory.PleaseWaitPanelFactory;
import org.lorislab.smonitor.admin.client.handler.DialogEventHandler;
import org.lorislab.smonitor.admin.client.handler.TableRowHoverHandler;
import org.lorislab.smonitor.admin.client.model.AgentWrapper;
import org.lorislab.smonitor.admin.client.model.SessionWrapper;
import org.lorislab.smonitor.admin.client.panel.PleaseWaitPanel;
import org.lorislab.smonitor.admin.client.panel.QuestionDialogBox;
import org.lorislab.smonitor.admin.client.panel.SessionGridPanel;
import org.lorislab.smonitor.admin.client.panel.SessionInfoDetailsPanel;
import org.lorislab.smonitor.admin.client.service.Client;
import org.lorislab.smonitor.admin.client.service.ClientFactory;
import org.lorislab.smonitor.admin.client.service.RestServiceExceptionCallback;
import org.lorislab.smonitor.admin.client.toolbar.SessionToolbarPanel;
import org.lorislab.smonitor.gwt.uc.page.ViewPage;
import org.lorislab.smonitor.gwt.uc.table.EntityDataGrid;
import org.lorislab.smonitor.gwt.uc.util.ChosenListBoxUtil;
import org.lorislab.smonitor.rs.exception.RestServiceException;
import org.lorislab.smonitor.rs.model.ServerApplication;
import org.lorislab.smonitor.rs.model.SessionInfo;
import org.lorislab.smonitor.rs.model.SessionInfoDetails;
import org.lorislab.smonitor.rs.model.SessionSearchCriteria;
import org.lorislab.smonitor.rs.service.ApplicationService;
/**
* The session view controller.
*
* @author Andrej Petras
*/
public final class SessionsView extends ViewPage implements AgentChangeListener {
@UiField
DockLayoutPanel searchCriteria;
@UiField
FlowPanel searchCriteriaItems;
@UiField(provided = true)
ChosenListBox agentsList;
@UiField(provided = true)
ChosenListBox appList;
@UiField
SessionGridPanel sessionPanel;
@UiField
Button btnSessionReset;
@UiField
Button btnSessionSearch;
@UiField
Label resultCount;
private SessionToolbarPanel sessionToolbar = new SessionToolbarPanel();
private Client<ApplicationService> appService = ClientFactory.create(ApplicationService.class);
private QuestionDialogBox<SessionWrapper> deleteQuestion = new QuestionDialogBox<SessionWrapper>();
private SessionInfoDetailsPanel detailsPanel = new SessionInfoDetailsPanel();
public SessionsView() {
ChosenOptions options = new ChosenOptions();
options.setResources(GWT.<MyResources>create(MyResources.class));
agentsList = new ChosenListBox(true, options);
options = new ChosenOptions();
options.setResources(GWT.<MyResources>create(MyResources.class));
appList = new ChosenListBox(true, options);
initWidget(uiBinder.createAndBindUi(this));
searchCriteria.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
searchCriteriaItems.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
btnSessionReset.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
ChosenListBoxUtil.clearSelected(agentsList);
ChosenListBoxUtil.clearSelected(appList);
}
});
btnSessionSearch.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
SessionSearchCriteria criteria = new SessionSearchCriteria();
criteria.setAgents(ChosenListBoxUtil.getSelectedValues(agentsList));
criteria.setApplications(ChosenListBoxUtil.getSelectedValues(appList));
sessionPanel.reset();
appService.call(sessionSearch, sessionSearchError).findSessions(criteria);
}
});
sessionPanel.setTableRowHoverHandler(new TableRowHoverHandler() {
@Override
public void onRowOver(TableRowElement row) {
int index = row.getRowIndex();
SessionWrapper w = sessionPanel.get(index);
TableCellElement cell = row.getCells().getItem(0);
sessionToolbar.open(cell.getAbsoluteLeft(), cell.getAbsoluteTop(), w);
}
@Override
public void onRowOut() {
sessionToolbar.close();
}
});
sessionPanel.setChangeSizeHandler(new EntityDataGrid.ChangeSizeHandler() {
@Override
public void changeSize(int size) {
resultCount.setText("# " + sessionPanel.size());
}
});
sessionToolbar.setHandler(new SessionToolbarPanel.ClickButtonHandler() {
@Override
public void info(SessionWrapper data) {
PleaseWaitPanelFactory.open();
appService.call(sessionDetails).getSesssionDetails(data.data.getGuid(), data.data.getHost(), data.data.getApplication(), data.data.getId());
}
@Override
public void delete(SessionWrapper data) {
deleteQuestion.open(data, "Delete Session", "Do you really want to delete selected session " + data.data.getId() + " ?");
}
@Override
public void refresh(SessionWrapper data) {
sessionPanel.request(data);
appService.call(sessionRefresh).getSesssion(data.data.getGuid(), data.data.getHost(), data.data.getApplication(), data.data.getId());
}
});
deleteQuestion.setOkHandler(new DialogEventHandler<SessionWrapper>() {
@Override
public void event(SessionWrapper data) {
appService.call(sessionDelete).deleteSesssion(data.data.getGuid(), data.data.getHost(), data.data.getApplication(), data.data.getId());
}
});
}
@Override
public void openPage() {
sessionToolbar.close();
deleteQuestion.close();
}
@Override
public void closePage() {
sessionToolbar.close();
deleteQuestion.close();
}
@Override
public String getPageTitle() {
return "Sessions";
}
final RemoteCallback<List<SessionInfo>> sessionSearch = new RemoteCallback<List<SessionInfo>>() {
@Override
public void callback(List<SessionInfo> value) {
sessionPanel.reset();
sessionPanel.addAllItems(value);
}
};
final RemoteCallback<SessionInfo> sessionRefresh = new RemoteCallback<SessionInfo>() {
@Override
public void callback(SessionInfo value) {
if (value != null) {
sessionPanel.replaceById(value.getId(), value);
}
}
};
final RemoteCallback<SessionInfoDetails> sessionDetails = new RemoteCallback<SessionInfoDetails>() {
@Override
public void callback(SessionInfoDetails value) {
if (value != null) {
detailsPanel.open(value);
}
PleaseWaitPanelFactory.close(false);
}
};
final RestServiceExceptionCallback sessionSearchError = new RestServiceExceptionCallback() {
@Override
public void exception(RestServiceException exception) {
}
};
final RemoteCallback<String> sessionDelete = new RemoteCallback<String>() {
@Override
public void callback(String value) {
sessionPanel.removeById(value);
deleteQuestion.close();
}
};
/**
* {@inheritDoc}
*/
@Override
public void agentChanged(List<AgentWrapper> data) {
sessionPanel.reset();
agentsList.clear();
appList.clear();
if (data != null) {
Set<String> tmp = new HashSet<String>();
for (AgentWrapper w : data) {
if (w.server != null) {
agentsList.addItem(w.data.getName(), w.data.getGuid());
List<ServerApplication> apps = w.server.getApplications();
if (apps != null) {
for (ServerApplication a : apps) {
if (!tmp.contains(a.getId())) {
appList.addItem(a.getName(), a.getId());
tmp.add(a.getId());
}
}
}
}
}
}
}
interface MyUiBinder extends UiBinder<Widget, SessionsView> {
}
private static SessionsView.MyUiBinder uiBinder = GWT.create(SessionsView.MyUiBinder.class);
public interface MyResources extends Resources {
@ClientBundle.Source("chozen.css")
@Override
ChozenCss css();
}
}