public ExperimentDTO createExperiment()

in server/src/main/java/com/epam/indigoeln/core/service/experiment/ExperimentService.java [459:540]


    public ExperimentDTO createExperiment(ExperimentDTO experimentDTO, String projectId,
                                          String notebookId, User user) {
        Project project = projectRepository.findById(projectId)
                .orElseThrow(() -> EntityNotFoundException.createWithProjectId(projectId));
        Notebook notebook = notebookRepository
                .findById(SequenceIdUtil.buildFullId(projectId, notebookId)).
                orElseThrow(() -> EntityNotFoundException.createWithNotebookId(notebookId));

        // check of EntityAccess (User must have "Create Sub-Entity" permission in notebook's access list,
        // or must have CONTENT_EDITOR authority)
        if (!PermissionUtil.hasEditorAuthorityOrPermissions(user, notebook.getAccessList(),
                UserPermission.CREATE_SUB_ENTITY)) {
            throw OperationDeniedException.createNotebookSubEntityCreateOperation(notebook.getId());
        }

        Experiment experiment = dtoMapper.convertFromDTO(experimentDTO);
        experiment.setStatus(ExperimentStatus.OPEN);

        if (experimentDTO.getTemplate() != null) {
            Template tmpl = new Template();
            tmpl.setTemplateContent(experimentDTO.getTemplate().getTemplateContent());
            experiment.setTemplate(tmpl);
        }
        // check of user permissions's correctness in access control list
        PermissionUtil.checkCorrectnessOfAccessList(userService, experiment.getAccessList());

        //increment sequence Id
        experiment.setId(sequenceIdService.getNextExperimentId(projectId, notebookId));

        experiment.setComponents(updateComponents(null, experiment.getComponents(), experiment.getId()));

        //generate name
        experiment.setName(SequenceIdUtil.generateExperimentName(experiment));

        //set latest version
        experiment.setExperimentVersion(1);
        experiment.setLastVersion(true);
        experiment.compileExperimentFullName(notebook.getName());

        // add OWNER's permissions for specified User to experiment
        Triple<PermissionChanges<Project>, PermissionChanges<Notebook>, PermissionChanges<Experiment>> changes =
                ExperimentPermissionHelper.fillNewExperimentsPermissions(project, notebook, experiment, user);

        Experiment savedExperiment = experimentRepository.save(experiment);

        notebook.getExperiments().add(savedExperiment);
        Notebook savedNotebook = notebookRepository.save(notebook);

        Set<User> contentEditors = userService.getContentEditors();

        PermissionChanges<Project> projectPermissions = changes.getLeft();

        List<WebSocketUtil.DelayedNotificationRunnable> notifications = new ArrayList<>();

        if (projectPermissions.hadChanged()) {
            Project savedProject = projectRepository.save(projectPermissions.getEntity());
            notifications.add(
                    webSocketUtil.getUpdateProjectNotification(user, savedProject,
                            getEntityUpdateRecipients(contentEditors, savedProject, null)));
        }

        notifications.add(
                webSocketUtil.getNewProjectNotification(user,
                        getSubEntityChangesRecipients(projectPermissions)));

        notifications.add(
                webSocketUtil.getProjectSubEntityNotification(user, project,
                        getSubEntityChangesRecipients(changes.getMiddle())));

        notifications.add(
                webSocketUtil.getUpdateNotebookNotification(user, projectId, savedNotebook,
                        getEntityUpdateRecipients(
                                contentEditors, savedNotebook, null)));

        notifications.add(
                webSocketUtil.getNotebookSubEntityNotification(user, projectId, savedNotebook,
                        getSubEntityChangesRecipients(changes.getRight(), contentEditors)));

        webSocketUtil.sendAll(notifications);

        return new ExperimentDTO(savedExperiment);
    }