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