Search in sources :

Example 1 with ITagService

use of org.cerberus.crud.service.ITagService in project cerberus-source by cerberustesting.

the class AddToExecutionQueueV001 method processRequest.

/**
 * Process request for both GET and POST method.
 *
 * <p>
 * Request processing is divided in two parts:
 * <ol>
 * <li>Getting all test cases which have been sent to this servlet;</li>
 * <li>Try to insert all these test cases to the execution queue.</li>
 * </ol>
 * </p>
 *
 * @param request
 * @param response
 * @throws ServletException
 * @throws IOException
 */
private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    final String charset = request.getCharacterEncoding();
    Date requestDate = new Date();
    // Loading Services.
    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    inQueueService = appContext.getBean(ITestCaseExecutionQueueService.class);
    inQueueFactoryService = appContext.getBean(IFactoryTestCaseExecutionQueue.class);
    executionThreadService = appContext.getBean(IExecutionThreadPoolService.class);
    testCaseService = appContext.getBean(ITestCaseService.class);
    invariantService = appContext.getBean(IInvariantService.class);
    applicationService = appContext.getBean(IApplicationService.class);
    testCaseCountryService = appContext.getBean(ITestCaseCountryService.class);
    campaignParameterService = appContext.getBean(ICampaignParameterService.class);
    // Calling Servlet Transversal Util.
    ServletUtil.servletStart(request);
    // Default message to unexpected error.
    MessageEvent msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED);
    msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", ""));
    AnswerItem<List<TestCase>> testcases = null;
    /**
     * Adding Log entry.
     */
    ILogEventService logEventService = appContext.getBean(ILogEventService.class);
    logEventService.createForPublicCalls("/AddToExecutionQueueV001", "CALL", "AddToExecutionQueueV001 called : " + request.getRequestURL(), request);
    // Parsing all parameters.
    // Execution scope parameters : Campaign, TestCases, Countries, Environment, Browser.
    String campaign = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_CAMPAIGN), null, charset);
    List<Map<String, String>> selectedTests;
    selectedTests = ParameterParserUtil.parseListMapParamAndDecode(request.getParameterValues(PARAMETER_SELECTED_TEST), null, charset);
    List<String> countries;
    countries = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_COUNTRY), null, charset);
    List<String> environments;
    environments = ParameterParserUtil.parseListParamAndDecodeAndDeleteEmptyValue(request.getParameterValues(PARAMETER_ENVIRONMENT), null, charset);
    List<String> browsers;
    browsers = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_BROWSER), null, charset);
    // Execution parameters.
    String tag = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_TAG), "");
    String robot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT), null, charset);
    String robotIP = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT_IP), null, charset);
    String robotPort = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT_PORT), null, charset);
    String browserVersion = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_BROWSER_VERSION), null, charset);
    String platform = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_PLATFORM), null, charset);
    String screenSize = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_SCREENSIZE), null, charset);
    int manualURL = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_MANUAL_URL), DEFAULT_VALUE_MANUAL_URL, charset);
    String manualHost = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_HOST), null, charset);
    String manualContextRoot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_CONTEXT_ROOT), null, charset);
    String manualLoginRelativeURL = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_LOGIN_RELATIVE_URL), null, charset);
    String manualEnvData = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_ENV_DATA), null, charset);
    int screenshot = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_SCREENSHOT), DEFAULT_VALUE_SCREENSHOT, charset);
    int verbose = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_VERBOSE), DEFAULT_VALUE_VERBOSE, charset);
    String timeout = request.getParameter(PARAMETER_TIMEOUT);
    int pageSource = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_PAGE_SOURCE), DEFAULT_VALUE_PAGE_SOURCE, charset);
    int seleniumLog = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_SELENIUM_LOG), DEFAULT_VALUE_SELENIUM_LOG, charset);
    int retries = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_RETRIES), DEFAULT_VALUE_RETRIES, charset);
    String manualExecution = ParameterParserUtil.parseStringParamAndDecode(request.getParameter(PARAMETER_MANUAL_EXECUTION), DEFAULT_VALUE_MANUAL_EXECUTION, charset);
    int priority = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_EXEPRIORITY), DEFAULT_VALUE_PRIORITY, charset);
    if (manualExecution.equals("")) {
        manualExecution = DEFAULT_VALUE_MANUAL_EXECUTION;
    }
    String outputFormat = ParameterParserUtil.parseStringParamAndDecode(request.getParameter(PARAMETER_OUTPUTFORMAT), DEFAULT_VALUE_OUTPUTFORMAT, charset);
    // Defining help message.
    String helpMessage = "This servlet is used to add to Cerberus execution queue a list of execution. Execution list will be calculated from cartesian product of " + "testcase, country, environment and browser list. Those list can be defined from the associated servlet parameter but can also be defined from campaign directy inside Cerberus.\n" + "List defined from servlet overwrite the list defined from the campaign. All other execution parameters will be taken to each execution.\n" + "Available parameters:\n" + "- " + PARAMETER_CAMPAIGN + " : Campaign name from which testcase, countries, environment and browser can be defined from Cerberus. [" + campaign + "]\n" + "- " + PARAMETER_SELECTED_TEST + " : List of testCase to trigger. That list overwrite the list coming from the Campaign (if defined). Ex : " + PARAMETER_SELECTED_TEST + "=" + PARAMETER_SELECTED_TEST_KEY_TEST + "=Cerberus%26" + PARAMETER_SELECTED_TEST_KEY_TESTCASE + "=9644A. [" + selectedTests + "]\n" + "- " + PARAMETER_COUNTRY + " : List of countries to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + countries + "]\n" + "- " + PARAMETER_ENVIRONMENT + " : List of environment to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + environments + "]\n" + "- " + PARAMETER_BROWSER + " : List of browser to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + browsers + "]\n" + "- " + PARAMETER_ROBOT + " : Robot Name that will be used for every execution triggered. [" + robot + "]\n" + "- " + PARAMETER_ROBOT_IP + " : Robot IP that will be used for every execution triggered. [" + robotIP + "]\n" + "- " + PARAMETER_ROBOT_PORT + " : Robot Port that will be used for every execution triggered. [" + robotPort + "]\n" + "- " + PARAMETER_BROWSER_VERSION + " : Browser Version that will be used for every execution triggered. [" + browserVersion + "]\n" + "- " + PARAMETER_PLATFORM + " : Platform that will be used for every execution triggered. [" + platform + "]\n" + "- " + PARAMETER_SCREENSIZE + " : Size of the screen that will be used for every execution triggered. [" + screenSize + "]\n" + "- " + PARAMETER_MANUAL_URL + " : Activate (1) or not (0) the Manual URL of the application to execute. If activated the 4 parameters after are necessary. [" + manualURL + "]\n" + "- " + PARAMETER_MANUAL_HOST + " : Host of the application to test (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualHost + "]\n" + "- " + PARAMETER_MANUAL_CONTEXT_ROOT + " : Context root of the application to test (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualContextRoot + "]\n" + "- " + PARAMETER_MANUAL_LOGIN_RELATIVE_URL + " : Relative login URL of the application (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualLoginRelativeURL + "]\n" + "- " + PARAMETER_MANUAL_ENV_DATA + " : Environment where to get the test data when a " + PARAMETER_MANUAL_URL + " is defined. (only used when manualURL is active). [" + manualEnvData + "]\n" + "- " + PARAMETER_TAG + " : Tag that will be used for every execution triggered. [" + tag + "]\n" + "- " + PARAMETER_SCREENSHOT + " : Activate or not the screenshots for every execution triggered. [" + screenshot + "]\n" + "- " + PARAMETER_VERBOSE + " : Verbose level for every execution triggered. [" + verbose + "]\n" + "- " + PARAMETER_TIMEOUT + " : Timeout used for the action that will be used for every execution triggered. [" + timeout + "]\n" + "- " + PARAMETER_PAGE_SOURCE + " : Record Page Source during for every execution triggered. [" + pageSource + "]\n" + "- " + PARAMETER_SELENIUM_LOG + " : Get the SeleniumLog at the end of the execution for every execution triggered. [" + seleniumLog + "]\n" + "- " + PARAMETER_MANUAL_EXECUTION + " : Execute testcase in manual mode for every execution triggered. [" + manualExecution + "]\n" + "- " + PARAMETER_RETRIES + " : Number of tries if the result is not OK for every execution triggered. [" + retries + "]\n" + "- " + PARAMETER_EXEPRIORITY + " : Priority that will be used in the queue for every execution triggered. [" + priority + "]\n";
    // try {
    // Checking the parameter validity.
    StringBuilder errorMessage = new StringBuilder();
    boolean error = false;
    if (tag == null || tag.isEmpty()) {
        if (request.getRemoteUser() != null) {
            tag = request.getRemoteUser();
        }
        if (tag.length() > 0) {
            tag += ".";
        }
        if (campaign != null) {
            tag += campaign;
        }
        if (tag.length() > 0) {
            tag += ".";
        }
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        String mytimestamp = sdf.format(timestamp);
        tag += mytimestamp;
    } else if (tag.length() > 255) {
        errorMessage.append("Error - Parameter " + PARAMETER_TAG + " is too big. Maximum size if 255. Current size is : " + tag.length());
        error = true;
    }
    if (campaign != null && !campaign.isEmpty()) {
        final AnswerItem<Map<String, List<String>>> parsedCampaignParameters = campaignParameterService.parseParametersByCampaign(campaign);
        if (parsedCampaignParameters.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode())) {
            // If parameters are already defined from request, we ignore the campaign values.
            if (countries == null || countries.isEmpty()) {
                countries = parsedCampaignParameters.getItem().get(CampaignParameter.COUNTRY_PARAMETER);
            }
            if (environments == null || environments.isEmpty()) {
                environments = parsedCampaignParameters.getItem().get(CampaignParameter.ENVIRONMENT_PARAMETER);
            }
            if (browsers == null || browsers.isEmpty()) {
                browsers = parsedCampaignParameters.getItem().get(CampaignParameter.BROWSER_PARAMETER);
            }
        }
        if ((countries != null) && (selectedTests == null || selectedTests.isEmpty())) {
            // If no countries are found, there is no need to get the testcase list. None will be returned.
            selectedTests = new ArrayList<>();
            testcases = testCaseService.findTestCaseByCampaignNameAndCountries(campaign, countries.toArray(new String[countries.size()]));
            ListIterator<TestCase> it = testcases.getItem().listIterator();
            while (it.hasNext()) {
                TestCase str = it.next();
                selectedTests.add(new HashMap<String, String>() {

                    {
                        put(PARAMETER_SELECTED_TEST_KEY_TEST, str.getTest());
                        put(PARAMETER_SELECTED_TEST_KEY_TESTCASE, str.getTestCase());
                    }
                });
            }
        }
    }
    if (countries == null || countries.isEmpty()) {
        errorMessage.append("Error - No Country defined. You can either feed it with parameter '" + PARAMETER_COUNTRY + "' or add it into the campaign definition.");
        error = true;
    }
    if (browsers == null || browsers.isEmpty()) {
        errorMessage.append("Error - No Browser defined. You can either feed it with parameter '" + PARAMETER_BROWSER + "' or add it into the campaign definition.");
        error = true;
    }
    if (selectedTests == null || selectedTests.isEmpty()) {
        errorMessage.append("Error - No TestCases defined. You can either feed it with parameter '" + PARAMETER_SELECTED_TEST + "' or add it into the campaign definition.");
        error = true;
    }
    if (manualURL >= 1) {
        if (manualHost == null || manualEnvData == null) {
            errorMessage.append("Error - ManualURL has been activated but no ManualHost or Manual Environment defined.");
            error = true;
        }
    } else if (environments == null || environments.isEmpty()) {
        errorMessage.append("Error - No Environment defined (and " + PARAMETER_MANUAL_URL + " not activated). You can either feed it with parameter '" + PARAMETER_ENVIRONMENT + "' or add it into the campaign definition.");
        error = true;
    }
    int nbExe = 0;
    JSONArray jsonArray = new JSONArray();
    String user = request.getRemoteUser() == null ? "" : request.getRemoteUser();
    // Starting the request only if previous parameters exist.
    if (!error) {
        // Create Tag when exist.
        if (!StringUtil.isNullOrEmpty(tag)) {
            // We create or update it.
            ITagService tagService = appContext.getBean(ITagService.class);
            tagService.createAuto(tag, campaign, user);
        }
        // Part 1: Getting all possible xecution from test cases + countries + environments + browsers which have been sent to this servlet.
        Map<String, String> invariantEnv = invariantService.readToHashMapGp1StringByIdname("ENVIRONMENT", "");
        List<TestCaseExecutionQueue> toInserts = new ArrayList<TestCaseExecutionQueue>();
        try {
            LOG.debug("Nb of TestCase : " + selectedTests.size());
            for (Map<String, String> selectedTest : selectedTests) {
                String test = selectedTest.get(PARAMETER_SELECTED_TEST_KEY_TEST);
                String testCase = selectedTest.get(PARAMETER_SELECTED_TEST_KEY_TESTCASE);
                TestCase tc = testCaseService.convert(testCaseService.readByKey(test, testCase));
                // TestCases that are not active are not inserted into queue.
                if (tc.getTcActive().equals("Y")) {
                    // We only insert testcase that exist for the given country.
                    for (TestCaseCountry country : testCaseCountryService.convert(testCaseCountryService.readByTestTestCase(null, test, testCase))) {
                        if (countries.contains(country.getCountry())) {
                            // for each environment we test that correspondng gp1 is compatible with testcase environment flag activation.
                            for (String environment : environments) {
                                String envGp1 = invariantEnv.get(environment);
                                if (((envGp1.equals("PROD")) && (tc.getActivePROD().equalsIgnoreCase("Y"))) || ((envGp1.equals("UAT")) && (tc.getActiveUAT().equalsIgnoreCase("Y"))) || ((envGp1.equals("QA")) && (tc.getActiveQA().equalsIgnoreCase("Y"))) || (envGp1.equals("DEV"))) {
                                    // Getting Application in order to check application type against browser.
                                    Application app = applicationService.convert(applicationService.readByKey(tc.getApplication()));
                                    if ((app != null) && (app.getType() != null) && app.getType().equalsIgnoreCase(Application.TYPE_GUI)) {
                                        for (String browser : browsers) {
                                            try {
                                                toInserts.add(inQueueFactoryService.create(test, testCase, country.getCountry(), environment, robot, robotIP, robotPort, browser, browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, priority, user, null, null, null));
                                            } catch (FactoryCreationException e) {
                                                LOG.error("Unable to insert record due to: " + e, e);
                                                LOG.error("test: " + test + "-" + testCase + "-" + country.getCountry() + "-" + environment + "-" + robot);
                                            }
                                        }
                                    } else {
                                        // Application does not support browser so we force an empty value.
                                        LOG.debug("Forcing Browser to empty value. Application type=" + app.getType());
                                        try {
                                            toInserts.add(inQueueFactoryService.create(test, testCase, country.getCountry(), environment, robot, robotIP, robotPort, "", browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, priority, user, null, null, null));
                                        } catch (FactoryCreationException e) {
                                            LOG.error("Unable to insert record due to: " + e, e);
                                            LOG.error("test: " + test + "-" + testCase + "-" + country.getCountry() + "-" + environment + "-" + robot);
                                        }
                                    }
                                } else {
                                    LOG.debug("Env group not active for testcase : " + environment);
                                }
                            }
                        } else {
                            LOG.debug("Country does not match. " + countries + " " + country.getCountry());
                        }
                    }
                } else {
                    LOG.debug("TestCase not Active.");
                }
            }
        } catch (CerberusException ex) {
            LOG.warn(ex);
        }
        // Part 2: Try to insert all these test cases to the execution queue.
        List<String> errorMessages = new ArrayList<String>();
        for (TestCaseExecutionQueue toInsert : toInserts) {
            try {
                inQueueService.convert(inQueueService.create(toInsert));
                nbExe++;
                JSONObject value = new JSONObject();
                value.put("queueId", toInsert.getId());
                value.put("test", toInsert.getTest());
                value.put("testcase", toInsert.getTestCase());
                value.put("country", toInsert.getCountry());
                value.put("environment", toInsert.getEnvironment());
                jsonArray.put(value);
            } catch (CerberusException e) {
                String errorMessageTmp = "Unable to insert " + toInsert.toString() + " due to " + e.getMessage();
                LOG.warn(errorMessageTmp);
                errorMessages.add(errorMessageTmp);
                continue;
            } catch (JSONException ex) {
                java.util.logging.Logger.getLogger(AddToExecutionQueueV001.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        // Part 3 : Trigger JobQueue
        try {
            executionThreadService.executeNextInQueueAsynchroneously(false);
        } catch (CerberusException ex) {
            String errorMessageTmp = "Unable to feed the execution queue due to " + ex.getMessage();
            LOG.warn(errorMessageTmp);
            errorMessages.add(errorMessageTmp);
        }
        if (!errorMessages.isEmpty()) {
            StringBuilder errorMessageTmp = new StringBuilder();
            for (String item : errorMessages) {
                errorMessageTmp.append(item);
                errorMessageTmp.append(LINE_SEPARATOR);
            }
            errorMessage.append(errorMessageTmp.toString());
        }
        errorMessage.append(nbExe);
        errorMessage.append(" execution(s) succesfully inserted to queue. ");
        if (testcases.getResultMessage().getSource() == MessageEventEnum.DATA_OPERATION_WARNING_PARTIAL_RESULT) {
            errorMessage.append(testcases.getResultMessage().getDescription());
        }
        // Message that everything went fine.
        msg = new MessageEvent(MessageEventEnum.GENERIC_OK);
    } else {
    // In case of errors, we display the help message.
    // errorMessage.append(helpMessage);
    }
    // Init Answer with potencial error from Parsing parameter.
    AnswerItem answer = new AnswerItem(msg);
    switch(outputFormat) {
        case "json":
            try {
                JSONObject jsonResponse = new JSONObject();
                jsonResponse.put("messageType", answer.getResultMessage().getMessage().getCodeString());
                jsonResponse.put("message", errorMessage.toString());
                jsonResponse.put("helpMessage", helpMessage);
                jsonResponse.put("tag", tag);
                jsonResponse.put("nbExe", nbExe);
                jsonResponse.put("queueList", jsonArray);
                response.setContentType("application/json");
                response.setCharacterEncoding("utf8");
                response.getWriter().print(jsonResponse.toString());
            } catch (JSONException e) {
                LOG.warn(e);
                // returns a default error message with the json format that is able to be parsed by the client-side
                response.setContentType("application/json");
                response.setCharacterEncoding("utf8");
                response.getWriter().print(AnswerUtil.createGenericErrorAnswer());
            }
            break;
        default:
            response.setContentType("text");
            response.setCharacterEncoding("utf8");
            if (error) {
                errorMessage.append("\n");
                errorMessage.append(helpMessage);
            }
            response.getWriter().print(errorMessage.toString());
    }
// } catch (Exception e) {
// LOG.error(e);
// out.println(helpMessage);
// out.println(e.toString());
// }
}
Also used : MessageEvent(org.cerberus.engine.entity.MessageEvent) ArrayList(java.util.ArrayList) Timestamp(java.sql.Timestamp) ITestCaseCountryService(org.cerberus.crud.service.ITestCaseCountryService) FactoryCreationException(org.cerberus.exception.FactoryCreationException) ApplicationContext(org.springframework.context.ApplicationContext) ITestCaseService(org.cerberus.crud.service.ITestCaseService) ILogEventService(org.cerberus.crud.service.ILogEventService) TestCaseCountry(org.cerberus.crud.entity.TestCaseCountry) ArrayList(java.util.ArrayList) List(java.util.List) TestCaseExecutionQueue(org.cerberus.crud.entity.TestCaseExecutionQueue) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) IApplicationService(org.cerberus.crud.service.IApplicationService) PrintWriter(java.io.PrintWriter) ITestCaseExecutionQueueService(org.cerberus.crud.service.ITestCaseExecutionQueueService) CerberusException(org.cerberus.exception.CerberusException) IInvariantService(org.cerberus.crud.service.IInvariantService) ICampaignParameterService(org.cerberus.crud.service.ICampaignParameterService) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) AnswerItem(org.cerberus.util.answer.AnswerItem) Date(java.util.Date) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) JSONObject(org.json.JSONObject) IExecutionThreadPoolService(org.cerberus.engine.threadpool.IExecutionThreadPoolService) TestCase(org.cerberus.crud.entity.TestCase) ITagService(org.cerberus.crud.service.ITagService) HashMap(java.util.HashMap) Map(java.util.Map) Application(org.cerberus.crud.entity.Application)

Example 2 with ITagService

use of org.cerberus.crud.service.ITagService in project cerberus-source by cerberustesting.

the class AddToExecutionQueueV002 method processRequest.

/**
 * Process request for both GET and POST method.
 *
 * <p>
 * Request processing is divided in two parts:
 * <ol>
 * <li>Getting all test cases which have been sent to this servlet;</li>
 * <li>Try to insert all these test cases to the execution queue.</li>
 * </ol>
 * </p>
 *
 * @param request
 * @param response
 * @throws ServletException
 * @throws IOException
 */
private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    final String charset = request.getCharacterEncoding();
    Date requestDate = new Date();
    // Loading Services.
    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    inQueueService = appContext.getBean(ITestCaseExecutionQueueService.class);
    inQueueFactoryService = appContext.getBean(IFactoryTestCaseExecutionQueue.class);
    executionThreadService = appContext.getBean(IExecutionThreadPoolService.class);
    testCaseService = appContext.getBean(ITestCaseService.class);
    invariantService = appContext.getBean(IInvariantService.class);
    applicationService = appContext.getBean(IApplicationService.class);
    testCaseCountryService = appContext.getBean(ITestCaseCountryService.class);
    campaignParameterService = appContext.getBean(ICampaignParameterService.class);
    countryEnvParamService = appContext.getBean(ICountryEnvParamService.class);
    // Calling Servlet Transversal Util.
    ServletUtil.servletStart(request);
    // Default message to unexpected error.
    MessageEvent msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED);
    msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", ""));
    AnswerItem<List<TestCase>> testcases = null;
    /**
     * Adding Log entry.
     */
    ILogEventService logEventService = appContext.getBean(ILogEventService.class);
    logEventService.createForPublicCalls("/AddToExecutionQueueV002", "CALL", "AddToExecutionQueueV002 called : " + request.getRequestURL(), request);
    // Parsing all parameters.
    // Execution scope parameters : Campaign, TestCases, Countries, Environment, Browser.
    String campaign = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_CAMPAIGN), null, charset);
    List<String> selectTest;
    selectTest = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_TEST), null, charset);
    List<String> selectTestCase;
    selectTestCase = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_TESTCASE), null, charset);
    List<String> countries;
    countries = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_COUNTRY), null, charset);
    List<String> environments;
    environments = ParameterParserUtil.parseListParamAndDecodeAndDeleteEmptyValue(request.getParameterValues(PARAMETER_ENVIRONMENT), null, charset);
    List<String> browsers = new ArrayList<>();
    ;
    browsers = ParameterParserUtil.parseListParamAndDecode(request.getParameterValues(PARAMETER_BROWSER), browsers, charset);
    // Execution parameters.
    String tag = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_TAG), "");
    String robot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT), null, charset);
    String robotIP = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT_IP), null, charset);
    String robotPort = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_ROBOT_PORT), null, charset);
    String browserVersion = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_BROWSER_VERSION), null, charset);
    String platform = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_PLATFORM), null, charset);
    String screenSize = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_SCREENSIZE), null, charset);
    int manualURL = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_MANUAL_URL), DEFAULT_VALUE_MANUAL_URL, charset);
    String manualHost = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_HOST), null, charset);
    String manualContextRoot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_CONTEXT_ROOT), null, charset);
    String manualLoginRelativeURL = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_LOGIN_RELATIVE_URL), null, charset);
    String manualEnvData = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter(PARAMETER_MANUAL_ENV_DATA), null, charset);
    int screenshot = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_SCREENSHOT), DEFAULT_VALUE_SCREENSHOT, charset);
    int verbose = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_VERBOSE), DEFAULT_VALUE_VERBOSE, charset);
    String timeout = request.getParameter(PARAMETER_TIMEOUT);
    int pageSource = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_PAGE_SOURCE), DEFAULT_VALUE_PAGE_SOURCE, charset);
    int seleniumLog = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_SELENIUM_LOG), DEFAULT_VALUE_SELENIUM_LOG, charset);
    int retries = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_RETRIES), DEFAULT_VALUE_RETRIES, charset);
    String manualExecution = ParameterParserUtil.parseStringParamAndDecode(request.getParameter(PARAMETER_MANUAL_EXECUTION), DEFAULT_VALUE_MANUAL_EXECUTION, charset);
    int priority = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter(PARAMETER_EXEPRIORITY), DEFAULT_VALUE_PRIORITY, charset);
    if (manualExecution.equals("")) {
        manualExecution = DEFAULT_VALUE_MANUAL_EXECUTION;
    }
    String outputFormat = ParameterParserUtil.parseStringParamAndDecode(request.getParameter(PARAMETER_OUTPUTFORMAT), DEFAULT_VALUE_OUTPUTFORMAT, charset);
    // Defining help message.
    String helpMessage = "This servlet is used to add to Cerberus execution queue a list of execution. Execution list will be calculated from cartesian product of " + "testcase, country, environment and browser list. Those list can be defined from the associated servlet parameter but can also be defined from campaign directy inside Cerberus.\n" + "List defined from servlet overwrite the list defined from the campaign. All other execution parameters will be taken to each execution.\n" + "Available parameters:\n" + "- " + PARAMETER_CAMPAIGN + " : Campaign name from which testcase, countries, environment and browser can be defined from Cerberus. [" + campaign + "]\n" + "- " + PARAMETER_TEST + " : List of test to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + selectTest + "]\n" + "- " + PARAMETER_TESTCASE + " : List of testCase to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + selectTestCase + "]\n" + "- " + PARAMETER_COUNTRY + " : List of countries to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + countries + "]\n" + "- " + PARAMETER_ENVIRONMENT + " : List of environment to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + environments + "]\n" + "- " + PARAMETER_BROWSER + " : List of browser to trigger. That list overwrite the list coming from the Campaign (if defined).. [" + browsers + "]\n" + "- " + PARAMETER_ROBOT + " : Robot Name that will be used for every execution triggered. [" + robot + "]\n" + "- " + PARAMETER_ROBOT_IP + " : Robot IP that will be used for every execution triggered. [" + robotIP + "]\n" + "- " + PARAMETER_ROBOT_PORT + " : Robot Port that will be used for every execution triggered. [" + robotPort + "]\n" + "- " + PARAMETER_BROWSER_VERSION + " : Browser Version that will be used for every execution triggered. [" + browserVersion + "]\n" + "- " + PARAMETER_PLATFORM + " : Platform that will be used for every execution triggered. [" + platform + "]\n" + "- " + PARAMETER_SCREENSIZE + " : Size of the screen that will be used for every execution triggered. [" + screenSize + "]\n" + "- " + PARAMETER_MANUAL_URL + " : Activate (1) or not (0) the Manual URL of the application to execute. If activated the 4 parameters after are necessary. [" + manualURL + "]\n" + "- " + PARAMETER_MANUAL_HOST + " : Host of the application to test (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualHost + "]\n" + "- " + PARAMETER_MANUAL_CONTEXT_ROOT + " : Context root of the application to test (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualContextRoot + "]\n" + "- " + PARAMETER_MANUAL_LOGIN_RELATIVE_URL + " : Relative login URL of the application (only used when " + PARAMETER_MANUAL_URL + " is activated). [" + manualLoginRelativeURL + "]\n" + "- " + PARAMETER_MANUAL_ENV_DATA + " : Environment where to get the test data when a " + PARAMETER_MANUAL_URL + " is defined. (only used when manualURL is active). [" + manualEnvData + "]\n" + "- " + PARAMETER_TAG + " : Tag that will be used for every execution triggered. [" + tag + "]\n" + "- " + PARAMETER_SCREENSHOT + " : Activate or not the screenshots for every execution triggered. [" + screenshot + "]\n" + "- " + PARAMETER_VERBOSE + " : Verbose level for every execution triggered. [" + verbose + "]\n" + "- " + PARAMETER_TIMEOUT + " : Timeout used for the action that will be used for every execution triggered. [" + timeout + "]\n" + "- " + PARAMETER_PAGE_SOURCE + " : Record Page Source during for every execution triggered. [" + pageSource + "]\n" + "- " + PARAMETER_SELENIUM_LOG + " : Get the SeleniumLog at the end of the execution for every execution triggered. [" + seleniumLog + "]\n" + "- " + PARAMETER_MANUAL_EXECUTION + " : Execute testcase in manual mode for every execution triggered. [" + manualExecution + "]\n" + "- " + PARAMETER_RETRIES + " : Number of tries if the result is not OK for every execution triggered. [" + retries + "]\n" + "- " + PARAMETER_EXEPRIORITY + " : Priority that will be used in the queue for every execution triggered. [" + priority + "]\n" + "- " + PARAMETER_OUTPUTFORMAT + " : Format of the servlet output. can be compact, json [" + outputFormat + "]\n";
    // try {
    // Checking the parameter validity.
    StringBuilder errorMessage = new StringBuilder();
    boolean error = false;
    if (tag == null || tag.isEmpty()) {
        if (request.getRemoteUser() != null) {
            tag = request.getRemoteUser();
        }
        if (tag.length() > 0) {
            tag += ".";
        }
        if (campaign != null) {
            tag += campaign;
        }
        if (tag.length() > 0) {
            tag += ".";
        }
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        String mytimestamp = sdf.format(timestamp);
        tag += mytimestamp;
    } else if (tag.length() > 255) {
        errorMessage.append("Error - Parameter ").append(PARAMETER_TAG).append(" is too big. Maximum size if 255. Current size is : ").append(tag.length()).append("\n");
        error = true;
    }
    if (campaign != null && !campaign.isEmpty()) {
        final AnswerItem<Map<String, List<String>>> parsedCampaignParameters = campaignParameterService.parseParametersByCampaign(campaign);
        if (parsedCampaignParameters.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode())) {
            // If parameters are already defined from request, we ignore the campaign values.
            if (countries == null || countries.isEmpty()) {
                countries = parsedCampaignParameters.getItem().get(CampaignParameter.COUNTRY_PARAMETER);
            }
            if (environments == null || environments.isEmpty()) {
                environments = parsedCampaignParameters.getItem().get(CampaignParameter.ENVIRONMENT_PARAMETER);
            }
            if (browsers == null || browsers.isEmpty()) {
                browsers = parsedCampaignParameters.getItem().get(CampaignParameter.BROWSER_PARAMETER);
            }
        }
        if ((countries != null) && (selectTest == null || selectTest.isEmpty())) {
            // If no countries are found, there is no need to get the testcase list. None will be returned.
            selectTest = new ArrayList<>();
            selectTestCase = new ArrayList<>();
            testcases = testCaseService.findTestCaseByCampaignNameAndCountries(campaign, countries.toArray(new String[countries.size()]));
            for (TestCase campaignTestCase : testcases.getItem()) {
                selectTest.add(campaignTestCase.getTest());
                selectTestCase.add(campaignTestCase.getTestCase());
            }
        }
    }
    if (countries == null || countries.isEmpty()) {
        errorMessage.append("Error - No Country defined. You can either feed it with parameter '" + PARAMETER_COUNTRY + "' or add it into the campaign definition.\n");
        error = true;
    }
    if ((StringUtil.isNullOrEmpty(robot)) && (browsers == null || browsers.isEmpty())) {
        errorMessage.append("Error - No Browser defined. You can either feed it with parameter '" + PARAMETER_BROWSER + "' or add it into the campaign definition.\n");
        error = true;
    }
    if (selectTest == null || selectTest.isEmpty() || selectTestCase == null || selectTestCase.isEmpty()) {
        errorMessage.append("Error - No TestCases defined. You can either feed it with parameters '" + PARAMETER_TEST + "' and '" + PARAMETER_TESTCASE + "' or add it into the campaign definition.\n");
        error = true;
    }
    if ((selectTest != null) && (selectTestCase != null) && (selectTest.size() != selectTestCase.size())) {
        errorMessage.append("Error - Test list size (").append(selectTest.size()).append(") is not the same as testcase list size (").append(selectTestCase.size()).append("). Please check that both list are consistent.\n");
        error = true;
    }
    if (manualURL >= 1) {
        if (manualHost == null || manualEnvData == null) {
            errorMessage.append("Error - ManualURL has been activated but no ManualHost or Manual Environment defined.\n");
            error = true;
        }
    } else if (environments == null || environments.isEmpty()) {
        errorMessage.append("Error - No Environment defined (and " + PARAMETER_MANUAL_URL + " not activated). You can either feed it with parameter '" + PARAMETER_ENVIRONMENT + "' or add it into the campaign definition.\n");
        error = true;
    }
    int nbExe = 0;
    JSONArray jsonArray = new JSONArray();
    String user = request.getRemoteUser() == null ? "" : request.getRemoteUser();
    int nbtestcasenotactive = 0;
    int nbtestcaseenvgroupnotallowed = 0;
    int nbenvnotexist = 0;
    boolean tagAlreadyAdded = false;
    int nbbrowser = 0;
    if (browsers.isEmpty()) {
        nbbrowser = 1;
    } else {
        nbbrowser = browsers.size();
    }
    int nbtescase = selectTest.size();
    int nbenv = environments.size();
    int nbcountries = countries.size();
    // Starting the request only if previous parameters exist.
    if (!error) {
        // Part 1: Getting all possible Execution from test cases + countries + environments + browsers which have been sent to this servlet.
        Map<String, String> invariantEnv = invariantService.readToHashMapGp1StringByIdname("ENVIRONMENT", "");
        List<TestCaseExecutionQueue> toInserts = new ArrayList<TestCaseExecutionQueue>();
        try {
            HashMap<String, CountryEnvParam> envMap = new HashMap<>();
            LOG.debug("Loading all environments.");
            for (CountryEnvParam envParam : countryEnvParamService.convert(countryEnvParamService.readActiveBySystem(null))) {
                envMap.put(envParam.getSystem() + LOCAL_SEPARATOR + envParam.getCountry() + LOCAL_SEPARATOR + envParam.getEnvironment(), envParam);
            }
            LOG.debug("Nb of TestCase : " + selectTest.size());
            for (int i = 0; i < selectTest.size(); i++) {
                // for (String localTest : selectTest) {
                String test = selectTest.get(i);
                String testCase = selectTestCase.get(i);
                TestCase tc = testCaseService.convert(testCaseService.readByKey(test, testCase));
                // TestCases that are not active are not inserted into queue.
                if (tc.getTcActive().equals("Y")) {
                    // We only insert testcase that exist for the given country.
                    for (TestCaseCountry country : testCaseCountryService.convert(testCaseCountryService.readByTestTestCase(null, test, testCase))) {
                        if (countries.contains(country.getCountry())) {
                            // for each environment we test that correspondng gp1 is compatible with testcase environment flag activation.
                            for (String environment : environments) {
                                String envGp1 = invariantEnv.get(environment);
                                if (((envGp1.equals("PROD")) && (tc.getActivePROD().equalsIgnoreCase("Y"))) || ((envGp1.equals("UAT")) && (tc.getActiveUAT().equalsIgnoreCase("Y"))) || ((envGp1.equals("QA")) && (tc.getActiveQA().equalsIgnoreCase("Y"))) || (envGp1.equals("DEV"))) {
                                    // Getting Application in order to check application type against browser.
                                    Application app = applicationService.convert(applicationService.readByKey(tc.getApplication()));
                                    if (envMap.containsKey(app.getSystem() + LOCAL_SEPARATOR + country.getCountry() + LOCAL_SEPARATOR + environment)) {
                                        // Create Tag only if not already done and defined.
                                        if (!StringUtil.isNullOrEmpty(tag) && !tagAlreadyAdded) {
                                            // We create or update it.
                                            ITagService tagService = appContext.getBean(ITagService.class);
                                            tagService.createAuto(tag, campaign, user);
                                            tagAlreadyAdded = true;
                                        }
                                        if ((app != null) && (app.getType() != null) && app.getType().equalsIgnoreCase(Application.TYPE_GUI)) {
                                            if (browsers == null || browsers.isEmpty()) {
                                                browsers.add("");
                                            }
                                            for (String browser : browsers) {
                                                try {
                                                    LOG.debug("Insert Queue Entry.");
                                                    toInserts.add(inQueueFactoryService.create(test, testCase, country.getCountry(), environment, robot, robotIP, robotPort, browser, browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, priority, user, null, null, null));
                                                } catch (FactoryCreationException e) {
                                                    LOG.error("Unable to insert record due to: " + e, e);
                                                    LOG.error("test: " + test + "-" + testCase + "-" + country.getCountry() + "-" + environment + "-" + robot);
                                                }
                                            }
                                        } else {
                                            // Application does not support browser so we force an empty value.
                                            LOG.debug("Forcing Browser to empty value. Application type=" + app.getType());
                                            try {
                                                LOG.debug("Insert Queue Entry.");
                                                toInserts.add(inQueueFactoryService.create(test, testCase, country.getCountry(), environment, robot, robotIP, robotPort, "", browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, priority, user, null, null, null));
                                            } catch (FactoryCreationException e) {
                                                LOG.error("Unable to insert record due to: " + e, e);
                                                LOG.error("test: " + test + "-" + testCase + "-" + country.getCountry() + "-" + environment + "-" + robot);
                                            }
                                        }
                                    } else {
                                        LOG.debug("Env does not exist or is not active.");
                                        nbenvnotexist = nbenvnotexist + nbbrowser;
                                    }
                                } else {
                                    LOG.debug("Env group not active for testcase : " + environment);
                                    nbtestcaseenvgroupnotallowed = nbtestcaseenvgroupnotallowed + nbbrowser;
                                }
                            }
                        } else {
                            LOG.debug("Country does not match. " + countries + " " + country.getCountry());
                        }
                    }
                } else {
                    LOG.debug("TestCase not Active.");
                    nbtestcasenotactive = nbtestcasenotactive + (nbcountries * nbenv * nbbrowser);
                }
            }
        } catch (CerberusException ex) {
            LOG.warn(ex);
        }
        // Part 2: Try to insert all these test cases to the execution queue.
        List<String> errorMessages = new ArrayList<String>();
        for (TestCaseExecutionQueue toInsert : toInserts) {
            try {
                inQueueService.convert(inQueueService.create(toInsert));
                nbExe++;
                JSONObject value = new JSONObject();
                value.put("queueId", toInsert.getId());
                value.put("test", toInsert.getTest());
                value.put("testcase", toInsert.getTestCase());
                value.put("country", toInsert.getCountry());
                value.put("environment", toInsert.getEnvironment());
                jsonArray.put(value);
            } catch (CerberusException e) {
                String errorMessageTmp = "Unable to insert " + toInsert.toString() + " due to " + e.getMessage();
                LOG.warn(errorMessageTmp);
                errorMessages.add(errorMessageTmp);
                continue;
            } catch (JSONException ex) {
                LOG.error(ex);
            }
        }
        // Part 3 : Trigger JobQueue
        try {
            executionThreadService.executeNextInQueueAsynchroneously(false);
        } catch (CerberusException ex) {
            String errorMessageTmp = "Unable to feed the execution queue due to " + ex.getMessage();
            LOG.warn(errorMessageTmp);
            errorMessages.add(errorMessageTmp);
        }
        if (!errorMessages.isEmpty()) {
            StringBuilder errorMessageTmp = new StringBuilder();
            for (String item : errorMessages) {
                errorMessageTmp.append(item);
                errorMessageTmp.append(LINE_SEPARATOR);
            }
            errorMessage.append(errorMessageTmp.toString());
        }
        errorMessage.append(nbExe);
        errorMessage.append(" execution(s) succesfully inserted to queue. ");
        if (testcases != null && testcases.getResultMessage().getSource() == MessageEventEnum.DATA_OPERATION_WARNING_PARTIAL_RESULT) {
            errorMessage.append(testcases.getResultMessage().getDescription());
        }
        // Message that everything went fine.
        msg = new MessageEvent(MessageEventEnum.GENERIC_OK);
    } else {
    // In case of errors, we display the help message.
    // errorMessage.append(helpMessage);
    }
    // Init Answer with potencial error from Parsing parameter.
    AnswerItem answer = new AnswerItem(msg);
    switch(outputFormat) {
        case "json":
            try {
                JSONObject jsonResponse = new JSONObject();
                jsonResponse.put("messageType", answer.getResultMessage().getMessage().getCodeString());
                jsonResponse.put("message", errorMessage.toString());
                jsonResponse.put("helpMessage", helpMessage);
                jsonResponse.put("tag", tag);
                jsonResponse.put("nbExe", nbExe);
                jsonResponse.put("nbErrorTCNotActive", nbtestcasenotactive);
                jsonResponse.put("nbErrorTCNotAllowedOnEnv", nbtestcaseenvgroupnotallowed);
                jsonResponse.put("nbErrorEnvNotExistOrNotActive", nbenvnotexist);
                jsonResponse.put("queueList", jsonArray);
                response.setContentType("application/json");
                response.setCharacterEncoding("utf8");
                response.getWriter().print(jsonResponse.toString());
            } catch (JSONException e) {
                LOG.warn(e);
                // returns a default error message with the json format that is able to be parsed by the client-side
                response.setContentType("application/json");
                response.setCharacterEncoding("utf8");
                response.getWriter().print(AnswerUtil.createGenericErrorAnswer());
            }
            break;
        default:
            response.setContentType("text");
            response.setCharacterEncoding("utf8");
            if (error) {
                errorMessage.append("\n");
                errorMessage.append(helpMessage);
            }
            response.getWriter().print(errorMessage.toString());
    }
// } catch (Exception e) {
// LOG.error(e);
// out.println(helpMessage);
// out.println(e.toString());
// }
}
Also used : HashMap(java.util.HashMap) MessageEvent(org.cerberus.engine.entity.MessageEvent) ArrayList(java.util.ArrayList) Timestamp(java.sql.Timestamp) ITestCaseCountryService(org.cerberus.crud.service.ITestCaseCountryService) FactoryCreationException(org.cerberus.exception.FactoryCreationException) ApplicationContext(org.springframework.context.ApplicationContext) ITestCaseService(org.cerberus.crud.service.ITestCaseService) ILogEventService(org.cerberus.crud.service.ILogEventService) TestCaseCountry(org.cerberus.crud.entity.TestCaseCountry) ArrayList(java.util.ArrayList) List(java.util.List) TestCaseExecutionQueue(org.cerberus.crud.entity.TestCaseExecutionQueue) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) IApplicationService(org.cerberus.crud.service.IApplicationService) PrintWriter(java.io.PrintWriter) ITestCaseExecutionQueueService(org.cerberus.crud.service.ITestCaseExecutionQueueService) CerberusException(org.cerberus.exception.CerberusException) IInvariantService(org.cerberus.crud.service.IInvariantService) ICampaignParameterService(org.cerberus.crud.service.ICampaignParameterService) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) AnswerItem(org.cerberus.util.answer.AnswerItem) Date(java.util.Date) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) JSONObject(org.json.JSONObject) IExecutionThreadPoolService(org.cerberus.engine.threadpool.IExecutionThreadPoolService) TestCase(org.cerberus.crud.entity.TestCase) ITagService(org.cerberus.crud.service.ITagService) ICountryEnvParamService(org.cerberus.crud.service.ICountryEnvParamService) HashMap(java.util.HashMap) Map(java.util.Map) CountryEnvParam(org.cerberus.crud.entity.CountryEnvParam) Application(org.cerberus.crud.entity.Application)

Example 3 with ITagService

use of org.cerberus.crud.service.ITagService in project cerberus-source by cerberustesting.

the class SetTagToExecution method processRequest.

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
 * methods.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    ITestCaseExecutionService executionService = appContext.getBean(ITestCaseExecutionService.class);
    try {
        String id = policy.sanitize(request.getParameter("executionId"));
        String tag = policy.sanitize(request.getParameter("newTag"));
        executionService.setTagToExecution(Long.valueOf(id), tag);
        // Create Tag when exist.
        if (!StringUtil.isNullOrEmpty(tag)) {
            // We create or update it.
            ITagService tagService = appContext.getBean(ITagService.class);
            tagService.createAuto(tag, "", request.getRemoteUser());
        }
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet SetTagToExecution</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet SetTagToExecution at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    } catch (CerberusException ex) {
        LOG.warn(ex);
    } finally {
        out.close();
    }
}
Also used : ApplicationContext(org.springframework.context.ApplicationContext) CerberusException(org.cerberus.exception.CerberusException) PolicyFactory(org.owasp.html.PolicyFactory) ITagService(org.cerberus.crud.service.ITagService) ITestCaseExecutionService(org.cerberus.crud.service.ITestCaseExecutionService) PrintWriter(java.io.PrintWriter)

Example 4 with ITagService

use of org.cerberus.crud.service.ITagService in project cerberus-source by cerberustesting.

the class CreateTestCaseExecutionQueue method processRequest.

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
 * methods.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, CerberusException, JSONException {
    JSONObject jsonResponse = new JSONObject();
    JSONObject executionQueue = new JSONObject();
    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    Answer ans = new Answer();
    AnswerItem ansItem = new AnswerItem();
    MessageEvent msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED);
    msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", ""));
    ans.setResultMessage(msg);
    PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
    String charset = request.getCharacterEncoding();
    response.setContentType("application/json");
    // Calling Servlet Transversal Util.
    ServletUtil.servletStart(request);
    /**
     * Parsing and securing all required parameters.
     */
    // Parameter that are already controled by GUI (no need to decode) --> We SECURE them
    String actionState = policy.sanitize(request.getParameter("actionState"));
    String actionSave = policy.sanitize(request.getParameter("actionSave"));
    String environment = policy.sanitize(request.getParameter("environment"));
    String country = policy.sanitize(request.getParameter("country"));
    String manualEnvData = policy.sanitize(request.getParameter("manualEnvData"));
    // Parameter that needs to be secured --> We SECURE+DECODE them
    String test = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("test"), "", charset);
    String testcase = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("testCase"), "", charset);
    int manualURL = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("manualURL"), 0, charset);
    String manualHost = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("manualHost"), "", charset);
    String manualContextRoot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("manualContextRoot"), "", charset);
    String manualLoginRelativeURL = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("manualLoginRelativeURL"), "", charset);
    String tag = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("tag"), "", charset);
    String robot = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("robot"), "", charset);
    String robotIP = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("robotIP"), "", charset);
    String robotPort = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("robotPort"), "", charset);
    String browser = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("browser"), "", charset);
    String browserVersion = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("browserVersion"), "", charset);
    String platform = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("platform"), "", charset);
    String screenSize = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("screenSize"), "", charset);
    int verbose = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("verbose"), 1, charset);
    int screenshot = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("screenshot"), 0, charset);
    int pageSource = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("pageSource"), 0, charset);
    int seleniumLog = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("seleniumLog"), 0, charset);
    String timeout = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("timeout"), "", charset);
    int retries = ParameterParserUtil.parseIntegerParamAndDecode(request.getParameter("retries"), 0, charset);
    String manualExecution = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("manualExecution"), "", charset);
    String debugFlag = ParameterParserUtil.parseStringParamAndDecodeAndSanitize(request.getParameter("debugFlag"), "N", charset);
    // Parameter that we cannot secure as we need the html --> We DECODE them
    String[] myIds = request.getParameterValues("id");
    if (myIds == null) {
        myIds = new String[1];
        myIds[0] = "0";
    }
    long id = 0;
    Integer priority = TestCaseExecutionQueue.PRIORITY_DEFAULT;
    boolean prio_error = false;
    try {
        if (request.getParameter("priority") != null && !request.getParameter("priority").equals("")) {
            priority = Integer.valueOf(policy.sanitize(request.getParameter("priority")));
        }
    } catch (Exception ex) {
        prio_error = true;
    }
    boolean id_error = false;
    IExecutionThreadPoolService executionThreadPoolService = appContext.getBean(IExecutionThreadPoolService.class);
    // Create Tag when exist.
    if (!StringUtil.isNullOrEmpty(tag)) {
        // We create or update it.
        ITagService tagService = appContext.getBean(ITagService.class);
        tagService.createAuto(tag, "", request.getRemoteUser());
    }
    // Prepare the final answer.
    MessageEvent msg1 = new MessageEvent(MessageEventEnum.GENERIC_OK);
    Answer finalAnswer = new Answer(msg1);
    List<TestCaseExecutionQueue> insertedList = new ArrayList();
    for (String myId : myIds) {
        id_error = false;
        id = 0;
        try {
            id = Long.valueOf(myId);
        } catch (NumberFormatException ex) {
            id_error = true;
        }
        /**
         * Checking all constrains before calling the services.
         */
        if (id_error) {
            msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_EXPECTED);
            msg.setDescription(msg.getDescription().replace("%ITEM%", "Execution Queue").replace("%OPERATION%", "Update").replace("%REASON%", "Could not manage to convert id to an integer value."));
            ans.setResultMessage(msg);
            finalAnswer = AnswerUtil.agregateAnswer(finalAnswer, (Answer) ans);
        } else if (prio_error || priority > 2147483647 || priority < -2147483648) {
            msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_EXPECTED);
            msg.setDescription(msg.getDescription().replace("%ITEM%", "Execution Queue").replace("%OPERATION%", "Update").replace("%REASON%", "Could not manage to convert priority to an integer value."));
            ans.setResultMessage(msg);
            finalAnswer = AnswerUtil.agregateAnswer(finalAnswer, (Answer) ans);
        } else {
            try {
                /**
                 * All data seems cleans so we can call the services.
                 */
                ITestCaseExecutionQueueService executionQueueService = appContext.getBean(ITestCaseExecutionQueueService.class);
                IFactoryTestCaseExecutionQueue executionQueueFactory = appContext.getBean(IFactoryTestCaseExecutionQueue.class);
                if (actionSave.equals("save")) {
                    /**
                     * The service was able to perform the query and confirm
                     * the object exist, then we can update it.
                     */
                    TestCaseExecutionQueue executionQueueData;
                    if (id == 0) {
                        // If id is not defined, we build the execution queue from all request datas.
                        executionQueueData = executionQueueFactory.create(test, testcase, country, environment, robot, robotIP, robotPort, browser, browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, priority, request.getRemoteUser(), null, null, null);
                        executionQueueData.setDebugFlag(debugFlag);
                    } else {
                        // If id is defined, we get the execution queue from database.
                        executionQueueData = executionQueueService.convert(executionQueueService.readByKey(id));
                        executionQueueData.setState(TestCaseExecutionQueue.State.QUEUED);
                        executionQueueData.setComment("");
                        executionQueueData.setDebugFlag("N");
                        executionQueueData.setPriority(TestCaseExecutionQueue.PRIORITY_DEFAULT);
                        executionQueueData.setUsrCreated(request.getRemoteUser());
                    }
                    ansItem = executionQueueService.create(executionQueueData);
                    finalAnswer = AnswerUtil.agregateAnswer(finalAnswer, (Answer) ansItem);
                    if (ansItem.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode())) {
                        TestCaseExecutionQueue addedExecution = (TestCaseExecutionQueue) ansItem.getItem();
                        insertedList.add(addedExecution);
                    }
                    if (myIds.length <= 1) {
                        if (ansItem.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode())) {
                            /**
                             * Update was successful. Adding Log entry.
                             */
                            ILogEventService logEventService = appContext.getBean(LogEventService.class);
                            logEventService.createForPrivateCalls("/CreateTestCaseExecutionQueue", "CREATE", "Created ExecutionQueue : ['" + id + "']", request);
                        }
                    }
                }
            } catch (FactoryCreationException ex) {
                LOG.warn(ex);
            }
        }
    }
    // Update is done, we now check what action needs to be performed.
    if (actionState.equals("toQUEUED")) {
        executionThreadPoolService.executeNextInQueueAsynchroneously(false);
    }
    /**
     * Formating and returning the json result.
     */
    jsonResponse.put("messageType", finalAnswer.getResultMessage().getMessage().getCodeString());
    jsonResponse.put("message", finalAnswer.getResultMessage().getDescription());
    if (insertedList.isEmpty()) {
        jsonResponse.put("addedEntries", 0);
    } else {
        JSONArray executionList = new JSONArray();
        for (TestCaseExecutionQueue testCaseExecutionQueue : insertedList) {
            JSONObject myExecution = new JSONObject();
            myExecution.append("id", testCaseExecutionQueue.getId());
            executionList.put(myExecution);
        }
        jsonResponse.put("testCaseExecutionQueueList", executionList);
        jsonResponse.put("addedEntries", insertedList.size());
    }
    response.getWriter().print(jsonResponse);
    response.getWriter().flush();
}
Also used : PolicyFactory(org.owasp.html.PolicyFactory) MessageEvent(org.cerberus.engine.entity.MessageEvent) ArrayList(java.util.ArrayList) ILogEventService(org.cerberus.crud.service.ILogEventService) LogEventService(org.cerberus.crud.service.impl.LogEventService) FactoryCreationException(org.cerberus.exception.FactoryCreationException) ApplicationContext(org.springframework.context.ApplicationContext) ILogEventService(org.cerberus.crud.service.ILogEventService) TestCaseExecutionQueue(org.cerberus.crud.entity.TestCaseExecutionQueue) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) ITestCaseExecutionQueueService(org.cerberus.crud.service.ITestCaseExecutionQueueService) JSONArray(org.json.JSONArray) AnswerItem(org.cerberus.util.answer.AnswerItem) ServletException(javax.servlet.ServletException) JSONException(org.json.JSONException) FactoryCreationException(org.cerberus.exception.FactoryCreationException) IOException(java.io.IOException) CerberusException(org.cerberus.exception.CerberusException) IFactoryTestCaseExecutionQueue(org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue) Answer(org.cerberus.util.answer.Answer) JSONObject(org.json.JSONObject) IExecutionThreadPoolService(org.cerberus.engine.threadpool.IExecutionThreadPoolService) ITagService(org.cerberus.crud.service.ITagService)

Example 5 with ITagService

use of org.cerberus.crud.service.ITagService in project cerberus-source by cerberustesting.

the class ReadTag method findTagByKey.

private AnswerItem findTagByKey(String tag, ApplicationContext appContext, HttpServletRequest request) throws JSONException, CerberusException {
    AnswerItem item = new AnswerItem();
    JSONObject object = new JSONObject();
    ITagService libService = appContext.getBean(ITagService.class);
    // finds the project
    AnswerItem answer = libService.readByKey(tag);
    if (answer.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode())) {
        // if the service returns an OK message then we can get the item and convert it to JSONformat
        Tag tagObj = (Tag) answer.getItem();
        JSONObject response = convertTagToJSONObject(tagObj);
        // response.put("hasPermissionsUpdate", libService.hasPermissionsUpdate(tagObj, request));
        // response.put("hasPermissionsDelete", libService.hasPermissionsDelete(tagObj, request));
        object.put("contentTable", response);
    }
    // object.put("hasPermissionsCreate", libService.hasPermissionsCreate(null, request));
    item.setItem(object);
    item.setResultMessage(answer.getResultMessage());
    return item;
}
Also used : JSONObject(org.json.JSONObject) ITagService(org.cerberus.crud.service.ITagService) Tag(org.cerberus.crud.entity.Tag) AnswerItem(org.cerberus.util.answer.AnswerItem)

Aggregations

ITagService (org.cerberus.crud.service.ITagService)12 ApplicationContext (org.springframework.context.ApplicationContext)10 CerberusException (org.cerberus.exception.CerberusException)9 JSONObject (org.json.JSONObject)9 TestCaseExecutionQueue (org.cerberus.crud.entity.TestCaseExecutionQueue)8 ILogEventService (org.cerberus.crud.service.ILogEventService)8 AnswerItem (org.cerberus.util.answer.AnswerItem)8 IFactoryTestCaseExecutionQueue (org.cerberus.crud.factory.IFactoryTestCaseExecutionQueue)7 PrintWriter (java.io.PrintWriter)6 ArrayList (java.util.ArrayList)6 ITestCaseExecutionQueueService (org.cerberus.crud.service.ITestCaseExecutionQueueService)6 MessageEvent (org.cerberus.engine.entity.MessageEvent)6 IExecutionThreadPoolService (org.cerberus.engine.threadpool.IExecutionThreadPoolService)6 FactoryCreationException (org.cerberus.exception.FactoryCreationException)6 JSONException (org.json.JSONException)6 Date (java.util.Date)5 TestCase (org.cerberus.crud.entity.TestCase)5 ITestCaseService (org.cerberus.crud.service.ITestCaseService)5 JSONArray (org.json.JSONArray)5 Timestamp (java.sql.Timestamp)4