package org.appfuse.webapp.client.application.base.request; import java.util.logging.Level; import java.util.logging.Logger; import org.appfuse.webapp.client.application.base.security.AuthRequiredEvent; import org.appfuse.webapp.client.application.base.security.RequestForbidenEvent; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.Response; import com.google.gwt.user.client.History; import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport; import com.google.web.bindery.requestfactory.shared.ServerFailure; class CustomDefaultRequestTransport extends DefaultRequestTransport { private static final String SERVER_ERROR = "Server Error"; private static final Logger wireLogger = Logger.getLogger("WireActivityLogger"); private final EventBus eventBus; /** * @param eventBus */ public CustomDefaultRequestTransport(EventBus eventBus) { super(); this.eventBus = eventBus; } @Override protected RequestCallback createRequestCallback(final TransportReceiver receiver) { return new RequestCallback() { public void onError(Request request, Throwable exception) { wireLogger.log(Level.SEVERE, SERVER_ERROR, exception); receiver.onTransportFailure(new ServerFailure(exception.getMessage(), getExceptionName(exception), null, true)); } public void onResponseReceived(Request request, Response response) { wireLogger.finest("Response received"); if (Response.SC_UNAUTHORIZED == response.getStatusCode()) { eventBus.fireEvent(new AuthRequiredEvent()); } else if (Response.SC_FORBIDDEN == response.getStatusCode()) { eventBus.fireEvent(new RequestForbidenEvent()); } else if (Response.SC_OK == response.getStatusCode()) { String text = response.getText(); receiver.onTransportSuccess(text); } else { String message = response.getStatusCode() + " " + response.getText(); wireLogger.severe(SERVER_ERROR + " " + message); receiver.onTransportFailure(new ServerFailure(message, null, null, true)); } } }; } private String getExceptionName(Throwable exception) { Class exceptionType = getMostSpecificCause(exception).getClass(); String simpleName = exceptionType.getName(); // simpleName = simpleName.substring(simpleName.lastIndexOf('.')); // simpleName = simpleName.replace("Exception", ""); return simpleName; } private Throwable getMostSpecificCause(Throwable exception) { if (exception.getCause() != null) { return getMostSpecificCause(exception); } else { return exception; } } }