fixed bugs after huge refactoring
[idea/community.git] / python / educational / src / com / jetbrains / edu / courseFormat / Task.java
1 package com.jetbrains.edu.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.vfs.VirtualFile;
9 import com.intellij.util.xmlb.annotations.Transient;
10 import com.jetbrains.edu.EduNames;
11 import org.jetbrains.annotations.NotNull;
12 import org.jetbrains.annotations.Nullable;
13
14 import java.util.HashMap;
15 import java.util.Map;
16
17 /**
18  * Implementation of task which contains task files, tests, input file for tests
19  */
20 public class Task {
21   @Expose
22   private String name;
23
24   // index is visible to user number of task from 1 to task number
25   private int myIndex;
26   @Expose
27   @SerializedName("task_files")
28   public Map<String, TaskFile> taskFiles = new HashMap<String, TaskFile>();
29
30   private String text;
31   private Map<String, String> testsText = new HashMap<String, String>();
32
33   @Transient private Lesson myLesson;
34
35   public Task() {}
36
37   public Task(@NotNull final String name) {
38     this.name = name;
39   }
40
41   /**
42    * Initializes state of task file
43    *
44    * @param lesson lesson which task belongs to
45    */
46   public void initTask(final Lesson lesson, boolean isRestarted) {
47     setLesson(lesson);
48     for (TaskFile taskFile : getTaskFiles().values()) {
49       taskFile.initTaskFile(this, isRestarted);
50     }
51   }
52
53   public String getName() {
54     return name;
55   }
56
57   public void setName(String name) {
58     this.name = name;
59   }
60
61   public String getText() {
62     return text;
63   }
64
65   public void setText(@NotNull final String text) {
66     this.text = text;
67   }
68
69   public int getIndex() {
70     return myIndex;
71   }
72
73   public void setIndex(int index) {
74     myIndex = index;
75   }
76
77   public Map<String, String> getTestsText() {
78     return testsText;
79   }
80
81   public void setTestsTexts(String name, String text) {
82     testsText.put(name, text);
83   }
84
85   public Map<String, TaskFile> getTaskFiles() {
86     return taskFiles;
87   }
88
89   @Nullable
90   public TaskFile getTaskFile(final String name) {
91     return name != null ? taskFiles.get(name) : null;
92   }
93
94   public boolean isTaskFile(@NotNull final String fileName) {
95     return taskFiles.get(fileName) != null;
96   }
97
98   public void addTaskFile(@NotNull final String name, int index) {
99     TaskFile taskFile = new TaskFile();
100     taskFile.setIndex(index);
101     taskFiles.put(name, taskFile);
102   }
103
104   @Nullable
105   public TaskFile getFile(@NotNull final String fileName) {
106     return taskFiles.get(fileName);
107   }
108
109   @Transient
110   public Lesson getLesson() {
111     return myLesson;
112   }
113
114   @Transient
115   public void setLesson(Lesson lesson) {
116     myLesson = lesson;
117   }
118
119   @Nullable
120   public VirtualFile getTaskDir(@NotNull final Project project) {
121     String lessonDirName = EduNames.LESSON + String.valueOf(myLesson.getIndex());
122     String taskDirName = EduNames.TASK + String.valueOf(myIndex);
123     VirtualFile courseDir = project.getBaseDir();
124     if (courseDir != null) {
125       VirtualFile lessonDir = courseDir.findChild(lessonDirName);
126       if (lessonDir != null) {
127         return lessonDir.findChild(taskDirName);
128       }
129     }
130     return null;
131   }
132
133   @Nullable
134   public String getTaskText(@NotNull final Project project) {
135     final VirtualFile taskDir = getTaskDir(project);
136     if (taskDir != null) {
137       final VirtualFile file = taskDir.findChild(EduNames.TASK_HTML);
138       if (file == null) return null;
139       final Document document = FileDocumentManager.getInstance().getDocument(file);
140       if (document != null) {
141         return document.getImmutableCharSequence().toString();
142       }
143     }
144
145     return null;
146   }
147
148   @Nullable
149   public String getTestsText(@NotNull final Project project) {
150     final VirtualFile taskDir = getTaskDir(project);
151     if (taskDir != null) {
152       final VirtualFile file = taskDir.findChild("tests.py");
153       if (file == null) return null;
154       final Document document = FileDocumentManager.getInstance().getDocument(file);
155       if (document != null) {
156         return document.getImmutableCharSequence().toString();
157       }
158     }
159
160     return null;
161   }
162
163   public Document getDocument(Project project, String name) {
164     final VirtualFile taskDirectory = getTaskDir(project);
165     if (taskDirectory == null) return null;
166     final VirtualFile file = taskDirectory.findChild(name);
167     if (file == null) return null;
168     return FileDocumentManager.getInstance().getDocument(file);
169   }
170
171   @Override
172   public boolean equals(Object o) {
173     if (this == o) return true;
174     if (o == null || getClass() != o.getClass()) return false;
175
176     Task task = (Task)o;
177
178     if (myIndex != task.myIndex) return false;
179     if (name != null ? !name.equals(task.name) : task.name != null) return false;
180     if (taskFiles != null ? !taskFiles.equals(task.taskFiles) : task.taskFiles != null) return false;
181     if (text != null ? !text.equals(task.text) : task.text != null) return false;
182     if (testsText != null ? !testsText.equals(task.testsText) : task.testsText != null) return false;
183
184     return true;
185   }
186
187   @Override
188   public int hashCode() {
189     int result = name != null ? name.hashCode() : 0;
190     result = 31 * result + myIndex;
191     result = 31 * result + (taskFiles != null ? taskFiles.hashCode() : 0);
192     result = 31 * result + (text != null ? text.hashCode() : 0);
193     result = 31 * result + (testsText != null ? testsText.hashCode() : 0);
194     return result;
195   }
196 }