fixed bugs after huge refactoring
[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.EduUtils;
9 import com.jetbrains.edu.courseFormat.Course;
10 import com.jetbrains.edu.courseFormat.Lesson;
11 import com.jetbrains.edu.courseFormat.Task;
12 import com.jetbrains.edu.courseFormat.TaskFile;
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     EduUtils.markDirAsSourceRoot(taskDir, project);
57     File newResourceRoot = new File(resourceRoot, taskDir.getName());
58     int i = 0;
59     for (Map.Entry<String, TaskFile> taskFile : task.getTaskFiles().entrySet()) {
60       TaskFile taskFileContent = taskFile.getValue();
61       taskFileContent.setIndex(i);
62       i++;
63       createTaskFile(taskDir, newResourceRoot, taskFile.getKey());
64     }
65     File[] filesInTask = newResourceRoot.listFiles();
66     if (filesInTask != null) {
67       for (File file : filesInTask) {
68         String fileName = file.getName();
69         if (!task.isTaskFile(fileName)) {
70           File resourceFile = new File(newResourceRoot, fileName);
71           File fileInProject = new File(taskDir.getCanonicalPath(), fileName);
72           FileUtil.copy(resourceFile, fileInProject);
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     String lessonDirName = EduNames.LESSON + Integer.toString(lesson.getIndex());
88     VirtualFile lessonDir = courseDir.createChildDirectory(project, lessonDirName);
89     final List<Task> taskList = lesson.getTaskList();
90     for (int i = 1; i <= taskList.size(); i++) {
91       Task task = taskList.get(i - 1);
92       task.setIndex(i);
93       createTask(task, lessonDir, new File(resourceRoot, lessonDir.getName()), project);
94     }
95   }
96
97   /**
98    * Creates course directory in project user created
99    *
100    * @param baseDir      project directory
101    * @param resourceRoot directory where original course is stored
102    */
103   public static void createCourse(@NotNull final Course course, @NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
104                                   @NotNull final Project project) {
105
106               try {
107                 final List<Lesson> lessons = course.getLessons();
108                 for (int i = 1; i <= lessons.size(); i++) {
109                   Lesson lesson = lessons.get(i - 1);
110                   lesson.setIndex(i);
111                   createLesson(lesson, baseDir, resourceRoot, project);
112                 }
113                 baseDir.createChildDirectory(project, EduNames.SANDBOX_DIR);
114                 File[] files = resourceRoot.listFiles(new FilenameFilter() {
115                   @Override
116                   public boolean accept(File dir, String name) {
117                     return !name.contains(EduNames.LESSON) && !name.equals("course.json") && !name.equals("hints");
118                   }
119                 });
120                 for (File file : files) {
121                   FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
122                 }
123               }
124               catch (IOException e) {
125                 LOG.error(e);
126               }
127   }
128
129 }