diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManager.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManager.java new file mode 100644 index 000000000..800594ea8 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManager.java @@ -0,0 +1,52 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.navalplanner.web.scenarios; + +import org.navalplanner.business.scenarios.IScenarioManager; +import org.navalplanner.business.scenarios.bootstrap.IScenariosBootstrap; +import org.navalplanner.business.scenarios.entities.Scenario; +import org.navalplanner.web.users.services.CustomUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.Authentication; +import org.springframework.security.context.SecurityContextHolder; + +/** + * @author Óscar González Fernández + * + */ +public class CurrentUserScenarioAwareManager implements IScenarioManager { + + @Autowired + private IScenariosBootstrap scenariosBootstrap; + + @Override + public Scenario getCurrent() { + Authentication authentication = SecurityContextHolder.getContext() + .getAuthentication(); + return authentication == null ? scenariosBootstrap.getMain() + : getScenarioFrom(authentication); + } + + private Scenario getScenarioFrom(Authentication authentication) { + CustomUser user = (CustomUser) authentication.getPrincipal(); + return user.getScenario(); + } + +} diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index ad9656f0d..d65659acf 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -52,6 +52,10 @@ + + diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManagerTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManagerTest.java new file mode 100644 index 000000000..0514876b7 --- /dev/null +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/scenarios/CurrentUserScenarioAwareManagerTest.java @@ -0,0 +1,112 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.navalplanner.web.scenarios; + +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createNiceMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.junit.Assert.assertEquals; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE; +import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE; +import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.scenarios.IScenarioManager; +import org.navalplanner.business.scenarios.bootstrap.IScenariosBootstrap; +import org.navalplanner.business.scenarios.bootstrap.PredefinedScenarios; +import org.navalplanner.business.scenarios.entities.Scenario; +import org.navalplanner.web.users.services.CustomUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.Authentication; +import org.springframework.security.context.SecurityContext; +import org.springframework.security.context.SecurityContextHolder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Óscar González Fernández + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE, + WEBAPP_SPRING_SECURITY_CONFIG_FILE }) +@Transactional +public class CurrentUserScenarioAwareManagerTest { + + @Autowired + private IScenariosBootstrap scenariosBootstrap; + + @Autowired + private IScenarioManager scenarioManager; + + @Before + public void loadRequiredData() { + scenariosBootstrap.loadRequiredData(); + } + + @Test + public void ifNoUserAuthenticatedMainScenarioIsReturned() { + Scenario current = scenarioManager.getCurrent(); + assertEquals(PredefinedScenarios.MASTER.getName(), current.getName()); + assertEquals(scenariosBootstrap.getMain(), current); + } + + @Test + public void retrievesTheScenarioAssociatedWithTheAuthentication() { + Scenario customScenario = mockScenario(); + givenUserAuthenticatedWith(customScenario); + Scenario current = scenarioManager.getCurrent(); + assertEquals(customScenario, current); + } + + private Scenario mockScenario() { + Scenario result = createNiceMock(Scenario.class); + replay(result); + return result; + } + + private Scenario givenUserAuthenticatedWith(Scenario customScenario) { + SecurityContext context = SecurityContextHolder.getContext(); + CustomUser user = createUserWithScenario(customScenario); + Authentication authentication = stubAuthenticationWithPrincipal(user); + context.setAuthentication(authentication); + return customScenario; + } + + + private CustomUser createUserWithScenario(Scenario customScenario) { + CustomUser result = createNiceMock(CustomUser.class); + expect(result.getScenario()).andReturn(customScenario).anyTimes(); + replay(result); + return result; + } + + private Authentication stubAuthenticationWithPrincipal(CustomUser customUser) { + Authentication result = createNiceMock(Authentication.class); + expect(result.getPrincipal()).andReturn(customUser).anyTimes(); + replay(result); + return result; + } + +}