EDU-697 Placeholders disappear after "Run Study Tests" configuration execution
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / CCVirtualFileListener.java
1 package com.jetbrains.edu.coursecreator;
2
3 import com.intellij.openapi.project.Project;
4 import com.intellij.openapi.project.ProjectUtil;
5 import com.intellij.openapi.util.io.FileUtil;
6 import com.intellij.openapi.vfs.VirtualFile;
7 import com.intellij.openapi.vfs.VirtualFileAdapter;
8 import com.intellij.openapi.vfs.VirtualFileEvent;
9 import com.jetbrains.edu.learning.StudyTaskManager;
10 import com.jetbrains.edu.learning.StudyUtils;
11 import com.jetbrains.edu.learning.core.EduNames;
12 import com.jetbrains.edu.learning.courseFormat.Course;
13 import com.jetbrains.edu.learning.courseFormat.Lesson;
14 import com.jetbrains.edu.learning.courseFormat.Task;
15 import com.jetbrains.edu.learning.courseFormat.TaskFile;
16 import org.jetbrains.annotations.NotNull;
17
18 import java.io.File;
19
20 public class CCVirtualFileListener extends VirtualFileAdapter {
21
22   @Override
23   public void fileCreated(@NotNull VirtualFileEvent event) {
24     VirtualFile createdFile = event.getFile();
25     Project project = ProjectUtil.guessProjectForFile(createdFile);
26     if (project == null) {
27       return;
28     }
29     Course course = StudyTaskManager.getInstance(project).getCourse();
30     if (course == null || !CCUtils.isCourseCreator(project)) {
31       return;
32     }
33     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
34     if (taskFile != null) {
35       return;
36     }
37
38     String name = createdFile.getName();
39
40     CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
41     if (manager != null && manager.doNotPackFile(new File(createdFile.getPath()))) {
42       return;
43     }
44
45     if (CCUtils.isTestsFile(project, createdFile)
46         || StudyUtils.isTaskDescriptionFile(name)
47         || name.contains(EduNames.WINDOW_POSTFIX)
48         || name.contains(EduNames.WINDOWS_POSTFIX)
49         || name.contains(EduNames.ANSWERS_POSTFIX)) {
50       return;
51     }
52
53     VirtualFile taskVF = createdFile.getParent();
54     if (taskVF == null) {
55       return;
56     }
57     Task task = StudyUtils.getTask(project, taskVF);
58     if (task == null) {
59       return;
60     }
61
62     CCUtils.createResourceFile(createdFile, course, taskVF);
63
64     task.addTaskFile(name, 1);
65   }
66
67   @Override
68   public void fileDeleted(@NotNull VirtualFileEvent event) {
69     VirtualFile removedFile = event.getFile();
70     String path = removedFile.getPath();
71     if (path.contains(CCUtils.GENERATED_FILES_FOLDER)) {
72       return;
73     }
74
75     Project project = ProjectUtil.guessProjectForFile(removedFile);
76     if (project == null) {
77       return;
78     }
79     Course course = StudyTaskManager.getInstance(project).getCourse();
80     if (course == null || path.contains(FileUtil.toSystemIndependentName(course.getCourseDirectory()))) {
81       return;
82     }
83     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
84     if (taskFile != null) {
85       deleteTaskFile(removedFile, taskFile);
86       return;
87     }
88     if (removedFile.getName().contains(EduNames.TASK)) {
89       deleteTask(course, removedFile);
90     }
91     if (removedFile.getName().contains(EduNames.LESSON)) {
92       deleteLesson(course, removedFile, project);
93     }
94   }
95
96   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
97     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
98     if (removedLesson == null) {
99       return;
100     }
101     VirtualFile courseDir = project.getBaseDir();
102     CCUtils.updateHigherElements(courseDir.getChildren(), file -> course.getLesson(file.getName()), removedLesson.getIndex(), EduNames.LESSON, -1);
103     course.getLessons().remove(removedLesson);
104   }
105
106   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
107     VirtualFile lessonDir = removedTask.getParent();
108     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
109       return;
110     }
111     final Lesson lesson = course.getLesson(lessonDir.getName());
112     if (lesson == null) {
113       return;
114     }
115     Task task = lesson.getTask(removedTask.getName());
116     if (task == null) {
117       return;
118     }
119     CCUtils.updateHigherElements(lessonDir.getChildren(), file -> lesson.getTask(file.getName()), task.getIndex(), EduNames.TASK, -1);
120     lesson.getTaskList().remove(task);
121   }
122
123   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
124     Task task = taskFile.getTask();
125     if (task == null) {
126       return;
127     }
128     //TODO: remove from steps as well
129     task.getTaskFiles().remove(removedTaskFile.getName());
130   }
131 }