/* * 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.util.rpc; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.Response; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.LoginView; import org.rhq.coregui.client.UserSessionManager; import org.rhq.coregui.client.util.Log; /** * @author Greg Hinkle * @author Joseph Marques */ public class TrackingRequestCallback implements RequestCallback { private int id; private String name; private long start = System.currentTimeMillis(); private static final int STATUS_CODE_OK = 200; private static final int STATUS_CODE_ERROR_INTERNET_NO_RESPONSE = 0; private static final int STATUS_CODE_ERROR_INTERNET_CANNOT_CONNECT = 12029; private static final int STATUS_CODE_ERROR_INTERNET_CONNECTION_ABORTED = 12030; private RequestCallback callback; public TrackingRequestCallback(int callId, String name, RequestCallback callback) { this.name = name; this.id = callId; this.callback = callback; } public void onError(Request request, Throwable exception) { if (Log.isTraceEnabled()) { Log.trace(toString() + ": onError " + exception.getMessage()); } RemoteServiceStatistics.record(getName(), getAge()); RPCTracker.getInstance().failCall(this); if (UserSessionManager.isLoggedIn()) { // only handle failures if user still logged in callback.onError(request, exception); } } public void onResponseReceived(Request request, Response response) { int statusCode; String statusText; try { statusCode = response.getStatusCode(); statusText = response.getStatusText(); } catch (Throwable t) { // If the server is unreachable or has terminated firefox may generate a JavaScript exception // when trying to read the response object. Let the user know the server is unreachable. // (http://helpful.knobs-dials.com/index.php/0x80004005_%28NS_ERROR_FAILURE%29_and_other_firefox_errors)) if (UserSessionManager.isLoggedIn()) { CoreGUI.getErrorHandler().handleError(CoreGUI.getMessages().view_core_serverUnreachable(), t); } return; } if (Log.isTraceEnabled()) { Log.trace(toString() + ": " + statusCode + "/" + statusText); } RemoteServiceStatistics.record(getName(), getAge()); switch (statusCode) { case STATUS_CODE_OK: if (response != null && response.getText() != null && response.getText().isEmpty() && !LoginView.isLoginShowing()) { // this happens when the RHQ server was restarted Log.error("RHQ server was probably restarted. Showing the login page."); new LoginView().showLoginDialog(true); break; } RPCTracker.getInstance().succeedCall(this); callback.onResponseReceived(request, response); break; // these status codes are known to be returned from various browsers when the server is lost or not responding case STATUS_CODE_ERROR_INTERNET_NO_RESPONSE: case STATUS_CODE_ERROR_INTERNET_CANNOT_CONNECT: case STATUS_CODE_ERROR_INTERNET_CONNECTION_ABORTED: RPCTracker.getInstance().failCall(this); // If the server is unreachable or has terminated, and the user is still logged in, // let them know the server is now unreachable. if (UserSessionManager.isLoggedIn()) { CoreGUI.getErrorHandler().handleError(CoreGUI.getMessages().view_core_serverUnreachable()); } else { new LoginView().showLoginDialog(true); } break; default: RPCTracker.getInstance().failCall(this); // process the failure only if the user still logged in if (UserSessionManager.isLoggedIn()) { callback.onResponseReceived(request, response); } else { new LoginView().showLoginDialog(true); } } } public int getId() { return id; } public String getName() { return name; } public long getAge() { return System.currentTimeMillis() - start; } public String toString() { return "TrackingRequestCallback[id=" + id + ", name=" + name + ", age=" + getAge() + "]"; } }