/*
* Copyright 2009-2013 the original author or authors.
*
* 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.jdal.vaadin.auth;
import java.util.LinkedList;
import org.jdal.annotation.SerializableProxy;
import org.jdal.auth.AuthService;
import org.jdal.vaadin.ui.AbstractView;
import org.jdal.vaadin.ui.FormUtils;
import org.jdal.vaadin.ui.form.BoxFormBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.event.ShortcutListener;
import com.vaadin.server.Resource;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.Label;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.themes.Reindeer;
/**
* Default login window.
*
* @author Jose Luis Martin
* @since 2.0
*/
public class LoginView extends AbstractView<Credentials> implements ClickListener {
private TextField username = FormUtils.newTextField();
private PasswordField password = FormUtils.newPasswordField();
private Button loginButton = new Button();
private String applicationName = "";
private Resource applicationIcon;
@SerializableProxy
@Autowired
private AuthService authService;
private Label errorLabel = new Label();
private LinkedList<AuthenticationListener> authenticationListeners = new LinkedList<AuthenticationListener>();
public LoginView() {
super(new Credentials());
setHeight(200);
setWidth(500);
errorLabel.setImmediate(true);
errorLabel.setSizeUndefined();
errorLabel.setStyleName("jd-login-error");
autobind();
}
public LoginView(Credentials model) {
super(model);
}
@Override
protected Component buildPanel() {
Label greeting = new Label(getMessage("loginView.greeting"));
greeting.addStyleName("jd-login-greeting");
greeting.addStyleName(Reindeer.LABEL_H2);
Label applicationNameLabel = new Label(getMessage(applicationName));
applicationNameLabel.addStyleName("jd-login-appname");
applicationNameLabel.addStyleName(Reindeer.LABEL_H2);
applicationNameLabel.setSizeUndefined();
loginButton.addClickListener(this);
loginButton.setCaption(getMessage("loginView.loginButtonCaption"));
loginButton.addStyleName("jd-login-button");
// add shortcut listener for enter key
loginButton.addShortcutListener(new ShortcutListener("Sign In",
KeyCode.ENTER, null) {
@Override
public void handleAction(Object sender, Object target) {
loginButton.click();
}
});
Image image = null;
HorizontalLayout imageWrapper = null;
if (applicationIcon != null) {
image = new Image(null, applicationIcon);
image.setSizeUndefined();
image.setStyleName("jd-login-icon");
imageWrapper = new HorizontalLayout();
imageWrapper.setMargin(false);
imageWrapper.addComponent(image);
imageWrapper.setComponentAlignment(image, Alignment.MIDDLE_CENTER);
}
BoxFormBuilder fb = new BoxFormBuilder();
fb.setDefaultWidth(BoxFormBuilder.SIZE_FULL);
fb.row();
fb.startBox();
fb.setFixedHeight();
fb.row(false);
fb.add(greeting, Alignment.TOP_LEFT);
fb.add(applicationNameLabel, Alignment.TOP_RIGHT);
fb.endBox();
// add application icon
if (image != null) {
fb.row(BoxFormBuilder.SIZE_FULL);
fb.add(imageWrapper, BoxFormBuilder.SIZE_FULL, Alignment.MIDDLE_CENTER);
}
fb.row();
fb.startBox();
fb.row(30);
fb.add(errorLabel, BoxFormBuilder.SIZE_FULL, Alignment.BOTTOM_CENTER);
fb.endBox();
fb.row();
fb.startBox();
fb.setFixedHeight();
fb.row();
fb.add(username, getMessage("loginView.username"), Alignment.BOTTOM_CENTER);
fb.add(password, getMessage("loginView.password"), Alignment.BOTTOM_CENTER);
fb.add(loginButton, 100, Alignment.BOTTOM_CENTER);
fb.endBox();
Component form = fb.getForm();
form.setWidth(this.getWidth(), Unit.PIXELS);
form.setHeight(getHeight(), Unit.PIXELS);
form.setStyleName("jd-login");
HorizontalLayout hl = new HorizontalLayout();
hl.setMargin(false);
hl.addComponent(form);
hl.setComponentAlignment(form, Alignment.MIDDLE_CENTER);
hl.setSizeFull();
hl.setStyleName("jd-login-layout");
return hl;
}
@Override
public void buttonClick(ClickEvent event) {
login();
}
protected void login() {
update();
errorLabel.setValue("");
Credentials model = getModel();
if (authService.validate(model.getUsername(), model.getPassword())) {
for (AuthenticationListener al : authenticationListeners)
al.handleAuthentication(new AuthenticationEvent(getPanel(), getModel()));
}
else {
showErrorMessage();
}
password.setValue("");
username.setValue("");
}
protected void showErrorMessage() {
errorLabel.setValue(getMessage("loginFailure"));
}
/**
* @param simpleApplicationUI
*/
public void addAuthenticationListener(AuthenticationListener listener) {
if (!authenticationListeners.contains(listener))
authenticationListeners.add(listener);
}
public void removeAuthenticationListener(AuthenticationListener listener) {
authenticationListeners.remove(listener);
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public Resource getApplicationIcon() {
return applicationIcon;
}
public void setApplicationIcon(Resource applicationIcon) {
this.applicationIcon = applicationIcon;
}
}