commit changes to pattern document before study check action
[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.util.io.FileUtil;
7 import com.intellij.openapi.vfs.VirtualFile;
8 import com.intellij.openapi.vfs.VirtualFileAdapter;
9 import com.intellij.openapi.vfs.VirtualFileEvent;
10 import com.intellij.util.Function;
11 import com.jetbrains.edu.learning.StudyTaskManager;
12 import com.jetbrains.edu.learning.StudyUtils;
13 import com.jetbrains.edu.learning.core.EduNames;
14 import com.jetbrains.edu.learning.courseFormat.*;
15 import org.jetbrains.annotations.NotNull;
16
17 import java.io.File;
18 import java.io.IOException;
19
20 public class CCVirtualFileListener extends VirtualFileAdapter {
21
22   private static final Logger LOG = Logger.getInstance(CCVirtualFileListener.class);
23
24   @Override
25   public void fileCreated(@NotNull VirtualFileEvent event) {
26     VirtualFile createdFile = event.getFile();
27     Project project = ProjectUtil.guessProjectForFile(createdFile);
28     if (project == null) {
29       return;
30     }
31     Course course = StudyTaskManager.getInstance(project).getCourse();
32     if (course == null || !CCUtils.isCourseCreator(project)) {
33       return;
34     }
35     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
36     if (taskFile != null) {
37       return;
38     }
39
40     String name = createdFile.getName();
41     if (CCUtils.isTestsFile(project, createdFile)
42         || EduNames.TASK_HTML.equals(name)
43         || name.contains(EduNames.WINDOW_POSTFIX)
44         || name.contains(EduNames.WINDOWS_POSTFIX)) {
45       return;
46     }
47
48     VirtualFile taskVF = createdFile.getParent();
49     if (taskVF == null) {
50       return;
51     }
52     Task task = StudyUtils.getTask(project, taskVF);
53     if (task == null) {
54       return;
55     }
56
57     createResourceFile(createdFile, course, taskVF);
58
59     task.addTaskFile(name, 1);
60   }
61
62   private static void createResourceFile(VirtualFile createdFile, Course course, VirtualFile taskVF) {
63     VirtualFile lessonVF = taskVF.getParent();
64     if (lessonVF == null) {
65       return;
66     }
67
68     String taskResourcesPath = FileUtil.join(course.getCourseDirectory(), lessonVF.getName(), taskVF.getName());
69     File taskResourceFile = new File(taskResourcesPath);
70     if (!taskResourceFile.exists()) {
71       if (!taskResourceFile.mkdirs()) {
72         LOG.info("Failed to create resources for task " + taskResourcesPath);
73       }
74     }
75     try {
76       File toFile = new File(taskResourceFile, createdFile.getName());
77       FileUtil.copy(new File(createdFile.getPath()), toFile);
78     }
79     catch (IOException e) {
80       LOG.info("Failed to copy created task file to resources " + createdFile.getPath());
81     }
82   }
83
84   @Override
85   public void fileDeleted(@NotNull VirtualFileEvent event) {
86     VirtualFile removedFile = event.getFile();
87     if (removedFile.getPath().contains(CCUtils.GENERATED_FILES_FOLDER)) {
88       return;
89     }
90
91     Project project = ProjectUtil.guessProjectForFile(removedFile);
92     if (project == null) {
93       return;
94     }
95     Course course = StudyTaskManager.getInstance(project).getCourse();
96     if (course == null) {
97       return;
98     }
99     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
100     if (taskFile != null) {
101       deleteTaskFile(removedFile, taskFile);
102       return;
103     }
104     if (removedFile.getName().contains(EduNames.TASK)) {
105       deleteTask(course, removedFile);
106     }
107     if (removedFile.getName().contains(EduNames.LESSON)) {
108       deleteLesson(course, removedFile, project);
109     }
110   }
111
112   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
113     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
114     if (removedLesson == null) {
115       return;
116     }
117     VirtualFile courseDir = project.getBaseDir();
118     CCUtils.updateHigherElements(courseDir.getChildren(), new Function<VirtualFile, StudyItem>() {
119       @Override
120       public StudyItem fun(VirtualFile file) {
121         return course.getLesson(file.getName());
122       }
123     }, removedLesson.getIndex(), EduNames.LESSON, -1);
124     course.getLessons().remove(removedLesson);
125   }
126
127   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
128     VirtualFile lessonDir = removedTask.getParent();
129     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
130       return;
131     }
132     final Lesson lesson = course.getLesson(lessonDir.getName());
133     if (lesson == null) {
134       return;
135     }
136     Task task = lesson.getTask(removedTask.getName());
137     if (task == null) {
138       return;
139     }
140     CCUtils.updateHigherElements(lessonDir.getChildren(), new Function<VirtualFile, StudyItem>() {
141       @Override
142       public StudyItem fun(VirtualFile file) {
143         return lesson.getTask(file.getName());
144       }
145     }, task.getIndex(), EduNames.TASK, -1);
146     lesson.getTaskList().remove(task);
147   }
148
149   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
150     Task task = taskFile.getTask();
151     if (task == null) {
152       return;
153     }
154     task.getTaskFiles().remove(removedTaskFile.getName());
155   }
156 }