/** * TestCube is an enterprise Test management tool. * Copyright (C) 2011 JatakaSource Ltd. * * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * TestCube 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with TestCube. If not, see <http://www.gnu.org/licenses/>. */ package org.jatakasource.testcube.web.controller.testrun; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.jatakasource.common.model.security.UserPojo; import org.jatakasource.common.svc.CRUDService; import org.jatakasource.testcube.model.testrun.ITestRun; import org.jatakasource.testcube.model.testrun.RunStatus; import org.jatakasource.testcube.model.testrun.RunStatusEnum; import org.jatakasource.testcube.model.testrun.RunStatusPojo; import org.jatakasource.testcube.model.testrun.TestRun; import org.jatakasource.testcube.model.testrun.TestRunStatisticsPojo; import org.jatakasource.testcube.svc.security.UserService; import org.jatakasource.testcube.svc.testrun.RunStatusService; import org.jatakasource.testcube.svc.testrun.TestRunService; import org.jatakasource.testcube.web.controller.ApplicationMessagesController; import org.jatakasource.testcube.web.controller.GeneralProperties; import org.jatakasource.testcube.web.xml.testrun.TestRunGridParameters; import org.jatakasource.testcube.web.xml.testrun.TestRunRendered; import org.jatakasource.testcube.web.xml.testrun.TestRunRenderedList; import org.jatakasource.testcube.web.xml.testrun.TestRunStatisticsRendered; import org.jatakasource.testcube.web.xml.testrun.TestRunWithStatisticsRendered; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller public class TestRunController extends ApplicationMessagesController<ITestRun, Long> { private static final Logger logger = Logger.getLogger(TestRunController.class); @Autowired private TestRunService testRunService; @Autowired private RunStatusService runStatusService; @Autowired private UserService userService; @Override protected CRUDService<ITestRun, Long> getCrudService() { return testRunService; } @Override protected String getModelName() { return getMessages().getMessage(TestRunProperties.class.getName() + "." + TestRunProperties.MODEL_NAME.name()); } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/all") protected ModelAndView all(@RequestParam(value = GRID_PARAMETERS, required = true) String xmlGridParameters) { logger.trace("Request for all test-runs with parameters " + xmlGridParameters + "!!!"); return search(xmlGridParameters); } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/search") protected ModelAndView search(@RequestParam(value = GRID_PARAMETERS, required = true) String xmlGridParameters) { logger.trace("Request for search test-runs with parameters " + xmlGridParameters + "!!!"); TestRunGridParameters gridParameters = null; String keyword = null; Long productId = null; Long testPlanId = null; if (StringUtils.isNotEmpty(xmlGridParameters)) { gridParameters = getGridParameters(xmlGridParameters, TestRunGridParameters.class); keyword = gridParameters.getKeyword(); productId = gridParameters.getProductId(); testPlanId = gridParameters.getTestPlanId(); } PagingAndSorting pagingAndSorting = getPagingAndSorting(gridParameters); // Return all runs according to keyword search List<ITestRun> runs = testRunService.getAll(pagingAndSorting.getPaging(), pagingAndSorting.getSorting(), keyword, productId, testPlanId); // Extract id from the original objects List<Long> ids = getIds(runs); // Calculate run statistics - grouped by id Map<Long, List<TestRunStatisticsRendered>> statistics = getStatisticsMap(testRunService.getStatistics(ids)); // Convert all users to UsersRendered TestRunRenderedList testRunRenderedList = getAsRenderer(runs, TestRunWithStatisticsRendered.class, ITestRun.class, TestRunRenderedList.class, gridParameters); // Merge TestRunStatisticsRendered into TestRunWithStatisticsRendered testRunRenderedList = mergeStatistics(testRunRenderedList, statistics); return getXMLViewer(testRunRenderedList); } /** * Merge TestRunStatisticsRendered into TestRunWithStatisticsRendered */ protected TestRunRenderedList mergeStatistics(TestRunRenderedList testRunRenderedList, Map<Long, List<TestRunStatisticsRendered>> statistics) { if (testRunRenderedList != null && CollectionUtils.isNotEmpty(testRunRenderedList.getInnerList()) && statistics != null) { for (TestRunWithStatisticsRendered testRunStat : testRunRenderedList.getInnerList()) { testRunStat.setStatistics(statistics.get(testRunStat.getId())); } } return testRunRenderedList; } /** * Convert List<TestRunStatisticsPojo> to List<TestRunStatisticsRendered>, <br/> * and Group the result according to TestRun id. */ protected Map<Long, List<TestRunStatisticsRendered>> getStatisticsMap(List<TestRunStatisticsPojo> statistics) { Map<Long, List<TestRunStatisticsRendered>> runStatistics = new HashMap<Long, List<TestRunStatisticsRendered>>(); if (CollectionUtils.isNotEmpty(statistics)) { for (TestRunStatisticsPojo stat : statistics) { if (!runStatistics.containsKey(stat.getTestRun().getId())) { runStatistics.put(stat.getTestRun().getId(), new ArrayList<TestRunStatisticsRendered>()); } runStatistics.get(stat.getTestRun().getId()).add(new TestRunStatisticsRendered(stat)); } } return runStatistics; } @Override @RequestMapping(value = PROTECTED_SERVICE + "/testrun/delete") protected ModelAndView delete(@RequestParam(value = CRUD_PARAMETERS, required = true) Long id) { return super.delete(id); } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/update") protected ModelAndView update(@RequestParam(value = CRUD_PARAMETERS, required = true) String xmlCrudParameters) { return super.update(xmlCrudParameters, TestRunRendered.class, TestRun.class); } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/create") protected ModelAndView create(@RequestParam(value = CRUD_PARAMETERS, required = true) String xmlCrudParameters) { return super.create(xmlCrudParameters, TestRunRendered.class, TestRun.class); } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/start") protected ModelAndView start(@RequestParam(value = CRUD_PARAMETERS, required = true) Long id) { try { TestRun testRun = (TestRun) testRunService.get(id); testRun.setStatus((RunStatus) runStatusService.get(RunStatusEnum.RUNNING)); testRunService.update(testRun); return getXMLViewer(getInfo(getMessages().getMessage(GeneralProperties.class.getName() + "." + GeneralProperties.INFO_TITLE.name()), getMessages().getMessage(TestRunProperties.class.getName() + "." + TestRunProperties.START_SUCCEED.name(), getModelName()))); } catch (Exception e) { return handleException(e, TestRunProperties.class.getName() + "." + TestRunProperties.START_FAILED.name()); } } @RequestMapping(value = PROTECTED_SERVICE + "/testrun/stop") protected ModelAndView stop(@RequestParam(value = CRUD_PARAMETERS, required = true) Long id) { try { TestRun testRun = (TestRun) testRunService.get(id); testRun.setStatus((RunStatus) runStatusService.get(RunStatusEnum.STOPPED)); testRunService.update(testRun); return getXMLViewer(getInfo(getMessages().getMessage(GeneralProperties.class.getName() + "." + GeneralProperties.INFO_TITLE.name()), getMessages().getMessage(TestRunProperties.class.getName() + "." + TestRunProperties.STOP_SUCCEED.name(), getModelName()))); } catch (Exception e) { return handleException(e, TestRunProperties.class.getName() + "." + TestRunProperties.STOP_FAILED.name()); } } @Override protected ITestRun beforeCreate(ITestRun model) { return setDate(setUser(setStatus(model))); } private ITestRun setUser(ITestRun testCase) { testCase.setCreatedBy((UserPojo) userService.getCurrentUser()); return testCase; } private ITestRun setDate(ITestRun testCase) { testCase.setCreatedDate(new Date()); return testCase; } private ITestRun setStatus(ITestRun testCase) { testCase.setStatus((RunStatusPojo) runStatusService.get(RunStatusEnum.IDLE)); return testCase; } }