/*******************************************************************************
* Copyright 2011 Antti Havanko
*
* This file is part of Motiver.fi.
* Motiver.fi is licensed under one open source license and one commercial license.
*
* Commercial license: This is the appropriate option if you want to use Motiver.fi in
* commercial purposes. Contact license@motiver.fi for licensing options.
*
* Open source license: This is the appropriate option if you are creating an open source
* application with a license compatible with the GNU GPL license v3. Although the GPLv3 has
* many terms, the most important is that you must provide the source code of your application
* to your users so they can be free to modify your application for their own needs.
******************************************************************************/
package com.delect.motiver.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.RootPanel;
import com.delect.motiver.client.AppController.AppDisplay;
import com.delect.motiver.client.OfflineRequestBuilder.OfflineRequestBuilderHandler;
import com.delect.motiver.client.event.InfoMessageEvent;
import com.delect.motiver.client.event.LoadingEvent;
import com.delect.motiver.client.event.LoggedOutEvent;
import com.delect.motiver.client.event.OfflineModeEvent;
import com.delect.motiver.client.event.handler.LoggedOutEventHandler;
import com.delect.motiver.client.presenter.InfoMessagePresenter.MessageColor;
import com.delect.motiver.client.service.MyService;
import com.delect.motiver.client.service.MyServiceAsync;
import com.delect.motiver.client.view.AppView;
import com.delect.motiver.shared.Constants;
import com.delect.motiver.shared.exception.NotLoggedInException;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.google.gwt.user.client.Window;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Motiver implements EntryPoint {
public static String VERSION = "v4.7";
public static boolean offlineMode = false;
static SimpleEventBus eventBus = new SimpleEventBus();
/**
* If next RPC call is cacheable
*/
private static boolean isCacheable = false;
static MyServiceAsync rpcService;
/**
* This is the entry point method.
*/
public void onModuleLoad() {
//hide loading text
RootPanel panelLoading = RootPanel.get("loading");
panelLoading.setVisible(false);
//rpc service
rpcService = GWT.create(MyService.class);
((ServiceDefTarget) rpcService).setRpcRequestBuilder(new RpcRequestBuilder() {
@Override
protected RequestBuilder doCreate(String serviceEntryPoint) {
//custom builder
final OfflineRequestBuilder builder = new OfflineRequestBuilder(RequestBuilder.POST, ((ServiceDefTarget)rpcService).getServiceEntryPoint());
builder.setCacheable(isCacheable);
builder.setHandler(new OfflineRequestBuilderHandler() {
@Override
public String loadFromStorage(String requestData) {
try {
//if we are fetching response from local storage -> we are in offline mode
if(!offlineMode) {
eventBus.fireEvent(new OfflineModeEvent(true));
}
offlineMode = true;
//cancel loading event
eventBus.fireEvent(new LoadingEvent(null));
//get response from local storage
final String res = OfflineStorageManager.getInstance().getItem(requestData);
if(res != null && res.startsWith("//OK")) {
return res;
}
} catch (Exception e) {
Motiver.showException(e);
}
return null;
}
@Override
public void onErrorReceived(String requestData, Throwable throwable) {
//cancel loading event
eventBus.fireEvent(new LoadingEvent(null));
//show error message
eventBus.fireEvent(new InfoMessageEvent(MessageColor.COLOR_RED, AppController.Lang.NetworkError()));
}
@Override
public void onResponseReceived(String requestData, String responseData) {
try {
//cancel loading event
eventBus.fireEvent(new LoadingEvent(null));
//save data to local storage (if OK)
if(responseData != null && responseData.startsWith("//OK") && builder.isCacheable()) {
OfflineStorageManager.getInstance().setItem(requestData, responseData);
}
//set offline mode off (use variable so this event won't fire everytime
if(offlineMode) {
eventBus.fireEvent(new OfflineModeEvent(false));
offlineMode = false;
}
} catch (Exception e) {
Motiver.showException(e);
}
}
});
isCacheable = false;
//if coach mode is on -> add trainee's uid to token
if(AppController.COACH_MODE_ON) {
builder.setHeader("coach_mode_uid", AppController.COACH_MODE_UID);
}
else {
builder.setHeader("coach_mode_uid", "-");
}
//fire loading event
eventBus.fireEvent(new LoadingEvent(AppController.Lang.Loading() + "..."));
return builder;
}
});
//launch appcontroller
AppController appViewer = new AppController(rpcService, eventBus, (AppDisplay) GWT.create(AppView.class));
LayoutContainer lc = new LayoutContainer();
RootPanel.get().add(lc);
appViewer.run(lc);
//listen logged out event and clear local storage
eventBus.addHandler(LoggedOutEvent.TYPE, new LoggedOutEventHandler() {
@Override
public void onLoggedOut(LoggedOutEvent event) {
OfflineStorageManager.getInstance().clear();
}
});
}
/**
* Shows exception
* @param exception
*/
public static void showException(Throwable exception) {
if(exception != null) {
//if not logged in -> refresh page
if(exception instanceof NotLoggedInException) {
Window.Location.assign(Constants.URL_APP);
return;
}
}
//show error message
eventBus.fireEvent(new InfoMessageEvent(MessageColor.COLOR_RED, AppController.Lang.NetworkError()));
}
public static void setNextCallCacheable(boolean cacheable) {
isCacheable = cacheable;
}
}