/**
*
*/
package org.appfuse.webapp.client.ui.login;
import java.util.Set;
import javax.validation.ConstraintViolation;
import org.appfuse.webapp.client.application.Application;
import org.appfuse.webapp.client.application.base.activity.AbstractBaseActivity;
import org.appfuse.webapp.client.application.base.security.LoginEvent;
import org.appfuse.webapp.client.ui.login.LoginView.LoginDetails;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.editor.client.EditorDriver;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import com.google.web.bindery.requestfactory.shared.Receiver;
/**
* @author ivangsa
*
*/
public class LoginActivity extends AbstractBaseActivity implements LoginView.Delegate {
private final LoginView view;
@Inject
public LoginActivity(final Application application, final LoginView view) {
super(application);
this.view = view;
setTitle(i18n.login_title());
setBodyId("login");
setBodyClassname("login");
}
/**
* @see com.google.gwt.activity.shared.Activity#start(com.google.gwt.user.client.ui.AcceptsOneWidget, com.google.gwt.event.shared.EventBus)
*/
@Override
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
view.setDelegate(this);
view.setRememberMeEnabled(application.isRememberMeEnabled());
view.setWaiting(false);
view.setMessage(null);
panel.setWidget(view);
setDocumentTitleAndBodyAttributtes();
}
@Override
public void onLoginClick() {
view.setMessage(null);
final EditorDriver<LoginDetails> editorDriver = view.getEditorDriver();
final LoginDetails login = editorDriver.flush();
final Set<ConstraintViolation<LoginDetails>> violations = getValidator().validate(login);
if(!violations.isEmpty()) {
editorDriver.setConstraintViolations((Set) violations);
return;
}
final RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, "j_security_check");
requestBuilder.setHeader("Content-Type","application/x-www-form-urlencoded");
requestBuilder.setHeader("X-Requested-With","XMLHttpRequest");
try {
view.setWaiting(true);
requestBuilder.sendRequest(createLoginPostData(login), new RequestCallback() {
@Override
public void onResponseReceived(final Request request, final Response response) {
final int statusCode = response.getStatusCode();
if(statusCode == Response.SC_OK) {
eventBus.fireEvent(new LoginEvent());
}
else if(statusCode == Response.SC_FORBIDDEN || statusCode == Response.SC_UNAUTHORIZED) {
view.setWaiting(false);
view.setMessage(new Alert(i18n.errors_password_mismatch(), AlertType.ERROR, false));
}
else {
throw new RuntimeException("Login could not understand response code: " + statusCode);
}
}
@Override
public void onError(final Request request, final Throwable exception) {
view.setWaiting(false);
Window.alert("Response error " + exception.getMessage());
}
});
} catch (final RequestException e) {
throw new RuntimeException(e);
}
}
private String createLoginPostData(final LoginView.LoginDetails login) {
return "j_username=" + URL.encodeQueryString(login.getUsername()) +
"&j_password=" + URL.encodeQueryString(login.getPassword()) +
(login.isRememberMe()? "&_spring_security_remember_me=on" : "");
}
@Override
public void onPasswordHintClick() {
final LoginDetails login = view.getEditorDriver().flush();
final String username = login.getUsername();
if(username == null || "".equals(username.trim())) {
Window.alert(i18n.errors_required(i18n.user_username()));
return;
}
requests.userRequest().sendPasswordHint(login.getUsername()).fire(new Receiver<String>() {
@Override
public void onSuccess(final String userEmail) {
Alert message = null;
if(userEmail != null) {
message = new Alert(i18n.login_passwordHint_sent(username, userEmail), AlertType.SUCCESS);
} else {
message = new Alert(i18n.login_passwordHint_error(username), AlertType.ERROR);
}
if(message != null) {
shell.addMessage(message);
}
}
});
}
@Override
public void onRequestPasswordRecoveryClick() {
final LoginDetails login = view.getEditorDriver().flush();
final String username = login.getUsername();
if (username == null || "".equals(username.trim())) {
Window.alert(i18n.errors_required(i18n.user_username()));
return;
}
requests.userRequest().requestRecoveryToken(login.getUsername()).fire(new Receiver<String>() {
@Override
public void onSuccess(final String message) {
if (message != null) {
shell.addMessage(message, AlertType.SUCCESS);
}
}
});
}
@Override
public void onCancelClick() {
}
}