/*
* Copyright (c) 2015 Felix Husse under MIT License
* see LICENSE file
*/
package de.fatalix.bookery;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.Title;
import com.vaadin.cdi.CDIUI;
import com.vaadin.cdi.CDIViewProvider;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import de.fatalix.bookery.bl.AppUserService;
import de.fatalix.bookery.bl.model.AppUser;
import de.fatalix.bookery.view.common.BookDetailLayout;
import de.fatalix.bookery.view.common.BookMenuLayout;
import de.fatalix.bookery.view.home.HomeView;
import de.fatalix.bookery.view.login.LoginView;
import de.fatalix.bookery.view.login.UserLoggedInEvent;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/*
*
* @author Fatalix
*/
@CDIUI("")
@Theme("bluebooks")
@Title("Bookery")
public class App extends UI{
@Inject
private Logger logger;
@Inject
private AppUserService userService;
@Inject
private AppLayout appLayout;
@Inject
private CDIViewProvider viewProvider;
@Inject private BookDetailLayout bookDetailLayout;
@Inject private BookMenuLayout bookMenuLayout;
@Override
protected void init(VaadinRequest request) {
Navigator navigator = new Navigator(this, appLayout.getMainContent());
navigator.addProvider(viewProvider);
CssLayout contentWrapper = new CssLayout();
contentWrapper.addStyleName("crud-view");
contentWrapper.setSizeFull();
contentWrapper.addComponents(appLayout,bookMenuLayout,bookDetailLayout);
setContent(contentWrapper);
getNavigator().addViewChangeListener(new ViewChangeListener() {
@Override
public boolean beforeViewChange(ViewChangeListener.ViewChangeEvent event) {
if (!isLoggedIn()) {
appLayout.getAppHeader().setVisible(false);
if (!event.getViewName().equals(LoginView.id)) {
getNavigator().navigateTo(LoginView.id);
return false;
}
return true;
} else {
appLayout.getAppHeader().setVisible(isLoggedIn());
appLayout.getAppHeader().setLoginName(SecurityUtils.getSubject().getPrincipal().toString());
if(event.getViewName().equals("")) {
getNavigator().navigateTo(HomeView.id);
return false;
}
return true;
}
}
@Override
public void afterViewChange(ViewChangeListener.ViewChangeEvent event) {
}
});
if (!isLoggedIn()) {
appLayout.getAppHeader().setVisible(false);
getNavigator().navigateTo(LoginView.id);
}
else {
appLayout.getAppHeader().setVisible(isLoggedIn());
appLayout.getAppHeader().setLoginName(SecurityUtils.getSubject().getPrincipal().toString());
if (getNavigator().getState().isEmpty()) {
getNavigator().navigateTo(HomeView.id);
}
}
}
private boolean isLoggedIn() {
Subject subject = SecurityUtils.getSubject();
if (subject == null) {
logger.error("Could not find subject");
return false;
}
return subject.isAuthenticated();
}
public void userLoggedIn(@Observes(notifyObserver = Reception.IF_EXISTS) UserLoggedInEvent event) {
AppUser user = userService.updateLastLogin(event.getUsername());
if (user.getLastLogin() != null) {
DateTime dtLastLogin = new DateTime(user.getLastLogin());
DateTime dtCurrentLogin = new DateTime(user.getCurrentLogin());
Duration duration = new Duration(dtLastLogin, dtCurrentLogin);
String sinceLastLogin = "";
if (duration.getStandardDays()>0) {
long days = duration.getStandardDays();
if (days == 1) {
sinceLastLogin = days + " day";
}
else {
sinceLastLogin = days + " days";
}
}
else if (duration.getStandardHours()> 0) {
long hours = duration.getStandardHours();
if (hours == 1) {
sinceLastLogin = hours + " hour";
}
else {
sinceLastLogin = hours + " hours";
}
}
else if (duration.getStandardMinutes() > 0) {
long minutes = duration.getStandardMinutes();
if (minutes == 1) {
sinceLastLogin = minutes + " minute";
}
else {
sinceLastLogin = minutes + " minutes";
}
}
else {
long seconds = duration.getStandardSeconds();
if (seconds == 1) {
sinceLastLogin = seconds + " second";
}
else {
sinceLastLogin = seconds + " seconds";
}
}
Notification.show("Welcome back " + event.getUsername() + " after " + sinceLastLogin + ".");
}
else {
Notification.show("Welcome " + event.getUsername());
}
logger.info("User " + event.getUsername() + " logged in.");
getNavigator().navigateTo(HomeView.id);
appLayout.getAppHeader().setLoginName(SecurityUtils.getSubject().getPrincipal().toString());
appLayout.getAppHeader().setVisible(isLoggedIn());
}
public void logout() {
SecurityUtils.getSubject().logout();
getSession().close();
close();
getPage().setLocation("");
}
}