1 package com.jetbrains.edu.learning.courseGeneration;
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;
15 import java.io.FilenameFilter;
16 import java.io.IOException;
17 import java.util.List;
20 public class StudyGenerator {
21 private StudyGenerator() {
24 private static final Logger LOG = Logger.getInstance(StudyGenerator.class.getName());
27 * Creates task files in its task folder in project user created
29 * @param taskDir project directory of task which task file belongs to
30 * @param resourceRoot directory where original task file stored
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("/");
38 systemIndependentName = systemIndependentName.substring(index + 1);
40 File resourceFile = new File(resourceRoot, name);
41 File fileInProject = new File(taskDir.getPath(), systemIndependentName);
42 FileUtil.copy(resourceFile, fileInProject);
46 * Creates task directory in its lesson folder in project user created
48 * @param lessonDir project directory of lesson which task belongs to
49 * @param resourceRoot directory where original task file stored
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());
57 for (Map.Entry<String, TaskFile> taskFile : task.getTaskFiles().entrySet()) {
58 TaskFile taskFileContent = taskFile.getValue();
59 taskFileContent.setIndex(i);
61 createTaskFile(taskDir, newResourceRoot, taskFile.getKey());
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);
77 * Creates lesson directory in its course folder in project user created
79 * @param courseDir project directory of course
80 * @param resourceRoot directory where original lesson stored
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);
92 createTask(task, lessonDir, new File(resourceRoot, lessonDir.getName()), project);
97 * Creates course directory in project user created
99 * @param baseDir project directory
100 * @param resourceRoot directory where original course is stored
102 public static void createCourse(@NotNull final Course course, @NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
103 @NotNull final Project project) {
106 final List<Lesson> lessons = course.getLessons();
107 for (int i = 1; i <= lessons.size(); i++) {
108 Lesson lesson = lessons.get(i - 1);
110 createLesson(lesson, baseDir, resourceRoot, project);
112 baseDir.createChildDirectory(project, EduNames.SANDBOX_DIR);
113 File[] files = resourceRoot.listFiles(new FilenameFilter() {
115 public boolean accept(File dir, String name) {
116 return !name.contains(EduNames.LESSON) && !name.equals(EduNames.COURSE_META_FILE) && !name.equals(EduNames.HINTS);
119 for (File file : files) {
120 FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
123 catch (IOException e) {