package com.vaadin.tests.navigator; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.VaadinRequest; import com.vaadin.tests.components.AbstractReindeerTestUI; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; public class NavigatorListenerModifiesListeners extends AbstractReindeerTestUI { private Navigator navigator; protected static final String LABEL_MAINVIEW_ID = "LABEL_MAINVIEW_ID"; protected static final String LABEL_ANOTHERVIEW_ID = "LABEL_ANOTHERVIEW_ID"; // NOP view change listener private class MyViewChangeListener implements ViewChangeListener { @Override public boolean beforeViewChange(ViewChangeEvent event) { navigator.removeViewChangeListener(listener1); navigator.addViewChangeListener(listener2); return true; } @Override public void afterViewChange(ViewChangeEvent event) { navigator.removeViewChangeListener(listener2); navigator.addViewChangeListener(listener1); } } private MyViewChangeListener listener1 = new MyViewChangeListener(); private MyViewChangeListener listener2 = new MyViewChangeListener(); @Override protected void setup(VaadinRequest request) { navigator = new Navigator(this, this); navigator.addView(MainView.NAME, new MainView()); navigator.addView(AnotherView.NAME, new AnotherView()); navigator.addViewChangeListener(listener1); navigator.navigateTo(MainView.NAME); } class MainView extends VerticalLayout implements View { public static final String NAME = "mainview"; public MainView() { Label label = new Label("MainView content"); label.setId(LABEL_MAINVIEW_ID); addComponent(label); Button buttonNavToAnotherView = new Button( "Navigate to another view", new ClickListener() { @Override public void buttonClick(ClickEvent event) { navigator.navigateTo(AnotherView.NAME); } }); addComponent(buttonNavToAnotherView); } @Override public void enter(ViewChangeEvent event) { } } class AnotherView extends VerticalLayout implements View { public static final String NAME = "another"; public AnotherView() { Label label = new Label("AnotherView content"); label.setId(LABEL_ANOTHERVIEW_ID); addComponent(label); } @Override public void enter(ViewChangeEvent event) { } } @Override protected String getTestDescription() { return "Adding and removing view change listeners from view change listeners should not cause a ConcurrentModificationException"; } @Override protected Integer getTicketNumber() { return 17477; } }