synchronize courses after update for custom projects
[idea/community.git] / python / edu / learn-python / src / com / jetbrains / python / edu / course / Course.java
1 package com.jetbrains.python.edu.course;
2
3 import com.intellij.openapi.application.ApplicationManager;
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.util.io.FileUtil;
7 import com.intellij.openapi.vfs.VirtualFile;
8 import org.jetbrains.annotations.NotNull;
9
10 import java.io.File;
11 import java.io.FilenameFilter;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.List;
15
16 public class Course {
17
18   private static final Logger LOG = Logger.getInstance(Course.class.getName());
19   public static final String SANDBOX_DIR = "Sandbox";
20   public List<Lesson> lessons = new ArrayList<Lesson>();
21   public String description;
22   public String name;
23   public String myResourcePath = "";
24   public String author;
25   public static final String COURSE_DIR = "course";
26   public static final String HINTS_DIR = "hints";
27   private boolean myUpToDate = false;
28
29
30   public List<Lesson> getLessons() {
31     return lessons;
32   }
33
34   /**
35    * Initializes state of course
36    */
37   public void init(boolean isRestarted) {
38     for (Lesson lesson : lessons) {
39       lesson.init(this, isRestarted);
40     }
41   }
42
43   public String getAuthor() {
44     return author;
45   }
46
47   /**
48    * Creates course directory in project user created
49    *
50    * @param baseDir      project directory
51    * @param resourceRoot directory where original course is stored
52    */
53   public void create(@NotNull final VirtualFile baseDir, @NotNull final File resourceRoot,
54                      @NotNull final Project project) {
55     ApplicationManager.getApplication().invokeLater(
56       new Runnable() {
57         @Override
58         public void run() {
59           ApplicationManager.getApplication().runWriteAction(new Runnable() {
60             @Override
61             public void run() {
62               try {
63                 for (int i = 0; i < lessons.size(); i++) {
64                   Lesson lesson = lessons.get(i);
65                   lesson.setIndex(i);
66                   lesson.create(baseDir, resourceRoot, project);
67                 }
68                 baseDir.createChildDirectory(this, SANDBOX_DIR);
69                 File[] files = resourceRoot.listFiles(new FilenameFilter() {
70                   @Override
71                   public boolean accept(File dir, String name) {
72                     return !name.contains(Lesson.LESSON_DIR) && !name.equals("course.json") && !name.equals("hints");
73                   }
74                 });
75                 for (File file : files) {
76                   FileUtil.copy(file, new File(baseDir.getPath(), file.getName()));
77                 }
78               }
79               catch (IOException e) {
80                 LOG.error(e);
81               }
82             }
83           });
84         }
85       });
86   }
87
88   public void setName(String name) {
89     this.name = name;
90   }
91
92   public String getName() {
93     return name;
94   }
95
96   public void setResourcePath(@NotNull final String resourcePath) {
97     myResourcePath = resourcePath;
98   }
99
100   public String getResourcePath() {
101     return myResourcePath;
102   }
103
104   public String getDescription() {
105     return description;
106   }
107
108   public boolean isUpToDate() {
109     return myUpToDate;
110   }
111
112   public void setUpToDate(boolean upToDate) {
113     myUpToDate = upToDate;
114   }
115 }