package com.casamind.adware.client;
import com.casamind.adware.client.event.ContentAvailableEvent;
import com.casamind.adware.client.event.LoginEvent;
import com.casamind.adware.client.helper.PushService;
import com.casamind.adware.client.helper.RPCCall;
import com.casamind.adware.client.presenter.EntityListPresenter;
import com.casamind.adware.client.presenter.LoginPresenter;
import com.casamind.adware.client.presenter.PopupIndicatorPresenter;
import com.casamind.adware.client.presenter.UserBadgePresenter;
import com.casamind.adware.client.resources.DisplayMessages;
import com.casamind.adware.client.resources.ErrorMessages;
import com.casamind.adware.client.service.DataService;
import com.casamind.adware.client.service.DataServiceAsync;
import com.casamind.adware.client.service.LoginService;
import com.casamind.adware.client.service.LoginServiceAsync;
import com.casamind.adware.client.service.MailService;
import com.casamind.adware.client.service.MailServiceAsync;
import com.casamind.adware.client.view.EntityListView;
import com.casamind.adware.client.view.LoginView;
import com.casamind.adware.client.view.PopupIndicatorView;
import com.casamind.adware.client.view.UserBadgeView;
import com.casamind.adware.shared.InfoTypes;
import com.casamind.adware.shared.messages.ChannelTextMessage;
import com.casamind.adware.shared.messages.Message;
import com.casamind.adware.shared.model.CompanySummaryDTO;
import com.casamind.adware.shared.model.PublisherSummaryDTO;
import com.casamind.adware.shared.model.UserAccountDTO;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.gdata.client.GData;
import com.google.gwt.gdata.client.GDataSystemPackage;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.SerializationStreamFactory;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class Adware implements EntryPoint {
interface AdwareUiBinder extends UiBinder<Widget, Adware> {
}
SerializationStreamFactory pushServiceStreamFactory;
@UiField
HeaderPanel headerPanel;
@UiField
DeckPanel mainPanel;
@UiField
VerticalPanel entityListPanel;
RootLayoutPanel root;
private static GDataSystemPackage defaultPackage = GDataSystemPackage.CALENDAR;
private final static String GDATA_API_KEY = "ABQIAAAAC8UZOviicgqvPGNqx7sVeRSX7QeMlrl2UyVbTCaQ-Q5VuBPB8BTokEQ7Ddj-wmoyAXCDAr7syb3iVQ";
// Messages
private final DisplayMessages displayMessages = GWT.create(DisplayMessages.class);
private final ErrorMessages errorMessages = GWT.create(ErrorMessages.class);
private static Adware singleton;
private UserAccountDTO currentUser;
private CompanySummaryDTO currentCompany;
private PublisherSummaryDTO currentPublisher;
private SimpleEventBus eventBus = new SimpleEventBus();
private PopupIndicatorPresenter busyIndicator = new PopupIndicatorPresenter(eventBus, new PopupIndicatorView(), displayMessages.loading(), InfoTypes.Wait, 0);
private PopupIndicatorPresenter errorIndicator = new PopupIndicatorPresenter(eventBus, new PopupIndicatorView(), errorMessages.unknownError(), InfoTypes.Error, 10000);
private PopupIndicatorPresenter infoIndicator = new PopupIndicatorPresenter(eventBus, new PopupIndicatorView(), displayMessages.saved(), InfoTypes.Info, 5000);
// Presenters
private EntityListPresenter entityListPresenter;
private UserBadgePresenter userBadgePresenter;
// RPC services
private LoginServiceAsync loginService = GWT.create(LoginService.class);
private DataServiceAsync dataService = GWT.create(DataService.class);
private MailServiceAsync mailService = GWT.create(MailService.class);
/**
* Gets the singleton application instance.
*/
public static Adware get() {
return singleton;
}
private static final AdwareUiBinder binder = GWT.create(AdwareUiBinder.class);
public void onModuleLoad() {
pushServiceStreamFactory = (SerializationStreamFactory) PushService.App.getInstance();
singleton = this;
if (!GData.isLoaded(defaultPackage)) {
GData.loadGDataApi(GDATA_API_KEY, new Runnable() {
public void run() {
getLoggedInUser();
}
}, defaultPackage);
} else {
getLoggedInUser();
}
}
private void getLoggedInUser() {
new RPCCall<UserAccountDTO>() {
@Override
protected void callService(AsyncCallback<UserAccountDTO> cb) {
loginService.getLoggedInUserDTO(GWT.getHostPageBaseURL(), cb);
}
@Override
public void onSuccess(UserAccountDTO loggedInUserDTO) {
if (loggedInUserDTO.getAccessLevel() == 0) {
// nobody is logged in
showLoginView(loggedInUserDTO);
} else {
// user is logged in
setCurrentUser(loggedInUserDTO);
switch (loggedInUserDTO.getAccessLevel()) {
case 2:
doSetCurrentCompany(loggedInUserDTO.getLogin());
break;
case 3:
doSetCurrentPublisher(loggedInUserDTO.getLogin());
break;
default:
buildApp();
}
}
}
@Override
public void onFailure(Throwable caught) {
Window.alert(errorMessages.rpcError(caught.getMessage()));
}
}.retry(3);
}
protected void doSetCurrentPublisher(final String login) {
new RPCCall<PublisherSummaryDTO>() {
@Override
protected void callService(AsyncCallback<PublisherSummaryDTO> cb) {
dataService.getPublisherSummaryByLogin(login, cb);
}
@Override
public void onSuccess(final PublisherSummaryDTO publisher) {
Adware.get().setCurrentPublisher(publisher);
new RPCCall<CompanySummaryDTO>() {
@Override
protected void callService(AsyncCallback<CompanySummaryDTO> cb) {
dataService.getCompanySummaryByPublisherId(publisher.getId(), cb);
}
@Override
public void onSuccess(CompanySummaryDTO company) {
Adware.get().setCurrentCompany(company);
buildApp();
}
@Override
public void onFailure(Throwable caught) {
Window.alert(errorMessages.rpcError(caught.getMessage()));
}
}.retry(3);
}
@Override
public void onFailure(Throwable caught) {
Window.alert(errorMessages.rpcError(caught.getMessage()));
}
}.retry(3);
}
protected void doSetCurrentCompany(final String login) {
new RPCCall<CompanySummaryDTO>() {
@Override
protected void callService(AsyncCallback<CompanySummaryDTO> cb) {
dataService.getCompanySummaryByLogin(login, cb);
}
@Override
public void onSuccess(CompanySummaryDTO company) {
Adware.get().setCurrentCompany(company);
buildApp();
}
@Override
public void onFailure(Throwable caught) {
Window.alert(errorMessages.rpcError(caught.getMessage()));
}
}.retry(3);
}
public void showLoginView(UserAccountDTO loggedInUserDTO) {
root = RootLayoutPanel.get();
root.clear();
LoginPresenter loginPresenter = new LoginPresenter(eventBus, new LoginView(), loggedInUserDTO);
loginPresenter.go(root);
}
private void goAfterLogin() {
DockLayoutPanel outer = (DockLayoutPanel) binder.createAndBindUi(this);
root = RootLayoutPanel.get();
root.clear();
root.add(outer);
// final MessagesServiceAsync messagesService =
// GWT.create(MessagesService.class);
// FriendsServiceAsync friendService = GWT.create(FriendsService.class);
AppController appViewer = new AppController(dataService, mailService, eventBus);
appViewer.go();
entityListPresenter = new EntityListPresenter(dataService, eventBus, new EntityListView());
entityListPresenter.go(entityListPanel);
userBadgePresenter = new UserBadgePresenter(loginService, eventBus, new UserBadgeView());
userBadgePresenter.go(headerPanel.getuserBadgePanel());
}
public SimpleEventBus getEventBus() {
return eventBus;
}
private void buildApp() {
GWT.runAsync(new RunAsyncCallback() {
@Override
public void onFailure(Throwable reason) {
Window.alert("Code download error: " + reason.getMessage());
}
@Override
public void onSuccess() {
goAfterLogin();
eventBus.fireEvent(new LoginEvent(currentUser));
}
});
}
void setCurrentUser(UserAccountDTO currentUser) {
this.currentUser = currentUser;
}
public UserAccountDTO getCurrentUser() {
return currentUser;
}
public void setCurrentCompany(CompanySummaryDTO currentCompany) {
this.currentCompany = currentCompany;
}
public CompanySummaryDTO getCurrentCompany() {
return currentCompany;
}
public void setCurrentPublisher(PublisherSummaryDTO currentPublisher) {
this.currentPublisher = currentPublisher;
}
public PublisherSummaryDTO getCurrentPublisher() {
return currentPublisher;
}
/**
* @return the mainPanel
*/
DeckPanel getMainPanel() {
return mainPanel;
}
/**
* @return the friendList
*/
VerticalPanel getFriendListPanel() {
return entityListPanel;
}
/**
* Handle messages pushed from the server.
*/
public void handleMessage(Message msg) {
switch (msg.getType()) {
case NEW_CONTENT_AVAILABLE:
GWT.log("Pushed msg received: NEW_CONTENT_AVAILABLE");
eventBus.fireEvent(new ContentAvailableEvent());
break;
case TEXT_MESSAGE:
String ttext = ((ChannelTextMessage) msg).get();
GWT.log("Pushed msg received: TEXT_MESSAGE: " + ttext);
break;
default:
Window.alert("Unknown message type: " + msg.getType());
}
}
}