e77229f40c23e87f9e6b7c5cd02bf1e3e356ce34
[idea/community.git] / python / educational / interactive-learning / src / com / jetbrains / edu / learning / courseGeneration / StudyGenerator.java
1 package com.jetbrains.edu.learning.courseGeneration;
2
3 import com.intellij.openapi.diagnostic.Logger;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.util.io.FileUtil;
6 import com.intellij.openapi.vfs.VirtualFile;
7 import com.jetbrains.edu.EduNames;
8 import com.jetbrains.edu.courseFormat.Course;
9 import com.jetbrains.edu.courseFormat.Lesson;
10 import com.jetbrains.edu.courseFormat.Task;
11 import com.jetbrains.edu.courseFormat.TaskFile;
12 import com.jetbrains.edu.learning.StudyTaskManager;
13 import org.jetbrains.annotations.NotNull;
14
15 import java.io.File;
16 import java.io.FilenameFilter;
17 import java.io.IOException;
18 import java.util.List;
19 import java.util.Map;
20
21 public class StudyGenerator {
22   private StudyGenerator() {
23
24   }
25   private static final Logger LOG = Logger.getInstance(StudyGenerator.class.getName());
26
27   /**
28    * Creates task files in its task folder in project user created
29    *
30    * @param taskDir      project directory of task which task file belongs to
31    * @param resourceRoot directory where original task file stored
32    * @throws IOException
33    */
34   public static void createTaskFile(@NotNull final VirtualFile taskDir, @NotNull final File resourceRoot,
35                                     @NotNull final String name) throws IOException {
36     String systemIndependentName = FileUtil.toSystemIndependentName(name);
37     final int index = systemIndependentName.lastIndexOf("/");
38     if (index > 0) {
39       systemIndependentName = systemIndependentName.substring(index + 1);
40     }
41     File resourceFile = new File(resourceRoot, name);
42     File fileInProject = new File(taskDir.getPath(), systemIndependentName);
43     FileUtil.copy(resourceFile, fileInProject);
44   }
45
46   /**
47    * Creates task directory in its lesson folder in project user created
48    *
49    * @param lessonDir    project directory of lesson which task belongs to
50    * @param resourceRoot directory where original task file stored
51    * @throws IOException
52    */
53   public static void createTask(@NotNull final Task task, @NotNull final VirtualFile lessonDir, @NotNull final File resourceRoot,
54                                 @NotNull final Project project) throws IOException {
55     VirtualFile taskDir = lessonDir.createChildDirectory(project, EduNames.TASK + Integer.toString(task.getIndex()));
56     File newResourceRoot = new File(resourceRoot, taskDir.getName());
57     int i = 0;
58     for (Map.Entry<String, TaskFile> taskFile : task.getTaskFiles().entrySet()) {
59       TaskFile taskFileContent = taskFile.getValue();
60       taskFileContent.setIndex(i);
61       i++;
62       createTaskFile(taskDir, newResourceRoot, taskFile.getKey());
63     }
64     File[] filesInTask = newResourceRoot.listFiles();
65     if (filesInTask != null) {
66       for (File file : filesInTask) {
67         String fileName = file.getName();
68         if (!task.isTaskFile(fileName)) {
69           File resourceFile = new File(newResourceRoot, fileName);
70           File fileInProject = new File(taskDir.getCanonicalPath(), fileName);
71           FileUtil.copy(resourceFile, fileInProject);
72           StudyTaskManager.getInstance(project).addInvisibleFiles(fileInProject.getPath());
73         }
74       }
75     }
76   }
77
78   /**
79    * Creates lesson directory in its course folder in project user created
80    *
81    * @param courseDir    project directory of course
82    * @param resourceRoot directory where original lesson stored
83    * @throws IOException
84    */
85   public static void createLesson(@NotNull final Lesson lesson, @NotNull final VirtualFile courseDir, @NotNull final File resourceRoot,
86                                   @NotNull final Project project) throws IOException {
87     if (EduNames.PYCHARM_ADDITIONAL.equals(lesson.getName())) return;
88     String lessonDirName = EduNames.LESSON + Integer.toString(lesson.getIndex());
89     VirtualFile lessonDir = courseDir.createChildDirectory(project, lessonDirName);
90     final List<Task> taskList = lesson.getTaskList();
91     for (int i = 1; i <= taskList.size(); i++) {
92       Task task = taskList.get(i - 1);
93       task.setIndex(i);
94       createTask(task, lessonDir, new File(resourceRoot, lessonDir.getName()), project);
95     }
96   }
97
98   /**
99    * Creates course directory in project user created
100    *
101    * @param baseDir      project directory
102    * @param resourceRoot directory where original course is stored
103    */
104   public static void createCourse(@NotNull final Course course, @NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
105                                   @NotNull final Project project) {
106
107               try {
108                 final List<Lesson> lessons = course.getLessons();
109                 for (int i = 1; i <= lessons.size(); i++) {
110                   Lesson lesson = lessons.get(i - 1);
111                   lesson.setIndex(i);
112                   createLesson(lesson, baseDir, resourceRoot, project);
113                 }
114                 baseDir.createChildDirectory(project, EduNames.SANDBOX_DIR);
115                 File[] files = resourceRoot.listFiles(new FilenameFilter() {
116                   @Override
117                   public boolean accept(File dir, String name) {
118                     return !name.contains(EduNames.LESSON) && !name.equals(EduNames.COURSE_META_FILE) && !name.equals(EduNames.HINTS);
119                   }
120                 });
121                 for (File file : files) {
122                   FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
123                 }
124               }
125               catch (IOException e) {
126                 LOG.error(e);
127               }
128   }
129
130 }