/*
* Copyright 2012 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.overlord.rtgov.ui.client.local.pages;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import org.jboss.errai.ui.nav.client.local.Page;
import org.jboss.errai.ui.nav.client.local.PageShown;
import org.jboss.errai.ui.nav.client.local.TransitionAnchor;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.overlord.commons.gwt.client.local.widgets.HtmlSnippet;
import org.overlord.commons.gwt.client.local.widgets.Pager;
import org.overlord.rtgov.ui.client.local.ClientMessages;
import org.overlord.rtgov.ui.client.local.events.TableSortEvent;
import org.overlord.rtgov.ui.client.local.pages.services.ServiceFilters;
import org.overlord.rtgov.ui.client.local.pages.services.ServiceTable;
import org.overlord.rtgov.ui.client.local.services.NotificationService;
import org.overlord.rtgov.ui.client.local.services.ServicesServiceCaller;
import org.overlord.rtgov.ui.client.local.services.rpc.IRpcServiceInvocationHandler;
import org.overlord.rtgov.ui.client.local.widgets.common.SortableTemplatedWidgetTable.SortColumn;
import org.overlord.rtgov.ui.client.model.ApplicationListBean;
import org.overlord.rtgov.ui.client.model.ServiceResultSetBean;
import org.overlord.rtgov.ui.client.model.ServiceSummaryBean;
import org.overlord.rtgov.ui.client.model.ServicesFilterBean;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Button;
/**
* The "Services" page.
*
* @author eric.wittmann@redhat.com
*/
@Templated("/org/overlord/rtgov/ui/client/local/site/services.html#page")
@Page(path="services")
@Dependent
public class ServicesPage extends AbstractPage {
@Inject
protected ClientMessages i18n;
@Inject
protected ServicesServiceCaller servicesService;
@Inject
protected NotificationService notificationService;
// Breadcrumbs
@Inject @DataField("back-to-dashboard")
private TransitionAnchor<DashboardPage> toDashboardPage;
@Inject @DataField("to-situations")
private TransitionAnchor<SituationsPage> toSituationsPage;
@Inject @DataField("filter-sidebar")
protected ServiceFilters filtersPanel;
@Inject @DataField("services-btn-refresh")
protected Button servicesRefreshButton;
@Inject @DataField("services-none")
protected HtmlSnippet noDataMessage;
@Inject @DataField("services-searching")
protected HtmlSnippet searchInProgressMessage;
@Inject @DataField("services-table")
protected ServiceTable servicesTable;
@Inject @DataField("services-pager")
protected Pager pager;
@DataField("services-range")
protected SpanElement rangeSpan = Document.get().createSpanElement();
@DataField("services-total")
protected SpanElement totalSpan = Document.get().createSpanElement();
private int currentServicesPage = 1;
/**
* Constructor.
*/
public ServicesPage() {
}
/**
* Called whenver the page is shown.
*/
@PageShown
public void onPageShown() {
this.servicesService.getApplicationNames(new IRpcServiceInvocationHandler<ApplicationListBean>() {
@Override
public void onReturn(ApplicationListBean data) {
filtersPanel.setApplicationNames(data.getApplicationNames());
// RTGOV-632 Move initial search until app names are loaded to avoid concurrent
// request for access code on server side (EAP issue)
doServicesSearch();
}
@Override
public void onError(Throwable error) {
}
});
}
/**
* Called after construction.
*/
@PostConstruct
protected void postConstruct() {
filtersPanel.addValueChangeHandler(new ValueChangeHandler<ServicesFilterBean>() {
@Override
public void onValueChange(ValueChangeEvent<ServicesFilterBean> event) {
doServicesSearch();
}
});
pager.addValueChangeHandler(new ValueChangeHandler<Integer>() {
@Override
public void onValueChange(ValueChangeEvent<Integer> event) {
doServicesSearch(event.getValue());
}
});
servicesTable.addTableSortHandler(new TableSortEvent.Handler() {
@Override
public void onTableSort(TableSortEvent event) {
doServicesSearch(currentServicesPage);
}
});
servicesTable.setColumnClasses(2, "desktop-only"); //$NON-NLS-1$
servicesTable.setColumnClasses(3, "desktop-only"); //$NON-NLS-1$
servicesTable.setColumnClasses(4, "desktop-only"); //$NON-NLS-1$
this.rangeSpan.setInnerText("?"); //$NON-NLS-1$
this.totalSpan.setInnerText("?"); //$NON-NLS-1$
}
/**
* Event handler that fires when the user clicks the refresh button.
* @param event
*/
@EventHandler("services-btn-refresh")
public void onRefreshClick(ClickEvent event) {
doServicesSearch(currentServicesPage);
}
/**
* Kick off a search at this point so that we show some data in the UI.
* @see org.overlord.dtgov.ui.client.local.pages.AbstractPage#onPageShowing()
*/
@Override
protected void onPageShowing() {
// RTGOV-632 Move initial search until app names are loaded to avoid concurrent
// request for access code on server side (EAP issue)
//doServicesSearch();
filtersPanel.refresh();
}
/**
* Search for services based on the current filter settings.
*/
protected void doServicesSearch() {
doServicesSearch(1);
}
/**
* Search for services based on the current filter settings.
* @param page
*/
protected void doServicesSearch(int page) {
onServicesSearchStarting();
currentServicesPage = page;
SortColumn currentSortColumn = this.servicesTable.getCurrentSortColumn();
servicesService.findServices(filtersPanel.getValue(), page, currentSortColumn.columnId,
currentSortColumn.ascending, new IRpcServiceInvocationHandler<ServiceResultSetBean>() {
@Override
public void onReturn(ServiceResultSetBean data) {
updateServicesTable(data);
updateServicesPager(data);
}
@Override
public void onError(Throwable error) {
notificationService.sendErrorNotification(i18n.format("services.error-loading"), error); //$NON-NLS-1$
noDataMessage.setVisible(true);
searchInProgressMessage.setVisible(false);
}
});
}
/**
* Called when a new search is kicked off.
*/
protected void onServicesSearchStarting() {
this.pager.setVisible(false);
this.searchInProgressMessage.setVisible(true);
this.servicesTable.setVisible(false);
this.noDataMessage.setVisible(false);
this.rangeSpan.setInnerText("?"); //$NON-NLS-1$
this.totalSpan.setInnerText("?"); //$NON-NLS-1$
}
/**
* Updates the table of services with the given data.
* @param data
*/
protected void updateServicesTable(ServiceResultSetBean data) {
this.servicesTable.clear();
this.searchInProgressMessage.setVisible(false);
if (data.getServices().size() > 0) {
for (ServiceSummaryBean deploymentSummaryBean : data.getServices()) {
this.servicesTable.addRow(deploymentSummaryBean);
}
this.servicesTable.setVisible(true);
} else {
this.noDataMessage.setVisible(true);
}
}
/**
* Updates the pager with the given data.
* @param data
*/
protected void updateServicesPager(ServiceResultSetBean data) {
int numPages = ((int) (data.getTotalResults() / data.getItemsPerPage())) + (data.getTotalResults() % data.getItemsPerPage() == 0 ? 0 : 1);
int thisPage = (data.getStartIndex() / data.getItemsPerPage()) + 1;
this.pager.setNumPages(numPages);
this.pager.setPage(thisPage);
if (numPages > 1)
this.pager.setVisible(true);
int startIndex = data.getStartIndex() + 1;
int endIndex = startIndex + data.getServices().size() - 1;
String rangeText = "" + startIndex + "-" + endIndex; //$NON-NLS-1$ //$NON-NLS-2$
String totalText = String.valueOf(data.getTotalResults());
this.rangeSpan.setInnerText(rangeText);
this.totalSpan.setInnerText(totalText);
}
}