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 com.jetbrains.edu.learning.StudyTaskManager;
13 import org.jetbrains.annotations.NotNull;
16 import java.io.FilenameFilter;
17 import java.io.IOException;
18 import java.util.List;
21 public class StudyGenerator {
22 private StudyGenerator() {
25 private static final Logger LOG = Logger.getInstance(StudyGenerator.class.getName());
28 * Creates task files in its task folder in project user created
30 * @param taskDir project directory of task which task file belongs to
31 * @param resourceRoot directory where original task file stored
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("/");
39 systemIndependentName = systemIndependentName.substring(index + 1);
41 File resourceFile = new File(resourceRoot, name);
42 File fileInProject = new File(taskDir.getPath(), systemIndependentName);
43 FileUtil.copy(resourceFile, fileInProject);
47 * Creates task directory in its lesson folder in project user created
49 * @param lessonDir project directory of lesson which task belongs to
50 * @param resourceRoot directory where original task file stored
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());
58 for (Map.Entry<String, TaskFile> taskFile : task.getTaskFiles().entrySet()) {
59 TaskFile taskFileContent = taskFile.getValue();
60 taskFileContent.setIndex(i);
62 createTaskFile(taskDir, newResourceRoot, taskFile.getKey());
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(FileUtil.toSystemIndependentName(fileInProject.getPath()));
79 * Creates lesson directory in its course folder in project user created
81 * @param courseDir project directory of course
82 * @param resourceRoot directory where original lesson stored
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);
94 createTask(task, lessonDir, new File(resourceRoot, lessonDir.getName()), project);
99 * Creates course directory in project user created
101 * @param baseDir project directory
102 * @param resourceRoot directory where original course is stored
104 public static void createCourse(@NotNull final Course course, @NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
105 @NotNull final Project project) {
108 final List<Lesson> lessons = course.getLessons();
109 for (int i = 1; i <= lessons.size(); i++) {
110 Lesson lesson = lessons.get(i - 1);
112 createLesson(lesson, baseDir, resourceRoot, project);
114 baseDir.createChildDirectory(project, EduNames.SANDBOX_DIR);
115 File[] files = resourceRoot.listFiles(new FilenameFilter() {
117 public boolean accept(File dir, String name) {
118 return !name.contains(EduNames.LESSON) && !name.equals(EduNames.COURSE_META_FILE) && !name.equals(EduNames.HINTS);
121 for (File file : files) {
122 FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
125 catch (IOException e) {