package org.ovirt.engine.ui.userportal.client.views;
import java.util.Date;
import java.util.logging.Logger;
import com.google.gwt.user.client.Cookies;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommon.models.userportal.UserPortalLoginModel;
import org.ovirt.engine.ui.userportal.client.ApplicationConstants;
import org.ovirt.engine.ui.userportal.client.UserPortal;
import org.ovirt.engine.ui.userportal.client.binders.ObjectNameIdResolver;
import org.ovirt.engine.ui.userportal.client.components.CheckboxItemModelBinded;
import org.ovirt.engine.ui.userportal.client.components.UPLabel;
import org.ovirt.engine.ui.userportal.client.components.UPTextItem;
import org.ovirt.engine.ui.userportal.client.components.SelectBoxListModelBinded;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.BkgndRepeat;
import com.smartgwt.client.types.FormErrorOrientation;
import com.smartgwt.client.types.Positioning;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
import com.smartgwt.client.widgets.form.fields.HeaderItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.SubmitItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
public class LoginView extends Window {
private static Logger logger = Logger.getLogger(LoginView.class.getName());
private static final String LOGIN_AUTOCONNECT_COOKIE_NAME = "Login_ConnectAutomaticallyChecked";
public LoginView() {
setAttribute("edgeTop", 14, false);
setAttribute("edgeBottom", 14, false);
setShowTitle(false);
setShowHeader(false);
setEdgeOffset(4);
setMargin(-2);
setLayoutAlign(Alignment.LEFT);
setDefaultLayoutAlign(Alignment.LEFT);
HLayout headerLayout = new HLayout();
headerLayout.setWidth100();
headerLayout.setHeight(44);
HLayout headerLeft = new HLayout();
headerLeft.addMember(new Img("login_page_header_logo.png", 51, 44));
VLayout headerCenter = new VLayout();
headerCenter.setWidth100();
headerCenter.setHeight(44);
headerCenter.setBackgroundPosition("3");
headerCenter.setBackgroundImage("login_page_header_background.png");
headerCenter.setBackgroundRepeat(BkgndRepeat.REPEAT_X);
UPLabel headerTitle = new UPLabel("login-panel-header-title");
headerTitle.setContents(ApplicationConstants.PRODUCT_NAME);
headerCenter.setAlign(VerticalAlignment.CENTER);
headerCenter.addMember(headerTitle);
HLayout headerRight = new HLayout();
headerRight.setAlign(Alignment.RIGHT);
headerRight.addMember(new Img("login_page_header_image.png", 133, 44));
headerLayout.setMembers(headerLeft, headerCenter, headerRight);
headerLayout.setStyleName("login-panel-header");
addItem(headerLayout);
setEdgeImage("login_panel_edge.png");
setEdgeSize(14);
setShowEdges(true);
setWidth(440);
setShowMinimizeButton(false);
setShowCloseButton(false);
setHeight(280);
setIsModal(true);
setShowModalMask(true);
setCanDragResize(false);
setCanDragReposition(false);
centerInPage();
}
@Override
protected void onDraw() {
// get body auto-child
Canvas body = getById(getID() + "_body");
// disable SmartClient custom scrollbars (#656384, #698988)
// this is required because the custom scrollbars feature catches arrow key events also inside text fields.
body.setShowCustomScrollbars(false);
}
private DynamicForm form;
private SubmitItem loginButton;
private boolean currentlyDispalyed = false;
static UserPortalLoginModel uplm = null;
private final int FORM_ITEMS_SIZE_PX = 180;
public void showLoginView() {
LoginView.uplm = new UserPortalLoginModel();
currentlyDispalyed = true;
form = new DynamicForm();
form.setID("LoginForm");
form.setHeight100();
form.setWidth100();
form.setPadding(5);
form.setMargin(5);
form.setCellPadding(4);
form.setShowErrorText(true);
form.setErrorOrientation(FormErrorOrientation.BOTTOM);
HeaderItem header = new HeaderItem();
header.setValue("oVirt Enterprise Virtualization Engine User Portal Login!");
final UPTextItem user = new UPTextItem("user", "<nobr>User Name</nobr>");
user.setWidth(FORM_ITEMS_SIZE_PX);
user.setTitleAlign(Alignment.LEFT);
user.setRequired(true);
// Needed for user names that specify FQDN using @, thus we need to set the name in the model every change
user.addChangedHandler(new ChangedHandler() {
@Override
public void onChanged(ChangedEvent event) {
uplm.getUserName().setEntity(user.getValue());
}
});
//user.setAttribute("autoComplete", "native");
final PasswordItem password = new PasswordItem("password", "Password");
password.setWidth(FORM_ITEMS_SIZE_PX);
password.setTitleAlign(Alignment.LEFT);
password.setRequired(true);
//password.setAttribute("autoComplete", "native");
final SelectBoxListModelBinded domain = new SelectBoxListModelBinded("Domain", uplm.getDomain(), new ObjectNameIdResolver() {
@Override
public String getItemName(Object o) {
return (String)o;
}
@Override
public String getItemId(Object o) {
return (String)o;
}
});
domain.setWidth(FORM_ITEMS_SIZE_PX);
domain.setTitleAlign(Alignment.LEFT);
domain.setRequired(true);
form.setAlign(Alignment.CENTER);
// Create 'Connect Automatically' checkbox and set its value by the saved cookie.
CheckboxItemModelBinded autoConnectCheckbox = new CheckboxItemModelBinded("Connect Automatically", uplm.getIsAutoConnect());
autoConnectCheckbox.setColSpan(2);
autoConnectCheckbox.setShowTitle(false);
uplm.getIsAutoConnect().setEntity(readConnectAutomaticallyCookie());
loginButton = new SubmitItem("login", "Login");
loginButton.setColSpan(3);
loginButton.setAlign(Alignment.RIGHT);
form.setFields(user, password, domain, autoConnectCheckbox, loginButton);
form.setAutoWidth();
form.setAutoHeight();
form.setSaveOnEnter(true);
// Wrap the form in a layout in order to set it's layout and positioning
HLayout h = new HLayout();
h.setWidth100();
h.setAutoHeight();
h.addMember(form);
h.setAlign(Alignment.CENTER);
h.setPosition(Positioning.RELATIVE);
addItem(h);
show();
form.focusInItem(user);
form.addSubmitValuesHandler(new SubmitValuesHandler() {
public void onSubmitValues(SubmitValuesEvent submitValuesEvent) {
if (form.validate()) {
login((String) user.getValue(), (String) password.getValue(), (String) uplm.getDomain()
.getSelectedItem());
}
}
});
}
// Save 'IsAutoConnect' value to a cookie and set expire date to fifty years from now
private void saveConnectAutomaticallyCookie()
{
long expire = new Date().getTime() + (1000 * 60 * 60 * 24 * 365 * 50); // fifty years
String cookieValue = uplm.getIsAutoConnect().getEntity().toString();
Cookies.setCookie(LOGIN_AUTOCONNECT_COOKIE_NAME, cookieValue, new Date(expire));
}
// Return 'IsAutoConnecvdt' value from the cookie - if exists; Otherwise, true
// (connect automatically is true by default).
private Boolean readConnectAutomaticallyCookie()
{
String connectAutomatically = Cookies.getCookie(LOGIN_AUTOCONNECT_COOKIE_NAME);
if (connectAutomatically != null) return new Boolean(connectAutomatically);
else return true;
}
private void login(final String user, final String password,
final String domain) {
logger.finer("Logging user [" + user + "] to domain [" + domain + "].");
uplm.getUserName().setEntity(user);
uplm.getPassword().setEntity(password);
uplm.getDomain().setSelectedItem(domain);
uplm.getLoggedInEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
// Success login
logger.info("Successfully logged in!");
destroy();
currentlyDispalyed = false;
//TODO: Waiting for UiCommon to support getLoggedUser
UserPortal.setSessionUser(uplm.getLoggedUser());
UserPortal.setSessionConnectAutomatically(((Boolean)uplm.getIsAutoConnect().getEntity()).booleanValue());
saveConnectAutomaticallyCookie();
Frontend.setLoggedInUser(uplm.getLoggedUser());
UserPortal.checkLoginStatus();
}
});
uplm.getLoginFailedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
// Success login
logger.warning("User failed to login!");
form.setFieldErrors(
"login",
uplm.getMessage(),
true);
// Clears password field
form.getField("password").setValue("");
}
});
uplm.Login();
}
}