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);
}