/*
* RHQ Management Platform
* Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.coregui.client.admin.storage;
import java.util.Map;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.tab.events.TabSelectedEvent;
import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
import org.rhq.coregui.client.BookmarkableView;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.IconEnum;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.UserSessionManager;
import org.rhq.coregui.client.ViewPath;
import org.rhq.coregui.client.admin.AdministrationView;
import org.rhq.coregui.client.components.tab.NamedTab;
import org.rhq.coregui.client.components.tab.NamedTabSet;
import org.rhq.coregui.client.components.view.ViewName;
import org.rhq.coregui.client.dashboard.AutoRefreshUtil;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.inventory.AutoRefresh;
import org.rhq.coregui.client.util.Log;
import org.rhq.coregui.client.util.StringUtility;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
/**
* The main view for managing storage nodes.
*
* @author Jirka Kremser
*/
public class StorageNodeAdminView extends EnhancedVLayout implements BookmarkableView, AutoRefresh {
public static final ViewName VIEW_ID = new ViewName("StorageNodes", MSG.view_adminTopology_storageNodes(),
IconEnum.STORAGE_NODE);
public static final String VIEW_PATH = AdministrationView.VIEW_ID + "/"
+ AdministrationView.SECTION_TOPOLOGY_VIEW_ID + "/" + VIEW_ID;
private final NamedTabSet tabset;
private TabInfo tableTabInfo = new TabInfo(0, new ViewName("Nodes",
MSG.view_adminTopology_storageNodes_tabs_nodes()));
private TabInfo settingsTabInfo = new TabInfo(1, new ViewName("Settings",
MSG.view_adminTopology_storageNodes_tabs_settings()));
private TabInfo alertsTabInfo = new TabInfo(2, new ViewName("Alerts",
MSG.view_adminTopology_storageNodes_tabs_alerts()));
private StorageNodeTableView table;
private final NamedTab alerts;
private Timer refresher;
private volatile boolean isRefreshing;
private Map<Integer, Integer> resIdsToStorageNodeIdsMap;
public StorageNodeAdminView() {
super();
setHeight100();
setWidth100();
setLayoutTopMargin(8);
tabset = new NamedTabSet();
NamedTab table = new NamedTab(tableTabInfo.name);
table.addTabSelectedHandler(new TabSelectedHandler() {
public void onTabSelected(TabSelectedEvent event) {
CoreGUI.goToView(VIEW_PATH);
}
});
NamedTab settings = new NamedTab(settingsTabInfo.name);
settings.addTabSelectedHandler(new TabSelectedHandler() {
public void onTabSelected(TabSelectedEvent event) {
CoreGUI.goToView(VIEW_PATH + "/" + settingsTabInfo.name);
}
});
alerts = new NamedTab(alertsTabInfo.name);
alerts.addTabSelectedHandler(new TabSelectedHandler() {
public void onTabSelected(TabSelectedEvent event) {
CoreGUI.goToView(VIEW_PATH + "/" + alertsTabInfo.name);
}
});
tabset.setTabs(table, settings, alerts);
addMember(tabset);
}
private void showTab(final TabInfo tabInfo) {
if (tabInfo.equals(tableTabInfo)) {
table = new StorageNodeTableView();
tabset.getTabByName(tabInfo.name.getName()).setPane(table);
tabset.selectTab(tabInfo.index);
} else if (tabInfo.equals(alertsTabInfo)) {
if (resIdsToStorageNodeIdsMap != null) {
tabset.getTabByName(tabInfo.name.getName()).setPane(
new StorageNodeAlertHistoryView("storageNodesAlerts", resIdsToStorageNodeIdsMap));
} else {
GWTServiceLookup.getStorageService().findResourcesWithAlertDefinitions(
new AsyncCallback<Map<Integer, Integer>>() {
@Override
public void onFailure(Throwable caught) {
if (!UserSessionManager.isLoggedOut()) {
CoreGUI.getErrorHandler().handleError(
MSG.view_adminTopology_storageNodes_fetchFail2() + ": " + caught.getMessage(),
caught);
}
}
@Override
public void onSuccess(Map<Integer, Integer> result) {
if (result == null || result.size() == 0) {
onFailure(new Exception(MSG.view_adminTopology_storageNodes_fetchFail3()));
} else {
resIdsToStorageNodeIdsMap = result;
tabset.getTabByName(tabInfo.name.getName()).setPane(
new StorageNodeAlertHistoryView("storageNodesAlerts", resIdsToStorageNodeIdsMap));
tabset.selectTab(tabInfo.index);
}
}
});
}
} else if (tabInfo.equals(settingsTabInfo)) {
ClusterConfigurationEditor editor = new ClusterConfigurationEditor(false);
tabset.getTabByName(tabInfo.name.getName()).setPane(editor);
tabset.selectTab(tabInfo.index);
}
}
public static String getAlertsString(String prefix, int numOfUnackAlerts) {
return getAlertsString(prefix, -1, numOfUnackAlerts);
}
public static String getAlertsString(String prefix, int storageNodeId, int numOfUnackAlerts) {
String detailsUrl = "#" + VIEW_PATH + "/" + storageNodeId + "/Alerts";
detailsUrl = StringUtility.escapeHtml(detailsUrl);
String value = prefix
+ (numOfUnackAlerts != 0 ? " <span style='color: #CC0000;'>(" + numOfUnackAlerts + ")</span>" : " ("
+ numOfUnackAlerts + ")");
return storageNodeId == -1 ? value : LinkManager.getHref(detailsUrl, value);
}
private static final class TabInfo {
private int index;
private ViewName name;
private TabInfo(int index, ViewName name) {
this.index = index;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + index;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TabInfo other = (TabInfo) obj;
if (index != other.index)
return false;
return true;
}
}
@Override
public void renderView(ViewPath viewPath) {
if (viewPath.getViewPath().size() == 3) {
showTab(tableTabInfo);
} else {
String viewId = viewPath.getCurrent().getPath();
if (settingsTabInfo.name.getName().equals(viewId)) {
showTab(settingsTabInfo);
} else if (alertsTabInfo.name.getName().equals(viewId)) {
showTab(alertsTabInfo);
} else { //default
showTab(tableTabInfo);
table.renderView(viewPath);
}
}
}
private void refreshNotAcknowledgedStorageNodeAlertsCount() {
isRefreshing = true;
GWTServiceLookup.getStorageService().findNotAcknowledgedStorageNodeAlertsCount(new AsyncCallback<Integer>() {
@Override
public void onSuccess(Integer result) {
Log.info("Running the task for fetching the number of ALL unack alerts...");
alerts.setTitle(StorageNodeAdminView.getAlertsString(alerts.getTitle(), result));
isRefreshing = false;
}
@Override
public void onFailure(Throwable caught) {
if (!UserSessionManager.isLoggedOut()) {
Log.error("Unable to fetch the unack alerts: " + caught.getMessage());
}
}
});
}
@Override
public void startRefreshCycle() {
Log.info("Scheduling the repetitive task for fetching the number of ALL unack alerts...");
refresher = AutoRefreshUtil.startRefreshCycle(this, this, refresher, 15000);
}
@Override
public boolean isRefreshing() {
return isRefreshing;
}
@Override
public void refresh() {
refreshNotAcknowledgedStorageNodeAlertsCount();
}
@Override
protected void onDraw() {
super.onDraw();
startRefreshCycle();
}
@Override
protected void onDestroy() {
stopRefreshing();
super.onDestroy();
}
private void stopRefreshing() {
Log.info("Unscheduling the repetitive task for fetching the number of ALL unack alerts...");
AutoRefreshUtil.onDestroy(refresher);
isRefreshing = false;
}
}