From 557d70d8d9fd77ec78043bb9b77439f6d1bfc5f6 Mon Sep 17 00:00:00 2001 From: Igor Baiborodine Date: Sun, 4 Feb 2018 22:42:38 -0500 Subject: [PATCH] Switch to SpringNavigator and SpringDisplayView --- .../jpetstore/vaadinspring/ui/AppUI.java | 23 ++++--------- .../jpetstore/vaadinspring/ui/MainView.java | 29 ++++++++++------- .../ui/{menu => component}/LeftNavBar.java | 14 ++++---- .../ui/{menu => component}/TopNavBar.java | 19 +++++------ .../ui/navigation/NavigationManager.java | 32 +++++++++++++++++++ 5 files changed, 74 insertions(+), 43 deletions(-) rename src/main/java/com/kiroule/jpetstore/vaadinspring/ui/{menu => component}/LeftNavBar.java (81%) rename src/main/java/com/kiroule/jpetstore/vaadinspring/ui/{menu => component}/TopNavBar.java (92%) create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/navigation/NavigationManager.java diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java index 0061400..24f726b 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java @@ -1,12 +1,10 @@ package com.kiroule.jpetstore.vaadinspring.ui; +import com.kiroule.jpetstore.vaadinspring.ui.navigation.NavigationManager; import com.kiroule.jpetstore.vaadinspring.ui.util.HasLogger; -import com.kiroule.jpetstore.vaadinspring.ui.util.NavBarButtonUpdater; -import com.kiroule.jpetstore.vaadinspring.ui.util.PageTitleUpdater; import com.vaadin.annotations.Theme; import com.vaadin.annotations.Title; import com.vaadin.annotations.Widgetset; -import com.vaadin.navigator.Navigator; import com.vaadin.server.VaadinRequest; import com.vaadin.spring.annotation.SpringUI; import com.vaadin.spring.navigator.SpringViewProvider; @@ -15,8 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.EventBus; -import javax.annotation.PreDestroy; - /** * @author Igor Baiborodine */ @@ -28,20 +24,18 @@ public class AppUI extends UI implements HasLogger { private static final long serialVersionUID = 4670701701584923650L; + private final NavigationManager navigationManager; private final SpringViewProvider viewProvider; private final MainView mainView; private final EventBus.UIEventBus uiEventBus; - private final PageTitleUpdater pageTitleUpdater; - private final NavBarButtonUpdater navBarButtonUpdater; @Autowired - public AppUI(SpringViewProvider viewProvider, MainView mainView, EventBus.UIEventBus uiEventBus, - PageTitleUpdater pageTitleUpdater, NavBarButtonUpdater navBarButtonUpdater) { + public AppUI(NavigationManager navigationManager, SpringViewProvider viewProvider, MainView mainView, + EventBus.UIEventBus uiEventBus) { + this.navigationManager = navigationManager; this.viewProvider = viewProvider; this.mainView = mainView; this.uiEventBus = uiEventBus; - this.pageTitleUpdater = pageTitleUpdater; - this.navBarButtonUpdater = navBarButtonUpdater; } public static AppUI getCurrent() { @@ -55,13 +49,8 @@ public static EventBus.UIEventBus getUiEventBus() { @Override protected void init(VaadinRequest request) { setContent(mainView); - - Navigator navigator = new Navigator(this, mainView.getViewContainer()); - navigator.addProvider(viewProvider); - navigator.addViewChangeListener(navBarButtonUpdater); - navigator.addViewChangeListener(pageTitleUpdater); - uiEventBus.subscribe(mainView); + navigationManager.navigateToDefaultView(); getLogger().info("App UI initialized"); } } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java index 8e90c21..c69cee0 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java @@ -3,6 +3,8 @@ import com.kiroule.jpetstore.vaadinspring.domain.Account; import com.kiroule.jpetstore.vaadinspring.domain.Cart; import com.kiroule.jpetstore.vaadinspring.service.CatalogService; +import com.kiroule.jpetstore.vaadinspring.ui.component.LeftNavBar; +import com.kiroule.jpetstore.vaadinspring.ui.component.TopNavBar; import com.kiroule.jpetstore.vaadinspring.ui.event.UIAddItemToCartEvent; import com.kiroule.jpetstore.vaadinspring.ui.event.UIChangeCartItemQuantityEvent; import com.kiroule.jpetstore.vaadinspring.ui.event.UILoginEvent; @@ -10,8 +12,7 @@ import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.event.UIRemoveItemFromCartEvent; import com.kiroule.jpetstore.vaadinspring.ui.event.UIUpdateAccountEvent; -import com.kiroule.jpetstore.vaadinspring.ui.menu.LeftNavBar; -import com.kiroule.jpetstore.vaadinspring.ui.menu.TopNavBar; +import com.kiroule.jpetstore.vaadinspring.ui.navigation.NavigationManager; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentAccount; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart; import com.kiroule.jpetstore.vaadinspring.ui.util.HasLogger; @@ -22,8 +23,10 @@ import com.kiroule.jpetstore.vaadinspring.ui.view.CartView; import com.kiroule.jpetstore.vaadinspring.ui.view.HomeView; import com.kiroule.jpetstore.vaadinspring.ui.view.ItemListView; +import com.vaadin.navigator.View; +import com.vaadin.navigator.ViewDisplay; import com.vaadin.server.VaadinSession; -import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.SpringViewDisplay; import com.vaadin.spring.annotation.UIScope; import com.vaadin.v7.ui.HorizontalLayout; import com.vaadin.v7.ui.VerticalLayout; @@ -31,19 +34,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import static com.kiroule.jpetstore.vaadinspring.ui.menu.TopNavBar.SIGNIN_BUTTON_URI; -import static com.kiroule.jpetstore.vaadinspring.ui.menu.TopNavBar.SIGNOUT_BUTTON_URI; +import static com.kiroule.jpetstore.vaadinspring.ui.component.TopNavBar.SIGNIN_BUTTON_URI; +import static com.kiroule.jpetstore.vaadinspring.ui.component.TopNavBar.SIGNOUT_BUTTON_URI; import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.SHOPPING_CART; /** * @author Igor Baiborodine */ -@SpringComponent +@SpringViewDisplay @UIScope -class MainView extends HorizontalLayout implements HasLogger, HasUIEventBus { +class MainView extends HorizontalLayout implements HasLogger, HasUIEventBus, ViewDisplay { private static final long serialVersionUID = 7419653252582861360L; + private final NavigationManager navigationManager; private final LeftNavBar leftNavBar; private final TopNavBar topNavBar; private final CatalogService catalogService; @@ -52,9 +56,10 @@ class MainView extends HorizontalLayout implements HasLogger, HasUIEventBus { private final VerticalLayout viewContainer = new VerticalLayout(); @Autowired - public MainView(LeftNavBar leftNavBar, TopNavBar topNavBar, + public MainView(NavigationManager navigationManager, LeftNavBar leftNavBar, TopNavBar topNavBar, CatalogService catalogService, NavBarButtonUpdater navBarButtonUpdater) { super(); + this.navigationManager = navigationManager; this.leftNavBar = leftNavBar; this.topNavBar = topNavBar; this.catalogService = catalogService; @@ -74,8 +79,10 @@ public MainView(LeftNavBar leftNavBar, TopNavBar topNavBar, getLogger().info("Main view initialized"); } - public VerticalLayout getViewContainer() { - return viewContainer; + @Override + public void showView(View view) { + viewContainer.removeAllComponents(); + viewContainer.addComponent(view.getViewComponent()); } @EventBusListenerMethod @@ -151,6 +158,6 @@ public void changeCartItemQuantity(UIChangeCartItemQuantityEvent event) { } private void navigateTo(String viewName) { - AppUI.getCurrent().getNavigator().navigateTo(viewName); + navigationManager.navigateTo(viewName); } } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/LeftNavBar.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java similarity index 81% rename from src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/LeftNavBar.java rename to src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java index b703c10..74c6bba 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/LeftNavBar.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java @@ -1,4 +1,4 @@ -package com.kiroule.jpetstore.vaadinspring.ui.menu; +package com.kiroule.jpetstore.vaadinspring.ui.component; import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; @@ -12,8 +12,6 @@ import com.vaadin.v7.shared.ui.label.ContentMode; import com.vaadin.v7.ui.Label; -import org.springframework.beans.factory.annotation.Autowired; - import javax.annotation.PostConstruct; /** @@ -25,8 +23,11 @@ public class LeftNavBar extends CssLayout implements HasUIEventBus { private static final long serialVersionUID = 3267397700833804590L; - @Autowired - private NavBarButtonUpdater navBarButtonUpdater; + private final NavBarButtonUpdater navBarButtonUpdater; + + public LeftNavBar(NavBarButtonUpdater navBarButtonUpdater) { + this.navBarButtonUpdater = navBarButtonUpdater; + } @PostConstruct public void init() { @@ -48,7 +49,8 @@ public void init() { private void addButton(String categoryId, String displayName) { String uri = ProductListView.VIEW_NAME + "/" + categoryId; - Button viewButton = new Button(displayName, click -> getUIEventBus().publish(LeftNavBar.this, new UINavigationEvent(uri))); + Button viewButton = new Button(displayName, + click -> getUIEventBus().publish(LeftNavBar.this, new UINavigationEvent(uri))); navBarButtonUpdater.mapButtonToUri(uri, viewButton); viewButton.addStyleName(JPetStoreTheme.MENU_ITEM); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/TopNavBar.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java similarity index 92% rename from src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/TopNavBar.java rename to src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java index e56c13a..937ab32 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/menu/TopNavBar.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java @@ -1,4 +1,4 @@ -package com.kiroule.jpetstore.vaadinspring.ui.menu; +package com.kiroule.jpetstore.vaadinspring.ui.component; import com.kiroule.jpetstore.vaadinspring.domain.Account; import com.kiroule.jpetstore.vaadinspring.service.LoginService; @@ -27,8 +27,6 @@ import com.vaadin.v7.ui.Label; import com.vaadin.v7.ui.TextField; -import org.springframework.beans.factory.annotation.Autowired; - import javax.annotation.PostConstruct; import javax.security.auth.login.LoginException; @@ -47,17 +45,20 @@ public class TopNavBar extends CssLayout implements HasUIEventBus { public static final String SIGNIN_BUTTON_URI = "sign-in"; public static final String SIGNOUT_BUTTON_URI = "sign-out"; - @Autowired - private NavBarButtonUpdater navBarButtonUpdater; - @Autowired - private SigninForm signinForm; - @Autowired - private LoginService loginService; + private final NavBarButtonUpdater navBarButtonUpdater; + private final SigninForm signinForm; + private final LoginService loginService; private Button signinButton; private Button signoutButton; private Label userLabel; + public TopNavBar(NavBarButtonUpdater navBarButtonUpdater, SigninForm signinForm, LoginService loginService) { + this.navBarButtonUpdater = navBarButtonUpdater; + this.signinForm = signinForm; + this.loginService = loginService; + } + @PostConstruct void init() { diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/navigation/NavigationManager.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/navigation/NavigationManager.java new file mode 100644 index 0000000..6af4ee4 --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/navigation/NavigationManager.java @@ -0,0 +1,32 @@ +package com.kiroule.jpetstore.vaadinspring.ui.navigation; + +import com.kiroule.jpetstore.vaadinspring.ui.view.HomeView; +import com.vaadin.navigator.View; +import com.vaadin.spring.annotation.SpringView; +import com.vaadin.spring.annotation.UIScope; +import com.vaadin.spring.internal.Conventions; +import com.vaadin.spring.navigator.SpringNavigator; + +import org.springframework.stereotype.Component; + +@Component +@UIScope +public class NavigationManager extends SpringNavigator { + + public String getViewId(Class viewClass) { + SpringView springView = viewClass.getAnnotation(SpringView.class); + if (springView == null) { + throw new IllegalArgumentException("The target class must be a @SpringView"); + } + return Conventions.deriveMappingForView(viewClass, springView); + } + + public void navigateTo(Class targetView) { + String viewId = getViewId(targetView); + navigateTo(viewId); + } + + public void navigateToDefaultView() { + navigateTo(HomeView.class); + } +}