@VisibleForTesting Result<ActionPlan> createActionPlanResult( Map<String, String> parameters, @Nullable DefaultActionPlan existingActionPlan) { Result<ActionPlan> result = Result.of(); String name = parameters.get(NAME_PARAM); String description = parameters.get(DESCRIPTION_PARAM); String deadLineParam = parameters.get("deadLine"); String projectParam = parameters.get(PROJECT_PARAM); checkMandatorySizeParameter(name, NAME_PARAM, 200, result); checkOptionalSizeParameter(description, DESCRIPTION_PARAM, 1000, result); // Can only set project on creation if (existingActionPlan == null) { checkProject(projectParam, result); } Date deadLine = checkAndReturnDeadline(deadLineParam, result); // TODO move this check in the service, on creation and update if (!Strings.isNullOrEmpty(projectParam) && !Strings.isNullOrEmpty(name) && isActionPlanNameAvailable(existingActionPlan, name, projectParam)) { result.addError(Result.Message.ofL10n("action_plans.same_name_in_same_project")); } if (result.ok()) { DefaultActionPlan actionPlan = DefaultActionPlan.create(name) .setDescription(description) .setUserLogin(UserSession.get().login()) .setDeadLine(deadLine); // Can only set project on creation if (existingActionPlan == null) { actionPlan.setProjectKey(projectParam); } else { actionPlan.setProjectKey(existingActionPlan.projectKey()); } result.set(actionPlan); } return result; }