/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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.inventory.resource.detail.inventory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.HeaderItem;
import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import org.rhq.core.domain.resource.Agent;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.RefreshableView;
import org.rhq.coregui.client.admin.topology.AgentTableView;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.util.StringUtility;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
/**
* The content pane for the Resource Inventory>Agent subtab.
*
* @author Simeon Pinder
*/
public class ResourceAgentView extends EnhancedVLayout implements RefreshableView {
private int resourceId;
private DynamicForm form;
private StaticTextItem nameValue;
private StaticTextItem addressValue;
private StaticTextItem portValue;
private FormItemIcon agentStatusIcon;
private StaticTextItem lastAvailReportValue;
private StaticTextItem lastAvailPingValue;
private StaticTextItem endpointValue;
private StaticTextItem topologyViewItem;
private boolean loading = false; // will be true if loadData is currently waiting for responses
public ResourceAgentView(int resourceId) {
super();
this.resourceId = resourceId;
}
@Override
protected void onDraw() {
super.onDraw();
setLeft("10%");
setWidth("80%");
this.form = new DynamicForm();
final List<FormItem> formItems = createFormItems();
this.form.setItems(formItems.toArray(new FormItem[formItems.size()]));
loadData();
this.addMember(this.form);
}
@Override
public void refresh() {
loadData();
}
private List<FormItem> createFormItems() {
final List<FormItem> formItems = new ArrayList<FormItem>();
HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title());
headerItem.setValue(MSG.view_inventory_summary_agent_title());
formItems.add(headerItem);
formItems.add(new SpacerItem());
// Name
nameValue = new StaticTextItem("name", MSG.common_title_name());
formItems.add(nameValue);
// Address
String address = "address";
addressValue = new StaticTextItem(address, MSG.common_title_address());
formItems.add(addressValue);
// Port
String port = "port";
portValue = new StaticTextItem(port, MSG.common_title_port());
formItems.add(portValue);
// Agent Status
agentStatusIcon = new FormItemIcon();
agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null));
StaticTextItem agentStatus = new StaticTextItem("agent-comm-status",
MSG.view_inventory_summary_agent_status_title());
agentStatus.setIcons(agentStatusIcon);
agentStatus.setWrapTitle(false);
formItems.add(agentStatus);
// Last Received Avail report
String lastAvailReport = "last-avail-report";
lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG.view_inventory_summary_agent_last_title());
lastAvailReportValue.setWrapTitle(false);
formItems.add(lastAvailReportValue);
// Last Received Avail ping
lastAvailPingValue = new StaticTextItem("last-avail-ping", MSG.view_adminTopology_agent_lastAvailabilityPing());
lastAvailPingValue.setWrapTitle(false);
formItems.add(lastAvailPingValue);
// Full Endpoint
String fullEndpoint = "full-endpoint";
endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint());
formItems.add(endpointValue);
// link to agent topology view
String topologyView = "topology-view";
topologyViewItem = new StaticTextItem("topology-view", MSG.view_admin_topology());
formItems.add(topologyViewItem);
return formItems;
}
private void loadData() {
if (loading) {
return; // we are already loading and waiting for data, no need to re-issue the same queries
}
loading = true;
GWTServiceLookup.getAgentService().getAgentForResource(this.resourceId, new AsyncCallback<Agent>() {
@Override
public void onFailure(Throwable caught) {
loading = false;
//Permissions failure, generate message to that effect
for (Canvas child : form.getChildren()) {
child.destroy();
}
HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title());
headerItem.setValue(MSG.view_inventory_summary_agent_title());
StaticTextItem permissionsMessage = new StaticTextItem("permissions", "permissionsFailure");
permissionsMessage.setShowTitle(false);
permissionsMessage.setValue(MSG.view_inventory_summary_agent_error3());
permissionsMessage.setWrap(false);
form.setFields(headerItem, new SpacerItem(), permissionsMessage);
form.markForRedraw();
}
@Override
public void onSuccess(Agent agent) {
GWTServiceLookup.getAgentService().pingAgentForResource(resourceId, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
loading = false;
CoreGUI.getErrorHandler().handleError(
MSG.view_inventory_summary_agent_error2() + " " + resourceId + ".", caught);
agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null));
form.markForRedraw();
}
@Override
public void onSuccess(Boolean isUp) {
loading = false;
//update icon with correct status
agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(isUp));
form.markForRedraw();
}
});
nameValue.setValue(agent.getName());
addressValue.setValue(agent.getAddress());
portValue.setValue(agent.getPort());
Long lastAvailReport = agent.getLastAvailabilityReport();
lastAvailReportValue.setValue((null != lastAvailReport) ? new Date(lastAvailReport) : MSG
.common_val_none());
Long lastAvailPing = agent.getLastAvailabilityPing();
lastAvailPingValue.setValue((null != lastAvailPing) ? new Date(lastAvailPing) : MSG.common_val_none());
String remoteEndpoint = agent.getRemoteEndpoint();
if (remoteEndpoint != null) {
// some browsers (firefox in particular) won't wrap unless you put breaks in the string
// (EDIT: in FF 16 the wrapping works even without a space, so this could be possibly ommited)
remoteEndpoint = remoteEndpoint.replaceAll("&", " &");
} else {
remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1();
}
endpointValue.setValue(remoteEndpoint);
// make clickable link for agent topology view
String detailsUrl = "#" + AgentTableView.VIEW_PATH + "/" + agent.getId();
String formattedValue = StringUtility.escapeHtml(MSG.common_label_link());
String topologyViewItemText = LinkManager.getHref(detailsUrl, formattedValue);
topologyViewItem.setValue(topologyViewItemText);
form.markForRedraw();
}
});
}
}