create resource files for created task files
[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.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.Course;
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 import java.io.IOException;
20
21 public class CCVirtualFileListener extends VirtualFileAdapter {
22
23   private static final Logger LOG = Logger.getInstance(CCVirtualFileListener.class);
24
25   @Override
26   public void fileCreated(@NotNull VirtualFileEvent event) {
27     VirtualFile createdFile = event.getFile();
28     Project project = ProjectUtil.guessProjectForContentFile(createdFile);
29     if (project == null) {
30       return;
31     }
32     Course course = StudyTaskManager.getInstance(project).getCourse();
33     if (course == null || !CCUtils.isCourseCreator(project)) {
34       return;
35     }
36     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
37     if (taskFile != null) {
38       return;
39     }
40
41     if (CCUtils.isTestsFile(project, createdFile) || EduNames.TASK_HTML.equals(createdFile.getName())) {
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     createResourceFile(createdFile, course, taskVF);
55
56     task.addTaskFile(createdFile.getName(), 1);
57   }
58
59   private static void createResourceFile(VirtualFile createdFile, Course course, VirtualFile taskVF) {
60     VirtualFile lessonVF = taskVF.getParent();
61     if (lessonVF == null) {
62       return;
63     }
64
65     String taskResourcesPath = FileUtil.join(course.getCourseDirectory(), lessonVF.getName(), taskVF.getName());
66     File taskResourceFile = new File(taskResourcesPath);
67     if (!taskResourceFile.exists()) {
68       if (!taskResourceFile.mkdirs()) {
69         LOG.info("Failed to create resources for task " + taskResourcesPath);
70       }
71     }
72     try {
73       File toFile = new File(taskResourceFile, createdFile.getName());
74       FileUtil.copy(new File(createdFile.getPath()), toFile);
75     }
76     catch (IOException e) {
77       LOG.info("Failed to copy created task file to resources " + createdFile.getPath());
78     }
79   }
80 }