package de.tud.kom.socom.web.client.login;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import de.tud.kom.socom.web.client.AppController;
import de.tud.kom.socom.web.client.events.CommunicationFailureEvent;
import de.tud.kom.socom.web.client.events.LoginErrorNetworkUserNotFoundEvent;
import de.tud.kom.socom.web.client.events.LoginNetworkSuccessEvent;
import de.tud.kom.socom.web.client.sharedmodels.LoginResult;
import de.tud.kom.socom.web.client.sharedmodels.SocialMediaApplications;
/** LoginHandling by SocialNetworkToken
*
* @author rhaban, jkonert
*
*/
public class NetworkLoginManager {
private HandlerManager eventBus;
private AppController appController;
/** this parameter urlParameterForOAuthProcessing should be given back to us on all callbacks from SocialMediaApplications
* as it identifies the handling by this NetworkManager component */
private static final String urlParameterValueForOAuthProcessing = "gnetworklogin-cb";
private static final String urlParameterForOAuthProcessing = "state";
private static final String urlParameterAndApplicationIdentifierSeperator = ".";
public static final String TOKEN_URL_PARAMETER = "code";
// private static final HashMap<SocialMediaApplications, String> loginUrls = new HashMap<SocialMediaApplications, String>();
// static
// {
// // adds state=gnetworklogin-cb,fb, parameter
// loginUrls.put(SocialMediaApplications.facebook, StaticFacebookInformation.FACEBOOK_URL+"&"+urlParameterForOAuthProcessing+"="+urlParameterValueForOAuthProcessing+urlParameterAndApplicationIdentifierSeperator+SocialMediaApplications.facebook.getIdentifier());
// // more to come..
// }
/** should only be called by LoginManager; get your instance from there */
protected NetworkLoginManager(AppController appController) {
this.appController = appController;
this.eventBus = appController.getEventHandler();
}
// public String getOAuthLoginUrl(SocialMediaApplications SMApp)
// {
//
// return loginUrls.get(SMApp);
// }
public String getURLParameterValueForOAuthTokenProcessing() {
return urlParameterValueForOAuthProcessing;
}
public String getURLParameterForOAuthTokenProcessing(){
return urlParameterForOAuthProcessing;
}
/** processed tokens maybe in URL and handles the loginprocess accordingly
*
*/
public void receiveToken() {
String stateParameter = appController.getLocationParameter(urlParameterForOAuthProcessing);
int i = stateParameter.indexOf(urlParameterAndApplicationIdentifierSeperator);
int j = stateParameter.indexOf(urlParameterAndApplicationIdentifierSeperator, i+1);
String id = stateParameter.substring(i+1,j);
SocialMediaApplications app = SocialMediaApplications.valueOfIndentifier(id);
switch(app)
{
case facebook:
receiveFBToken();
break;
case googleplus:
break;
default:
// Looger warn: Invalid parameter
}
}
private void receiveFBToken() {
String code = appController.getLocationParameter(TOKEN_URL_PARAMETER);
appController.getRPCFactory().getSocialNetworkService()
.getFacebookToken(appController.getRequestInformation().getCurrentGame(), code, new AsyncCallback<LoginResult>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
eventBus.fireEvent(new CommunicationFailureEvent(caught));
}
@Override
public void onSuccess(final LoginResult result) {
if(result == null || !result.isSuccess()){
eventBus.fireEvent(new LoginErrorNetworkUserNotFoundEvent());
return;
}
appController.getLoginManager().setSessionCookie(result.getSid());
// appController.getLoginManager().storeLoginInformation(result, false, false);
// // add additional information to LoginResult which includes the used network for login
eventBus.fireEvent(new LoginNetworkSuccessEvent(result.getUid(), SocialMediaApplications.facebook));
}
});
}
}