fa4f4759475717635b2c9b3a5f02ef9139410528
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / courseFormat / Course.java
1 package com.jetbrains.edu.learning.courseFormat;
2
3 import com.google.gson.annotations.Expose;
4 import com.google.gson.annotations.SerializedName;
5 import com.intellij.lang.Language;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.util.xmlb.XmlSerializer;
8 import com.jetbrains.edu.learning.core.EduNames;
9 import com.jetbrains.edu.learning.core.EduUtils;
10 import com.jetbrains.edu.learning.stepic.StepicUser;
11 import org.jdom.Element;
12 import org.jetbrains.annotations.NotNull;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 public class Course {
18   @Expose private List<Lesson> lessons = new ArrayList<Lesson>();
19   @Expose private List<StepicUser> authors = new ArrayList<StepicUser>();
20   @Expose private String description;
21   @Expose private String name;
22   private String myCourseDirectory = "";
23   @Expose private int id;
24   private boolean myUpToDate;
25   @Expose private boolean isAdaptive = false;
26   @Expose @SerializedName("language") private String myLanguage = "Python";
27
28   //this field is used to distinguish ordinary and CheckIO projects,
29   //"PyCharm" is used here for historical reasons
30   private String courseType = EduNames.PYCHARM;
31   private String courseMode = EduNames.STUDY; //this field is used to distinguish study and course creator modes
32
33   public Course() {
34   }
35
36   /**
37    * Initializes state of course
38    */
39   public void initCourse(boolean isRestarted) {
40     for (Lesson lesson : getLessons()) {
41       lesson.initLesson(this, isRestarted);
42     }
43   }
44
45   public List<Lesson> getLessons() {
46     return lessons;
47   }
48
49   public void setLessons(List<Lesson> lessons) {
50     this.lessons = lessons;
51   }
52   public void addLessons(List<Lesson> lessons) {
53     this.lessons.addAll(lessons);
54   }
55
56   public void addLesson(@NotNull final Lesson lesson) {
57     lessons.add(lesson);
58   }
59
60   public Lesson getLesson(@NotNull final String name) {
61     int lessonIndex = EduUtils.getIndex(name, EduNames.LESSON);
62     List<Lesson> lessons = getLessons();
63     if (!EduUtils.indexIsValid(lessonIndex, lessons)) {
64       return null;
65     }
66     for (Lesson lesson : lessons) {
67       if (lesson.getIndex() - 1 == lessonIndex) {
68         return lesson;
69       }
70     }
71     return null;
72   }
73
74   @NotNull
75   public List<StepicUser> getAuthors() {
76     return authors;
77   }
78
79   public static String getAuthorsString(@NotNull List<StepicUser> authors) {
80     return StringUtil.join(authors, StepicUser::getName, ", ");
81   }
82
83   public void setAuthors(String[] authors) {
84     this.authors = new ArrayList<StepicUser>();
85     for (String name : authors) {
86       final List<String> pair = StringUtil.split(name, " ");
87       if (!pair.isEmpty())
88         this.authors.add(new StepicUser(pair.get(0), pair.size() > 1 ? pair.get(1) : ""));
89     }
90   }
91
92   public String getName() {
93     return name;
94   }
95
96   public void setName(String name) {
97     this.name = name;
98   }
99
100   public String getCourseDirectory() {
101     return myCourseDirectory;
102   }
103
104   public void setCourseDirectory(@NotNull final String courseDirectory) {
105     myCourseDirectory = courseDirectory;
106   }
107
108   public String getDescription() {
109     return description;
110   }
111
112   public void setDescription(String description) {
113     this.description = description;
114   }
115
116   public boolean isUpToDate() {
117     return myUpToDate;
118   }
119
120   public void setUpToDate(boolean upToDate) {
121     myUpToDate = upToDate;
122   }
123
124   public Language getLanguageById() {
125     return Language.findLanguageByID(myLanguage);
126   }
127
128   public String getLanguage() {
129     return myLanguage;
130   }
131
132   public void setLanguage(@NotNull final String language) {
133     myLanguage = language;
134   }
135
136   public void setAuthors(List<StepicUser> authors) {
137     this.authors = authors;
138   }
139
140   @NotNull
141   public String getCourseType() {
142     return courseType;
143   }
144
145   public void setCourseType(String courseType) {
146     this.courseType = courseType;
147   }
148
149   public boolean isAdaptive() {
150     return isAdaptive;
151   }
152
153   public void setAdaptive(boolean adaptive) {
154     isAdaptive = adaptive;
155   }
156
157   public int getId() {
158     return id;
159   }
160
161   public void setId(int id) {
162     this.id = id;
163   }
164
165   public String getCourseMode() {
166     return courseMode;
167   }
168
169   public void setCourseMode(String courseMode) {
170     this.courseMode = courseMode;
171   }
172
173   public Course copy() {
174     Element element = XmlSerializer.serialize(this);
175     Course copy = XmlSerializer.deserialize(element, Course.class);
176     if (copy == null) {
177       return null;
178     }
179     copy.initCourse(true);
180     return copy;
181   }
182 }