remove code related to subtasks
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / courseFormat / Task.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.openapi.editor.Document;
6 import com.intellij.openapi.fileEditor.FileDocumentManager;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.util.text.StringUtil;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.util.xmlb.XmlSerializer;
11 import com.intellij.util.xmlb.annotations.Transient;
12 import com.jetbrains.edu.learning.StudyUtils;
13 import com.jetbrains.edu.learning.core.EduNames;
14 import org.jdom.Element;
15 import org.jetbrains.annotations.NotNull;
16 import org.jetbrains.annotations.Nullable;
17
18 import java.util.HashMap;
19 import java.util.Map;
20
21 /**
22  * Implementation of task which contains task files, tests, input file for tests
23  */
24 public class Task implements StudyItem {
25   @Expose
26   private String name;
27
28   // index is visible to user number of task from 1 to task number
29   private int myIndex;
30   private StudyStatus myStatus = StudyStatus.Unchecked;
31
32   @Expose private int myStepicId;
33
34   @Expose
35   @SerializedName("task_files")
36   public Map<String, TaskFile> taskFiles = new HashMap<String, TaskFile>();
37
38   private String text;
39   private Map<String, String> testsText = new HashMap<String, String>();
40
41   @Transient private Lesson myLesson;
42
43   public Task() {}
44
45   public Task(@NotNull final String name) {
46     this.name = name;
47   }
48
49   /**
50    * Initializes state of task file
51    *
52    * @param lesson lesson which task belongs to
53    */
54   public void initTask(final Lesson lesson, boolean isRestarted) {
55     setLesson(lesson);
56     if (!isRestarted) myStatus = StudyStatus.Unchecked;
57     for (TaskFile taskFile : getTaskFiles().values()) {
58       taskFile.initTaskFile(this, isRestarted);
59     }
60   }
61
62   public String getName() {
63     return name;
64   }
65
66   public void setName(String name) {
67     this.name = name;
68   }
69
70   public String getText() {
71     return text;
72   }
73
74   public void setText(final String text) {
75     this.text = text;
76   }
77
78   public int getIndex() {
79     return myIndex;
80   }
81
82   public void setIndex(int index) {
83     myIndex = index;
84   }
85
86   public Map<String, String> getTestsText() {
87     return testsText;
88   }
89
90   public void addTestsTexts(String name, String text) {
91     testsText.put(name, text);
92   }
93
94   public Map<String, TaskFile> getTaskFiles() {
95     return taskFiles;
96   }
97
98   @Nullable
99   public TaskFile getTaskFile(final String name) {
100     return name != null ? taskFiles.get(name) : null;
101   }
102
103   public boolean isTaskFile(@NotNull final String fileName) {
104     return taskFiles.get(fileName) != null;
105   }
106
107   public void addTaskFile(@NotNull final String name, int index) {
108     TaskFile taskFile = new TaskFile();
109     taskFile.setIndex(index);
110     taskFile.setTask(this);
111     taskFile.name = name;
112     taskFiles.put(name, taskFile);
113   }
114
115   public void addTaskFile(@NotNull final TaskFile taskFile) {
116     taskFiles.put(taskFile.name, taskFile);
117   }
118
119   @Nullable
120   public TaskFile getFile(@NotNull final String fileName) {
121     return taskFiles.get(fileName);
122   }
123
124   @Transient
125   public Lesson getLesson() {
126     return myLesson;
127   }
128
129   @Transient
130   public void setLesson(Lesson lesson) {
131     myLesson = lesson;
132   }
133
134   @Nullable
135   public VirtualFile getTaskDir(@NotNull final Project project) {
136     String lessonDirName = EduNames.LESSON + String.valueOf(myLesson.getIndex());
137     String taskDirName = EduNames.TASK + String.valueOf(myIndex);
138     VirtualFile courseDir = project.getBaseDir();
139     if (courseDir != null) {
140       VirtualFile lessonDir = courseDir.findChild(lessonDirName);
141       if (lessonDir != null) {
142         return lessonDir.findChild(taskDirName);
143       }
144     }
145     return null;
146   }
147
148   @NotNull
149   public String getTaskText(@NotNull final Project project) {
150     if (!StringUtil.isEmptyOrSpaces(text)) return text;
151     final VirtualFile taskDir = getTaskDir(project);
152     if (taskDir != null) {
153       final VirtualFile file = StudyUtils.findTaskDescriptionVirtualFile(taskDir);
154       if (file == null) return "";
155       final Document document = FileDocumentManager.getInstance().getDocument(file);
156       if (document != null) {
157         return document.getImmutableCharSequence().toString();
158       }
159     }
160
161     return "";
162   }
163
164   @NotNull
165   public String getTestsText(@NotNull final Project project) {
166     final VirtualFile taskDir = getTaskDir(project);
167     if (taskDir != null) {
168       final VirtualFile file = taskDir.findChild(EduNames.TESTS_FILE);
169       if (file == null) return "";
170       final Document document = FileDocumentManager.getInstance().getDocument(file);
171       if (document != null) {
172         return document.getImmutableCharSequence().toString();
173       }
174     }
175
176     return "";
177   }
178
179   @Override
180   public boolean equals(Object o) {
181     if (this == o) return true;
182     if (o == null || getClass() != o.getClass()) return false;
183
184     Task task = (Task)o;
185
186     if (myIndex != task.myIndex) return false;
187     if (name != null ? !name.equals(task.name) : task.name != null) return false;
188     if (taskFiles != null ? !taskFiles.equals(task.taskFiles) : task.taskFiles != null) return false;
189     if (text != null ? !text.equals(task.text) : task.text != null) return false;
190     if (testsText != null ? !testsText.equals(task.testsText) : task.testsText != null) return false;
191
192     return true;
193   }
194
195   @Override
196   public int hashCode() {
197     int result = name != null ? name.hashCode() : 0;
198     result = 31 * result + myIndex;
199     result = 31 * result + (taskFiles != null ? taskFiles.hashCode() : 0);
200     result = 31 * result + (text != null ? text.hashCode() : 0);
201     result = 31 * result + (testsText != null ? testsText.hashCode() : 0);
202     return result;
203   }
204
205   public void setStepicId(int stepicId) {
206     myStepicId = stepicId;
207   }
208
209   public int getStepicId() {
210     return myStepicId;
211   }
212
213   public StudyStatus getStatus() {
214     return myStatus;
215   }
216   
217   public void setStatus(StudyStatus status) {
218     myStatus = status;
219     for (TaskFile taskFile : taskFiles.values()) {
220       for (AnswerPlaceholder placeholder : taskFile.getAnswerPlaceholders()) {
221         placeholder.setStatus(status);
222       }
223     }
224   }
225
226   public Task copy() {
227     Element element = XmlSerializer.serialize(this);
228     Task copy = XmlSerializer.deserialize(element, Task.class);
229     if (copy == null) {
230       return null;
231     }
232     copy.initTask(null, true);
233     return copy;
234   }
235 }