do not use old service
[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.diagnostic.Logger;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.project.ProjectUtil;
6 import com.intellij.openapi.vfs.VirtualFile;
7 import com.intellij.openapi.vfs.VirtualFileAdapter;
8 import com.intellij.openapi.vfs.VirtualFileEvent;
9 import com.intellij.util.Function;
10 import com.jetbrains.edu.learning.StudyTaskManager;
11 import com.jetbrains.edu.learning.StudyUtils;
12 import com.jetbrains.edu.learning.core.EduNames;
13 import com.jetbrains.edu.learning.courseFormat.*;
14 import org.jetbrains.annotations.NotNull;
15
16 public class CCVirtualFileListener extends VirtualFileAdapter {
17
18   private static final Logger LOG = Logger.getInstance(CCVirtualFileListener.class);
19
20   @Override
21   public void fileCreated(@NotNull VirtualFileEvent event) {
22     VirtualFile createdFile = event.getFile();
23     Project project = ProjectUtil.guessProjectForFile(createdFile);
24     if (project == null) {
25       return;
26     }
27     Course course = StudyTaskManager.getInstance(project).getCourse();
28     if (course == null || !CCUtils.isCourseCreator(project)) {
29       return;
30     }
31     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
32     if (taskFile != null) {
33       return;
34     }
35
36     String name = createdFile.getName();
37     if (CCUtils.isTestsFile(project, createdFile)
38         || EduNames.TASK_HTML.equals(name)
39         || name.contains(EduNames.WINDOW_POSTFIX)
40         || name.contains(EduNames.WINDOWS_POSTFIX)
41         || name.contains(EduNames.ANSWERS_POSTFIX)) {
42       return;
43     }
44
45     VirtualFile taskVF = createdFile.getParent();
46     if (taskVF == null) {
47       return;
48     }
49     Task task = StudyUtils.getTask(project, taskVF);
50     if (task == null) {
51       return;
52     }
53
54     CCUtils.createResourceFile(createdFile, course, taskVF);
55
56     task.addTaskFile(name, 1);
57   }
58
59   @Override
60   public void fileDeleted(@NotNull VirtualFileEvent event) {
61     VirtualFile removedFile = event.getFile();
62     if (removedFile.getPath().contains(CCUtils.GENERATED_FILES_FOLDER)) {
63       return;
64     }
65
66     Project project = ProjectUtil.guessProjectForFile(removedFile);
67     if (project == null) {
68       return;
69     }
70     Course course = StudyTaskManager.getInstance(project).getCourse();
71     if (course == null) {
72       return;
73     }
74     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
75     if (taskFile != null) {
76       deleteTaskFile(removedFile, taskFile);
77       return;
78     }
79     if (removedFile.getName().contains(EduNames.TASK)) {
80       deleteTask(course, removedFile);
81     }
82     if (removedFile.getName().contains(EduNames.LESSON)) {
83       deleteLesson(course, removedFile, project);
84     }
85   }
86
87   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
88     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
89     if (removedLesson == null) {
90       return;
91     }
92     VirtualFile courseDir = project.getBaseDir();
93     CCUtils.updateHigherElements(courseDir.getChildren(), new Function<VirtualFile, StudyItem>() {
94       @Override
95       public StudyItem fun(VirtualFile file) {
96         return course.getLesson(file.getName());
97       }
98     }, removedLesson.getIndex(), EduNames.LESSON, -1);
99     course.getLessons().remove(removedLesson);
100   }
101
102   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
103     VirtualFile lessonDir = removedTask.getParent();
104     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
105       return;
106     }
107     final Lesson lesson = course.getLesson(lessonDir.getName());
108     if (lesson == null) {
109       return;
110     }
111     Task task = lesson.getTask(removedTask.getName());
112     if (task == null) {
113       return;
114     }
115     CCUtils.updateHigherElements(lessonDir.getChildren(), new Function<VirtualFile, StudyItem>() {
116       @Override
117       public StudyItem fun(VirtualFile file) {
118         return lesson.getTask(file.getName());
119       }
120     }, task.getIndex(), EduNames.TASK, -1);
121     lesson.getTaskList().remove(task);
122   }
123
124   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
125     Task task = taskFile.getTask();
126     if (task == null) {
127       return;
128     }
129     task.getTaskFiles().remove(removedTaskFile.getName());
130   }
131 }