/**
* Copyright (C) 2013 Arman Gal
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.clevermore.monitor.client.login;
import org.clevermore.monitor.client.ConfigurationServiceAsync;
import org.clevermore.monitor.client.GeneralService;
import org.clevermore.monitor.client.GeneralServiceAsync;
import org.clevermore.monitor.client.utils.LocalStorage;
import org.clevermore.monitor.shared.config.ClientConfigurations;
import org.clevermore.monitor.shared.utils.StringFormatter;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.FontStyle;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
public class LoginWidget<CC extends ClientConfigurations>
extends Composite {
private static final String SSIP = "auth.ssip";
private static final String SSIU = "auth.ssiu";
private static final String SSICH = "auth.ssich";
public interface LoggedInCallBack<CC> {
void loggedIn(final CC cc, final String loggedInUser);
}
private final GeneralServiceAsync service = GWT.create(GeneralService.class);
private CC cc;
private LoggedInCallBack<CC> callBack;
private FlowPanel fp = new FlowPanel();
private TextBox userName = new TextBox();
private PasswordTextBox password = new PasswordTextBox();
private Button login = new Button("Login");
private CheckBox staySignedIn = new CheckBox("Stay signed in");
private Label errorMsg = new Label();
private KeyPressHandler enterhandler = new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
Log.debug("Key:" + event.getNativeEvent().getKeyCode());
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
login();
}
}
};
public LoginWidget(ConfigurationServiceAsync<CC> service) {
if (!GWT.isScript()) {
userName.setText("admin");
password.setText("password");
}
initWidget(fp);
fp.setStyleName("login");
Label un = new Label("User Name:");
un.getElement().setId("label");
fp.add(un);
fp.add(userName);
Label pw = new Label("Password:");
pw.getElement().setId("label");
fp.add(pw);
fp.add(password);
fp.add(login);
fp.add(staySignedIn);
fp.add(errorMsg);
errorMsg.getElement().getStyle().setColor("red");
errorMsg.getElement().getStyle().setFontStyle(FontStyle.ITALIC);
password.addKeyPressHandler(enterhandler);
password.getElement().setId("input");
userName.addKeyPressHandler(enterhandler);
userName.getElement().setId("input");
login.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
login.setEnabled(false);
login();
}
});
final HTML version = new HTML();
version.getElement().setId("version");
fp.add(version);
service.getClientConfigurations(new AsyncCallback<CC>() {
@Override
public void onSuccess(CC result) {
version.setText("Env:" + result.getTitle() + ", Version:" + result.getVersion());
Window.setTitle(result.getTitle() + ", v:" + result.getVersion());
cc = result;
staySignedIn.setValue(LocalStorage.readStoredItem(SSICH) != null && LocalStorage.readStoredItem(SSICH).equals("on"));
String user = StringFormatter.Base64Decode(LocalStorage.readStoredItem(SSIU));
String pass = StringFormatter.Base64Decode(LocalStorage.readStoredItem(SSIP));
if (staySignedIn.getValue() && user != null && pass != null) {
userName.setText(user);
password.setText(pass);
login();
}
}
@Override
public void onFailure(Throwable caught) {
version.setText("Error getting version:" + caught.getMessage());
}
});
}
@Override
protected void onAttach() {
super.onAttach();
userName.setFocus(true);
errorMsg.setText("");
}
private void login() {
service.authenticate(userName.getText(), password.getText(), new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
try {
if (result.booleanValue() == true) {
if (staySignedIn.getValue()) {
Log.debug("Store cookie");
LocalStorage.storeItem(SSICH, "on");
LocalStorage.storeItem(SSIU, StringFormatter.Base64Encode(userName.getText().trim()));
LocalStorage.storeItem(SSIP, StringFormatter.Base64Encode(password.getText().trim()));
} else {
Log.debug("Cleaning cookie");
LocalStorage.removeItem(SSIP);
LocalStorage.removeItem(SSIU);
LocalStorage.removeItem(SSICH);
}
callBack.loggedIn(cc, userName.getText().trim());
} else {
errorMsg.setText("Can't login, try again.");
}
} finally {
login.setEnabled(true);
}
}
@Override
public void onFailure(Throwable caught) {
errorMsg.setText("Error loging-in:" + caught.getMessage());
login.setEnabled(true);
}
});
}
public void registerCallBack(LoggedInCallBack<CC> callBack) {
this.callBack = callBack;
}
}