Skip to content

Commit ea5aecc

Browse files
committed
imports
1 parent ef87000 commit ea5aecc

File tree

13 files changed

+193
-42
lines changed

13 files changed

+193
-42
lines changed

tmc-plugin/src/fi/helsinki/cs/tmc/actions/CheckForNewExercisesOrUpdates.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.ArrayList;
2424
import javax.swing.AbstractAction;
2525
import javax.swing.Icon;
26+
import javax.swing.SwingUtilities;
2627
import org.apache.commons.lang3.StringUtils;
2728
import org.netbeans.api.progress.ProgressHandle;
2829
import org.netbeans.api.progress.ProgressHandleFactory;
@@ -119,7 +120,7 @@ private boolean backgroundProcessingOrNoCurrentCourse(final Course currentCourse
119120
}
120121

121122
class UpdateCourseForExerciseUpdate implements FutureCallback<Course> {
122-
123+
123124
private ProgressHandle lastAction;
124125

125126
/**
@@ -131,14 +132,22 @@ public UpdateCourseForExerciseUpdate(ProgressHandle lastAction) {
131132
}
132133

133134
@Override
134-
public void onSuccess(Course receivedCourse) {
135-
lastAction.finish();
136-
if (receivedCourse != null) {
137-
setCourseNameToAllExercises(receivedCourse);
138-
courseDb.putDetailedCourse(receivedCourse);
139-
final LocalExerciseStatus status = LocalExerciseStatus.get(receivedCourse.getExercises());
140-
updateGUI(status);
141-
}
135+
public void onSuccess(final Course receivedCourse) {
136+
SwingUtilities.invokeLater(new Runnable() {
137+
138+
@Override
139+
public void run() {
140+
lastAction.finish();
141+
if (receivedCourse != null) {
142+
setCourseNameToAllExercises(receivedCourse);
143+
courseDb.putDetailedCourse(receivedCourse);
144+
final LocalExerciseStatus status = LocalExerciseStatus.get(receivedCourse.getExercises());
145+
updateGUI(status);
146+
}
147+
}
148+
149+
});
150+
142151
}
143152

144153
private void setCourseNameToAllExercises(Course receivedCourse) {
@@ -166,11 +175,18 @@ public void actionPerformed(ActionEvent e) {
166175
}
167176

168177
@Override
169-
public void onFailure(Throwable ex) {
170-
lastAction.finish();
171-
if (!beQuiet || ex instanceof ObsoleteClientException) {
172-
dialogs.displayError("Failed to check for new exercises.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
173-
}
178+
public void onFailure(final Throwable ex) {
179+
SwingUtilities.invokeLater(new Runnable() {
180+
181+
@Override
182+
public void run() {
183+
lastAction.finish();
184+
if (!beQuiet || ex instanceof ObsoleteClientException) {
185+
dialogs.displayError("Failed to check for new exercises.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
186+
}
187+
}
188+
189+
});
174190
}
175191
}
176192

tmc-plugin/src/fi/helsinki/cs/tmc/actions/RefreshCoursesAction.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.List;
1818
import java.util.logging.Level;
1919
import java.util.logging.Logger;
20+
import javax.swing.SwingUtilities;
2021
import org.netbeans.api.progress.ProgressHandle;
2122
import org.netbeans.api.progress.ProgressHandleFactory;
2223
import org.openide.util.Exceptions;
@@ -188,17 +189,31 @@ public DefaultListener(boolean showDialogOnError, boolean updateCourseDb) {
188189
}
189190

190191
@Override
191-
public void onSuccess(List<Course> result) {
192-
if (updateCourseDb) {
193-
courseDb.setAvailableCourses(result);
194-
}
192+
public void onSuccess(final List<Course> result) {
193+
SwingUtilities.invokeLater(new Runnable() {
194+
195+
@Override
196+
public void run() {
197+
if (updateCourseDb) {
198+
courseDb.setAvailableCourses(result);
199+
}
200+
}
201+
202+
});
195203
}
196204

197205
@Override
198-
public void onFailure(Throwable ex) {
199-
if (showDialogOnError) {
200-
dialogs.displayError("Course refresh failed.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
201-
}
206+
public void onFailure(final Throwable ex) {
207+
SwingUtilities.invokeLater(new Runnable() {
208+
209+
@Override
210+
public void run() {
211+
if (showDialogOnError) {
212+
dialogs.displayError("Course refresh failed.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
213+
}
214+
}
215+
216+
});
202217
}
203218
}
204219
}

tmc-plugin/src/fi/helsinki/cs/tmc/actions/SubmitExerciseAction.java

Lines changed: 108 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
11
package fi.helsinki.cs.tmc.actions;
22

3+
import com.google.common.util.concurrent.FutureCallback;
4+
import com.google.common.util.concurrent.Futures;
5+
import com.google.common.util.concurrent.ListenableFuture;
6+
import fi.helsinki.cs.tmc.data.ResultCollector;
7+
import fi.helsinki.cs.tmc.events.TmcEventBus;
38
import fi.helsinki.cs.tmc.exerciseSubmitter.ExerciseSubmitter;
9+
410
import fi.helsinki.cs.tmc.model.CourseDb;
11+
import fi.helsinki.cs.tmc.model.NBTmcSettings;
512
import fi.helsinki.cs.tmc.model.ProjectMediator;
13+
import fi.helsinki.cs.tmc.model.TmcCoreSingleton;
14+
import fi.helsinki.cs.tmc.model.TmcProjectInfo;
15+
import fi.helsinki.cs.tmc.ui.ConvenientDialogDisplayer;
16+
import fi.helsinki.cs.tmc.ui.SubmissionResultWaitingDialog;
17+
import fi.helsinki.cs.tmc.ui.TestResultDisplayer;
18+
import hy.tmc.core.TmcCore;
19+
import hy.tmc.core.domain.Exercise;
20+
import hy.tmc.core.domain.submission.SubmissionResult;
21+
import hy.tmc.core.exceptions.TmcCoreException;
22+
import java.util.logging.Level;
23+
import java.util.logging.Logger;
24+
import javax.swing.SwingUtilities;
625
import org.netbeans.api.project.Project;
726
import org.openide.nodes.Node;
827
import org.openide.util.NbBundle.Messages;
@@ -14,10 +33,16 @@ public final class SubmitExerciseAction extends AbstractExerciseSensitiveAction
1433

1534
private CourseDb courseDb;
1635
private ProjectMediator projectMediator;
36+
private final TmcCore core;
37+
private NBTmcSettings settings;
38+
private ConvenientDialogDisplayer dialogs;
1739

1840
public SubmitExerciseAction() {
1941
this.courseDb = CourseDb.getInstance();
2042
this.projectMediator = ProjectMediator.getInstance();
43+
this.core = TmcCoreSingleton.getInstance();
44+
this.settings = NBTmcSettings.getDefault();
45+
this.dialogs = ConvenientDialogDisplayer.getDefault();
2146

2247
putValue("noIconInMenu", Boolean.TRUE);
2348
}
@@ -34,7 +59,29 @@ protected ProjectMediator getProjectMediator() {
3459

3560
@Override
3661
protected void performAction(Node[] nodes) {
37-
new ExerciseSubmitter().performAction(projectsFromNodes(nodes).toArray(new Project[0]));
62+
63+
projectMediator.saveAllFiles();
64+
65+
Project[] projects = projectsFromNodes(nodes).toArray(new Project[0]);
66+
for (Project project : projects) {
67+
TmcProjectInfo info = projectMediator.wrapProject(project);
68+
TmcEventBus.getDefault().post(new ExerciseSubmitter.InvokedEvent(info));
69+
submitProject(info);
70+
}
71+
}
72+
73+
private void submitProject(TmcProjectInfo info) {
74+
75+
Exercise exercise = projectMediator.tryGetExerciseForProject(info, courseDb);
76+
final SubmissionResultWaitingDialog dialog = SubmissionResultWaitingDialog.createAndShow();
77+
try {
78+
ListenableFuture<SubmissionResult> result;
79+
result = core.submit(info.getProjectDirAbsPath(), settings);
80+
Futures.addCallback(result, new SubmissionCallback(exercise, dialog));
81+
} catch (TmcCoreException ex) {
82+
String message = "There was an error submitting project " + info.getProjectName();
83+
dialogs.displayError(message, ex);
84+
}
3885
}
3986

4087
@Override
@@ -47,5 +94,64 @@ protected String iconResource() {
4794
// The setting in layer.xml doesn't work with NodeAction
4895
return "fi/helsinki/cs/tmc/actions/submit.png";
4996
}
50-
97+
98+
private class SubmissionCallback implements FutureCallback<SubmissionResult> {
99+
100+
private Exercise exercise;
101+
private SubmissionResultWaitingDialog dialog;
102+
private TestResultDisplayer resultDisplayer;
103+
104+
private SubmissionCallback(Exercise exercise, SubmissionResultWaitingDialog dialog) {
105+
SubmissionCallback.this.exercise = exercise;
106+
SubmissionCallback.this.dialog = dialog;
107+
SubmissionCallback.this.resultDisplayer = TestResultDisplayer.getInstance();
108+
}
109+
110+
@Override
111+
public void onSuccess(final SubmissionResult result) {
112+
if(result == null){
113+
System.out.println("RESULT ON NULL!!!");
114+
}
115+
SwingUtilities.invokeLater(new Runnable() {
116+
117+
@Override
118+
public void run() {
119+
dialog.close();
120+
final ResultCollector resultCollector = new ResultCollector(exercise);
121+
resultCollector.setValidationResult(result.getValidationResult());
122+
123+
if(result == null){
124+
System.out.println("Result on null");
125+
}
126+
resultDisplayer.showSubmissionResult(exercise, result, resultCollector);
127+
exercise.setAttempted(true);
128+
if (result.isAllTestsPassed()) {
129+
exercise.setCompleted(true);
130+
}
131+
courseDb.save();
132+
new CheckForNewExercisesOrUpdates(true, false).run();
133+
}
134+
135+
});
136+
}
137+
138+
@Override
139+
public void onFailure(final Throwable ex) {
140+
SwingUtilities.invokeLater(new Runnable() {
141+
142+
@Override
143+
public void run() {
144+
Logger log = Logger.getLogger(SubmitExerciseAction.class.getName());
145+
log.log(Level.INFO, "Error waiting for results from server.", ex);
146+
String msg = ServerErrorHelper.getServerExceptionMsg(ex);
147+
dialogs.displayError("Error trying to get test results.", ex);
148+
dialog.close();
149+
}
150+
151+
});
152+
}
153+
154+
}
155+
51156
}
157+

tmc-plugin/src/fi/helsinki/cs/tmc/data/FeedbackAnswer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.gson.Gson;
44
import com.google.gson.JsonObject;
5+
import hy.tmc.core.domain.submission.FeedbackQuestion;
56

67
public class FeedbackAnswer {
78
private FeedbackQuestion question;

tmc-plugin/src/fi/helsinki/cs/tmc/data/serialization/SubmissionResultParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.google.gson.JsonParseException;
1010
import com.google.gson.JsonParser;
1111

12-
import fi.helsinki.cs.tmc.data.SubmissionResult;
12+
import hy.tmc.core.domain.submission.SubmissionResult;
1313
import fi.helsinki.cs.tmc.stylerunner.validation.CheckstyleResult;
1414
import fi.helsinki.cs.tmc.testrunner.StackTraceSerializer;
1515

tmc-plugin/src/fi/helsinki/cs/tmc/exerciseSubmitter/ExerciseSubmitter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import fi.helsinki.cs.tmc.actions.SubmitExerciseAction;
66
import hy.tmc.core.domain.Exercise;
77
import fi.helsinki.cs.tmc.data.ResultCollector;
8-
import fi.helsinki.cs.tmc.data.SubmissionResult;
8+
import hy.tmc.core.domain.submission.SubmissionResult;
99
import fi.helsinki.cs.tmc.events.TmcEvent;
1010
import fi.helsinki.cs.tmc.events.TmcEventBus;
1111
import fi.helsinki.cs.tmc.model.CourseDb;

tmc-plugin/src/fi/helsinki/cs/tmc/model/SubmissionResultWaiter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.google.gson.JsonElement;
44
import com.google.gson.JsonParser;
5-
import fi.helsinki.cs.tmc.data.SubmissionResult;
5+
import hy.tmc.core.domain.submission.SubmissionResult;
66
import fi.helsinki.cs.tmc.data.serialization.SubmissionResultParser;
77
import fi.helsinki.cs.tmc.ui.SubmissionProgressView;
88
import fi.helsinki.cs.tmc.utilities.CancellableCallable;

tmc-plugin/src/fi/helsinki/cs/tmc/ui/SuccessfulSubmissionDialog.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import java.awt.Component;
44
import hy.tmc.core.domain.Exercise;
55
import fi.helsinki.cs.tmc.data.FeedbackAnswer;
6-
import fi.helsinki.cs.tmc.data.FeedbackQuestion;
7-
import fi.helsinki.cs.tmc.data.SubmissionResult;
6+
import hy.tmc.core.domain.submission.FeedbackQuestion;
7+
import hy.tmc.core.domain.submission.SubmissionResult;
88
import fi.helsinki.cs.tmc.ui.feedback.FeedbackQuestionPanel;
99
import fi.helsinki.cs.tmc.ui.feedback.FeedbackQuestionPanelFactory;
1010
import java.awt.Font;

tmc-plugin/src/fi/helsinki/cs/tmc/ui/TestResultDisplayer.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33
import hy.tmc.core.domain.Exercise;
44
import fi.helsinki.cs.tmc.data.FeedbackAnswer;
55
import fi.helsinki.cs.tmc.data.ResultCollector;
6-
import fi.helsinki.cs.tmc.data.SubmissionResult;
6+
import hy.tmc.core.domain.submission.SubmissionResult;
77
import fi.helsinki.cs.tmc.data.TestCaseResult;
8+
import fi.helsinki.cs.tmc.langs.TestResult;
89
import fi.helsinki.cs.tmc.model.ServerAccess;
910
import fi.helsinki.cs.tmc.stylerunner.validation.Strategy;
1011
import fi.helsinki.cs.tmc.utilities.BgTask;
1112
import fi.helsinki.cs.tmc.utilities.BgTaskListener;
1213
import fi.helsinki.cs.tmc.utilities.CancellableCallable;
1314
import fi.helsinki.cs.tmc.utilities.ExceptionUtils;
15+
import hy.tmc.core.domain.submission.TestCase;
1416
import java.awt.Dialog;
1517
import java.awt.event.ActionEvent;
1618
import java.awt.event.ActionListener;
19+
import java.util.ArrayList;
1720
import java.util.List;
1821
import java.util.logging.Level;
1922
import java.util.logging.Logger;
@@ -42,7 +45,7 @@ public static TestResultDisplayer getInstance() {
4245
public void showSubmissionResult(Exercise exercise, SubmissionResult result, final ResultCollector resultCollector) {
4346
switch (result.getStatus()) {
4447
case OK:
45-
displayTestCases(result.getTestCases(), false, resultCollector);
48+
displayTestCases(convertToTestCaseResults(result.getTestCases()) , false, resultCollector);
4649
displaySuccessfulSubmissionMsg(exercise, result);
4750
break;
4851
case FAIL:
@@ -55,6 +58,15 @@ public void showSubmissionResult(Exercise exercise, SubmissionResult result, fin
5558
break;
5659
}
5760
}
61+
62+
private List<TestCaseResult> convertToTestCaseResults(List<TestCase> cases){
63+
List<TestCaseResult> resultList = new ArrayList<TestCaseResult>();
64+
for (TestCase te : cases) {
65+
TestCaseResult testCase = new TestCaseResult(te.getName(), te.isSuccessful(), te.getMessage());
66+
resultList.add(testCase);
67+
}
68+
return resultList;
69+
}
5870

5971
private void displaySuccessfulSubmissionMsg(Exercise exercise, final SubmissionResult result) {
6072
final SuccessfulSubmissionDialog dialog = new SuccessfulSubmissionDialog(exercise, result);
@@ -110,14 +122,14 @@ private void displayFailedTestsMsg(Exercise exercise, SubmissionResult result) {
110122
msg += "There are validation errors.\n";
111123
}
112124

113-
switch (result.getTestResultStatus()) {
114-
case ALL:
125+
switch (result.getStatus()) {
126+
case OK:
115127
msg += "All tests failed on the server.\nSee below.";
116128
break;
117-
case SOME:
129+
case FAIL:
118130
msg += "Some tests failed on the server.\nSee below.";
119131
break;
120-
case NONE:
132+
default:
121133
if (result.validationsFailed()) {
122134
msg += "See below.";
123135
}
@@ -174,8 +186,9 @@ private void clearTestCaseView() {
174186
}
175187

176188
private List<TestCaseResult> maybeAddValdrindToResults(SubmissionResult result) {
177-
String valdrindOutput = result.getValgrindOutput();
178-
List<TestCaseResult> resultList = result.getTestCases();
189+
String valdrindOutput = result.getValgrind();
190+
List<TestCase> testCases = result.getTestCases();
191+
List<TestCaseResult> resultList = convertToTestCaseResults(testCases);
179192

180193
if (StringUtils.isNotBlank(valdrindOutput)) {
181194
TestCaseResult valgrindResult = new TestCaseResult("Valgrind validations", false , "Click show valgrind trace to view valgrind trace", valdrindOutput, true);

tmc-plugin/src/fi/helsinki/cs/tmc/ui/feedback/FeedbackQuestionPanelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package fi.helsinki.cs.tmc.ui.feedback;
22

3-
import fi.helsinki.cs.tmc.data.FeedbackQuestion;
3+
import hy.tmc.core.domain.submission.FeedbackQuestion;
44

55
public class FeedbackQuestionPanelFactory {
66
public static FeedbackQuestionPanel getPanelForQuestion(FeedbackQuestion question) {

0 commit comments

Comments
 (0)