use correct util method
[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     if (createdFile.isDirectory()) {
26       return;
27     }
28     if (createdFile.getPath().contains(CCUtils.GENERATED_FILES_FOLDER)) {
29       return;
30     }
31     Project project = ProjectUtil.guessProjectForFile(createdFile);
32     if (project == null) {
33       return;
34     }
35     if (project.getBasePath() !=null && !FileUtil.isAncestor(project.getBasePath(), createdFile.getPath(), true)) {
36       return;
37     }
38     Course course = StudyTaskManager.getInstance(project).getCourse();
39     if (course == null || !CCUtils.isCourseCreator(project)) {
40       return;
41     }
42     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
43     if (taskFile != null) {
44       return;
45     }
46
47     String name = createdFile.getName();
48
49     CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
50     if (manager != null && manager.doNotPackFile(new File(createdFile.getPath()))) {
51       return;
52     }
53
54     if (CCUtils.isTestsFile(project, createdFile)
55         || StudyUtils.isTaskDescriptionFile(name)
56         || name.contains(EduNames.WINDOW_POSTFIX)
57         || name.contains(EduNames.WINDOWS_POSTFIX)
58         || name.contains(EduNames.ANSWERS_POSTFIX)) {
59       return;
60     }
61     VirtualFile taskVF = StudyUtils.getTaskDir(createdFile);
62     if (taskVF == null) {
63       return;
64     }
65     Task task = StudyUtils.getTask(project, taskVF);
66     if (task == null) {
67       return;
68     }
69
70     CCUtils.createResourceFile(createdFile, course, taskVF);
71
72     task.addTaskFile(name, 1);
73   }
74
75   @Override
76   public void fileDeleted(@NotNull VirtualFileEvent event) {
77     VirtualFile removedFile = event.getFile();
78     String path = removedFile.getPath();
79     if (path.contains(CCUtils.GENERATED_FILES_FOLDER)) {
80       return;
81     }
82
83     Project project = ProjectUtil.guessProjectForFile(removedFile);
84     if (project == null) {
85       return;
86     }
87     if (project.getBasePath() !=null && !FileUtil.isAncestor(project.getBasePath(), removedFile.getPath(), true)) {
88       return;
89     }
90     Course course = StudyTaskManager.getInstance(project).getCourse();
91     if (course == null || path.contains(FileUtil.toSystemIndependentName(course.getCourseDirectory()))) {
92       return;
93     }
94     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
95     if (taskFile != null) {
96       deleteTaskFile(removedFile, taskFile);
97       return;
98     }
99     if (removedFile.getName().contains(EduNames.TASK)) {
100       deleteTask(course, removedFile);
101     }
102     if (removedFile.getName().contains(EduNames.LESSON)) {
103       deleteLesson(course, removedFile, project);
104     }
105   }
106
107   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
108     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
109     if (removedLesson == null) {
110       return;
111     }
112     VirtualFile courseDir = project.getBaseDir();
113     CCUtils.updateHigherElements(courseDir.getChildren(), file -> course.getLesson(file.getName()), removedLesson.getIndex(), EduNames.LESSON, -1);
114     course.getLessons().remove(removedLesson);
115   }
116
117   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
118     VirtualFile lessonDir = removedTask.getParent();
119     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
120       return;
121     }
122     final Lesson lesson = course.getLesson(lessonDir.getName());
123     if (lesson == null) {
124       return;
125     }
126     Task task = lesson.getTask(removedTask.getName());
127     if (task == null) {
128       return;
129     }
130     CCUtils.updateHigherElements(lessonDir.getChildren(), file -> lesson.getTask(file.getName()), task.getIndex(), EduNames.TASK, -1);
131     lesson.getTaskList().remove(task);
132   }
133
134   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
135     Task task = taskFile.getTask();
136     if (task == null) {
137       return;
138     }
139     task.getTaskFiles().remove(removedTaskFile.getName());
140   }
141 }