improved error handling by indroducing an error view and a shared ErrorMessage composite

This commit is contained in:
fmittag committed 2014-08-12 17:28:03 +02:00
1 parent 5ed7c8123e
commit 19b879f49b
20 files changed
+250 -9

No files matched your search

@@ -5,6 +5,7 @@ import java.util.List;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.home.client.place.error.TabletAndDesktopErrorView;
import com.sap.sailing.gwt.home.client.place.event.EventView;
import com.sap.sailing.gwt.home.client.place.event.EventWithoutRegattasView;
import com.sap.sailing.gwt.home.client.place.event.TabletAndDesktopEventView;
@@ -55,6 +56,11 @@ public class SmartphoneApplicationClientFactory extends AbstractApplicationClien
return new TabletAndDesktopEventsView(getPlaceNavigator());
}
@Override
public TabletAndDesktopErrorView createErrorView(String errorMessage, Throwable errorReason) {
return new TabletAndDesktopErrorView(errorMessage, errorReason);
}
@Override
public StartView createStartView() {
return new TabletAndDesktopStartView(getPlaceNavigator());
@@ -5,6 +5,7 @@ import java.util.List;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.home.client.place.error.TabletAndDesktopErrorView;
import com.sap.sailing.gwt.home.client.place.event.EventView;
import com.sap.sailing.gwt.home.client.place.event.EventWithoutRegattasView;
import com.sap.sailing.gwt.home.client.place.event.TabletAndDesktopEventView;
@@ -45,6 +46,11 @@ public class TabletAndDesktopApplicationClientFactory extends AbstractApplicatio
return new TabletAndDesktopEventView(getSailingService(), event, raceGroups, leaderboardName, timerForClientServerOffset);
}
@Override
public TabletAndDesktopErrorView createErrorView(String errorMessage, Throwable errorReason) {
return new TabletAndDesktopErrorView(errorMessage, errorReason);
}
@Override
public EventWithoutRegattasView createEventWithoutRegattasView(EventDTO event) {
return new TabletAndDesktopEventWithoutRegattasView(getSailingService(), event);
@@ -23,6 +23,9 @@ public interface TextMessages extends Messages {
String viewAnalysis();
String overallLeaderboard();
String pleaseEnterASearchTerm();
String pleaseTryAgain();
String reloadPage();
String errorMessageLoadingData();
String countdownDays();
String countdownHours();
@@ -14,7 +14,10 @@ races=Races
moreInfo=More info
viewAnalysis=View analysis
overallLeaderboard=Overall leaderboard
pleaseEnterASearchTerm=Bitte gebe einen Suchbegriff ein.
pleaseEnterASearchTerm=Please enter a search term.
pleaseTryAgain=Please try again...
reloadPage=Reload page
errorMessageLoadingData=An error occured while loading the data for this page.
countdownDays=Days
countdownHours=Hrs
@@ -14,7 +14,10 @@ races=Rennen
moreInfo=Weitere Informationen
viewAnalysis=Analyzen ansehen
overallLeaderboard=Gesamtergebnis
pleaseEnterASearchTerm=Please enter a search term.
pleaseEnterASearchTerm=Bitte gebe einen Suchbegriff ein.
pleaseTryAgain=Bitte versuchen sie es erneut...
reloadPage=Seite neu laden
errorMessageLoadingData=Beim Laden der Daten für diese Seite ist ein Fehler aufgetreten.
countdownDays=Tage
countdownHours=Std.
@@ -0,0 +1,18 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class ErrorActivity extends AbstractActivity {
public ErrorActivity(ErrorPlace place, ErrorClientFactory clientFactory) {
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
// TODO: the error place should get the error message from the place
panel.setWidget(new TabletAndDesktopErrorView(null, null));
}
}
@@ -0,0 +1,25 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.google.gwt.core.client.GWT;
import com.sap.sse.gwt.client.mvp.AbstractActivityProxy;
public class ErrorActivityProxy extends AbstractActivityProxy {
private final ErrorClientFactory clientFactory;
private final ErrorPlace place;
public ErrorActivityProxy(ErrorPlace place, ErrorClientFactory clientFactory) {
this.place = place;
this.clientFactory = clientFactory;
}
@Override
protected void startAsync() {
GWT.runAsync(new AbstractRunAsyncCallback() {
@Override
public void onSuccess() {
super.onSuccess(new ErrorActivity(place, clientFactory));
}
});
}
}
@@ -0,0 +1,7 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.sap.sailing.gwt.ui.client.SailingClientFactory;
public interface ErrorClientFactory extends SailingClientFactory {
}
@@ -0,0 +1,19 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.sap.sailing.gwt.home.client.AbstractBasePlace;
public class ErrorPlace extends AbstractBasePlace {
public static class Tokenizer implements PlaceTokenizer<ErrorPlace> {
@Override
public String getToken(ErrorPlace place) {
return null;
}
@Override
public ErrorPlace getPlace(String token) {
return new ErrorPlace();
}
}
}
@@ -0,0 +1,7 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.google.gwt.user.client.ui.Widget;
public interface ErrorView {
Widget asWidget();
}
@@ -0,0 +1,23 @@
package com.sap.sailing.gwt.home.client.place.error;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.home.client.shared.error.ErrorMessage;
public class TabletAndDesktopErrorView extends Composite implements ErrorView {
private static ErrorViewUiBinder uiBinder = GWT.create(ErrorViewUiBinder.class);
interface ErrorViewUiBinder extends UiBinder<Widget, TabletAndDesktopErrorView> {
}
@UiField(provided=true) ErrorMessage errorMessage;
public TabletAndDesktopErrorView(String errorMessageText, Throwable errorReason) {
errorMessage = new ErrorMessage(errorMessageText, errorReason);
initWidget(uiBinder.createAndBindUi(this));
}
}
@@ -0,0 +1,9 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="res" type="com.sap.sailing.gwt.home.client.HomeResources" />
<g:HTMLPanel>
<s:error.ErrorMessage ui:field='errorMessage'/>
</g:HTMLPanel>
</ui:UiBinder>
@@ -9,6 +9,7 @@ import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.gwt.home.client.place.error.ErrorView;
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
import com.sap.sailing.gwt.ui.regattaoverview.RegattaRaceStatesSettings;
import com.sap.sailing.gwt.ui.shared.EventDTO;
@@ -78,7 +79,7 @@ public class EventActivity extends AbstractActivity {
@Override
public void onFailure(Throwable caught) {
Window.alert("Shit happens at getRegattaStructureForEvent()");
createErrorView("Error while loading the regatta structure with service getRegattaStructureOfEvent()", caught, panel);
}
});
} else {
@@ -88,11 +89,16 @@ public class EventActivity extends AbstractActivity {
@Override
public void onFailure(Throwable caught) {
Window.alert("Shit happens at getRegattaStructureForEvent()");
createErrorView("Error while loading the event with service getEventById()", caught, panel);
}
});
}
private void createErrorView(String errorMessage, Throwable errorReason, AcceptsOneWidget panel) {
ErrorView view = clientFactory.createErrorView(errorMessage, errorReason);
panel.setWidget(view.asWidget());
}
private void createEventView(EventDTO event, List<RaceGroupDTO> raceGroups, AcceptsOneWidget panel) {
view = clientFactory.createEventView(event, raceGroups, eventPlace.getLeaderboardIdAsNameString(), timerForClientServerOffset);
panel.setWidget(view.asWidget());
@@ -114,7 +120,7 @@ public class EventActivity extends AbstractActivity {
new AsyncCallback<List<RegattaOverviewEntryDTO>>() {
@Override
public void onFailure(Throwable cause) {
Window.alert("Shit happens at getRaceStateEntriesForRaceGroup()");
Window.setStatus("Error while loading the race states with service getRaceStateEntriesForRaceGroup()");
}
@Override
@@ -4,9 +4,9 @@ import java.util.List;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.gwt.home.client.place.error.ErrorView;
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
import com.sap.sailing.gwt.ui.shared.EventBaseDTO;
@@ -33,7 +33,8 @@ public class EventsActivity extends AbstractActivity {
@Override
public void onFailure(Throwable caught) {
Window.alert("Shit happens");
final ErrorView view = clientFactory.createErrorView("Error while loading the sailing server instances with service getPublicEventsOfAllSailingServers()", caught);
panel.setWidget(view.asWidget());
}
});
}
@@ -5,6 +5,7 @@ import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.gwt.home.client.place.error.ErrorView;
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
import com.sap.sailing.gwt.ui.shared.LeaderboardSearchResultDTO;
import com.sap.sse.common.search.KeywordQuery;
@@ -15,6 +16,7 @@ public class SearchResultActivity extends AbstractActivity {
private final SearchResultPlace searchResultPlace;
private SearchResultView view;
private AcceptsOneWidget panel;
public SearchResultActivity(SearchResultPlace place, SearchResultClientFactory clientFactory) {
this.clientFactory = clientFactory;
@@ -26,13 +28,16 @@ public class SearchResultActivity extends AbstractActivity {
private void bindEvents() {
clientFactory.getEventBus().addHandler(SearchEvent.TYPE, new SearchEventHandler() {
public void onDoSearch(SearchEvent event) {
doSearch(event.getSearchText());
if(view != null) {
doSearch(event.getSearchText());
}
}
});
}
@Override
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
this.panel = panel;
panel.setWidget(new Placeholder());
view = clientFactory.createSearchResultView();
@@ -50,7 +55,8 @@ public class SearchResultActivity extends AbstractActivity {
@Override
public void onFailure(Throwable caught) {
Window.alert("Shit happens");
final ErrorView view = clientFactory.createErrorView("Error while seaching with service search()", caught);
panel.setWidget(view.asWidget());
}
});
}
@@ -0,0 +1,15 @@
.error_content {
margin-top: 3em;
margin-bottom: 3em;
}
.error_message {
font-weight: bold;
font-size: 20px;
}
.error_message_detail {
font-size: 15px;
}
.reload_page_message {
font-size: 20px;
margin-right: 20px;
}
@@ -0,0 +1,40 @@
package com.sap.sailing.gwt.home.client.shared.error;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.home.client.i18n.TextMessages;
public class ErrorMessage extends Composite {
interface ErrorUiBinder extends UiBinder<Widget, ErrorMessage> {
}
private static ErrorUiBinder uiBinder = GWT.create(ErrorUiBinder.class);
@UiField DivElement errorMessage;
@UiField DivElement errorMessageDetail;
@UiField Anchor reloadPageAnchor;
public ErrorMessage(String detailMessage, Throwable errorReason) {
ErrorMessageResources.INSTANCE.css().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
this.setHeight(Window.getClientHeight() + "px");
errorMessage.setInnerText(TextMessages.INSTANCE.errorMessageLoadingData());
Window.setStatus(detailMessage);
}
@UiHandler("reloadPageAnchor")
void reloadPage(ClickEvent e) {
Window.Location.reload();
}
}
@@ -0,0 +1,22 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared">
<ui:with field="i18n" type="com.sap.sailing.gwt.home.client.i18n.TextMessages"/>
<ui:with field="res" type="com.sap.sailing.gwt.home.client.HomeResources" />
<ui:with field="local_res" type="com.sap.sailing.gwt.home.client.shared.error.ErrorMessageResources" />
<g:HTMLPanel>
<div class="{res.mainCss.grid}">
<div class="{res.mediaCss.columns}">
<div class="{local_res.css.error_content}">
<div ui:field="errorMessage" class="{local_res.css.error_message}"></div>
<div ui:field="errorMessageDetail" class="{local_res.css.error_message_detail}"></div>
</div>
<div>
<span class="{local_res.css.reload_page_message}"><ui:text from='{i18n.pleaseTryAgain}'/></span>
<g:Anchor ui:field="reloadPageAnchor" href="javascript:;" styleName="{res.mainCss.button}"><ui:text from='{i18n.reloadPage}'/></g:Anchor>
</div>
</div>
</div>
</g:HTMLPanel>
</ui:UiBinder>
@@ -0,0 +1,19 @@
package com.sap.sailing.gwt.home.client.shared.error;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
public interface ErrorMessageResources extends ClientBundle {
public static final ErrorMessageResources INSTANCE = GWT.create(ErrorMessageResources.class);
@Source("com/sap/sailing/gwt/home/client/shared/error/ErrorMessage.css")
LocalCss css();
public interface LocalCss extends CssResource {
String error_content();
String error_message();
String error_message_detail();
String reload_page_message();
}
}
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.gwt.home.client.place.error.ErrorView;
import com.sap.sse.gwt.client.mvp.ClientFactory;
/**
@@ -10,4 +11,6 @@ import com.sap.sse.gwt.client.mvp.ClientFactory;
*/
public interface SailingClientFactory extends ClientFactory {
SailingServiceAsync getSailingService();
ErrorView createErrorView(String errorMessage, Throwable errorReason);
}