1
1
package fi .helsinki .cs .tmc .exerciseSubmitter ;
2
2
3
+ import com .google .common .base .Strings ;
4
+ import com .google .common .util .concurrent .ListenableFuture ;
3
5
import fi .helsinki .cs .tmc .actions .CheckForNewExercisesOrUpdates ;
4
6
import fi .helsinki .cs .tmc .actions .ServerErrorHelper ;
5
7
import fi .helsinki .cs .tmc .actions .SubmitExerciseAction ;
11
13
import fi .helsinki .cs .tmc .model .CourseDb ;
12
14
import fi .helsinki .cs .tmc .model .ProjectMediator ;
13
15
import fi .helsinki .cs .tmc .model .ServerAccess ;
14
- import fi .helsinki .cs .tmc .model .SubmissionResultWaiter ;
15
16
import fi .helsinki .cs .tmc .model .TmcProjectInfo ;
16
17
import fi .helsinki .cs .tmc .model .NbTmcSettings ;
18
+ import fi .helsinki .cs .tmc .model .TmcCoreSingleton ;
17
19
import fi .helsinki .cs .tmc .ui .ConvenientDialogDisplayer ;
18
20
import fi .helsinki .cs .tmc .ui .SubmissionResultWaitingDialog ;
19
21
import fi .helsinki .cs .tmc .ui .TestResultDisplayer ;
20
22
import fi .helsinki .cs .tmc .utilities .BgTask ;
21
23
import fi .helsinki .cs .tmc .utilities .BgTaskListener ;
22
24
import fi .helsinki .cs .tmc .utilities .CancellableCallable ;
23
- import fi .helsinki .cs .tmc .utilities .zip .RecursiveZipper ;
24
-
25
- import java .util .HashMap ;
26
- import java .util .Map ;
27
- import java .util .concurrent .Callable ;
28
25
import java .util .logging .Level ;
29
26
import java .util .logging .Logger ;
30
27
@@ -35,7 +32,9 @@ public class ExerciseSubmitter {
35
32
private static final Logger log = Logger .getLogger (SubmitExerciseAction .class .getName ());
36
33
37
34
public static class InvokedEvent implements TmcEvent {
35
+
38
36
public final TmcProjectInfo projectInfo ;
37
+
39
38
public InvokedEvent (TmcProjectInfo projectInfo ) {
40
39
this .projectInfo = projectInfo ;
41
40
}
@@ -59,8 +58,7 @@ public ExerciseSubmitter() {
59
58
this .eventBus = TmcEventBus .getDefault ();
60
59
}
61
60
62
-
63
- public void performAction (Project ... projects ) {
61
+ public void performAction (Project ... projects ) {
64
62
for (Project nbProject : projects ) {
65
63
TmcProjectInfo tmcProject = projectMediator .wrapProject (nbProject );
66
64
eventBus .post (new InvokedEvent (tmcProject ));
@@ -77,53 +75,48 @@ private void submitProject(final TmcProjectInfo project) {
77
75
projectMediator .saveAllFiles ();
78
76
79
77
// Oh what a mess :/
80
-
81
78
final SubmissionResultWaitingDialog dialog = SubmissionResultWaitingDialog .createAndShow ();
82
79
83
- final BgTaskListener <ServerAccess .SubmissionResponse > submissionListener = new BgTaskListener <ServerAccess .SubmissionResponse >() {
84
- @ Override
85
- public void bgTaskReady (ServerAccess .SubmissionResponse response ) {
86
- final SubmissionResultWaiter waitingTask = new SubmissionResultWaiter (response .submissionUrl .toString (), dialog );
87
- dialog .setTask (waitingTask );
80
+ CancellableCallable <SubmissionResult > submitAndPollTask = new CancellableCallable <SubmissionResult >() {
88
81
89
- BgTask . start ( "Waiting for results from server." , waitingTask , new BgTaskListener <SubmissionResult >() {
82
+ ListenableFuture <SubmissionResult > lf ;
90
83
91
- @ Override
92
- public void bgTaskReady (SubmissionResult result ) {
84
+ @ Override
85
+ public SubmissionResult call () throws Exception {
86
+ lf = TmcCoreSingleton .getInstance ().submit (project .getProjectDirAsPath ());
87
+ return lf .get ();
88
+ }
93
89
94
- dialog .close ();
90
+ @ Override
91
+ public boolean cancel () {
92
+ return lf .cancel (true );
93
+ }
94
+ };
95
95
96
- final ResultCollector resultCollector = new ResultCollector (exercise );
97
- resultCollector .setValidationResult (result .getValidationResult ());
98
- resultDisplayer .showSubmissionResult (exercise , result , resultCollector );
96
+ dialog .setTask (submitAndPollTask );
99
97
100
- // We change exercise state as a first approximation,
101
- // then refresh from the server and potentially notify the user
102
- // as we might have unlocked new exercises.
103
- exercise .setAttempted (true );
98
+ BgTask .start ("Submitting and waiting for results from server." , submitAndPollTask , new BgTaskListener <SubmissionResult >() {
104
99
105
- if (result .getStatus () == SubmissionResult .Status .OK ) {
106
- exercise .setCompleted (true );
107
- }
100
+ @ Override
101
+ public void bgTaskReady (SubmissionResult result ) {
102
+ dialog .close ();
103
+
104
+ final ResultCollector resultCollector = new ResultCollector (exercise );
105
+ resultCollector .setValidationResult (result .getValidationResult ());
106
+ resultDisplayer .showSubmissionResult (exercise , result , resultCollector );
108
107
109
- courseDb .save ();
108
+ // We change exercise state as a first approximation,
109
+ // then refresh from the server and potentially notify the user
110
+ // as we might have unlocked new exercises.
111
+ exercise .setAttempted (true );
110
112
111
- new CheckForNewExercisesOrUpdates (true , false ).run ();
112
- }
113
+ if (result .getStatus () == SubmissionResult .Status .OK ) {
114
+ exercise .setCompleted (true );
115
+ }
113
116
114
- @ Override
115
- public void bgTaskCancelled () {
116
- dialog .close ();
117
- }
117
+ courseDb .save ();
118
118
119
- @ Override
120
- public void bgTaskFailed (Throwable ex ) {
121
- log .log (Level .INFO , "Error waiting for results from server." , ex );
122
- String msg = ServerErrorHelper .getServerExceptionMsg (ex );
123
- dialogDisplayer .displayError ("Error trying to get test results." , ex );
124
- dialog .close ();
125
- }
126
- });
119
+ new CheckForNewExercisesOrUpdates (true , false ).run ();
127
120
}
128
121
129
122
@ Override
@@ -133,41 +126,13 @@ public void bgTaskCancelled() {
133
126
134
127
@ Override
135
128
public void bgTaskFailed (Throwable ex ) {
136
- log .log (Level .INFO , "Error submitting exercise ." , ex );
129
+ log .log (Level .INFO , "Error waiting for results from server ." , ex );
137
130
String msg = ServerErrorHelper .getServerExceptionMsg (ex );
138
- dialogDisplayer .displayError ("Error submitting exercise." , ex );
131
+ if (!Strings .isNullOrEmpty (msg )) {
132
+ dialogDisplayer .displayError ("Error trying to get test results." , ex );
133
+ }
139
134
dialog .close ();
140
135
}
141
- };
142
-
143
- final String errorMsgLocale = settings .getErrorMsgLocale ().toString ();
144
-
145
- BgTask .start ("Zipping up " + exercise .getName (), new Callable <byte []>() {
146
- @ Override
147
- public byte [] call () throws Exception {
148
- RecursiveZipper zipper = new RecursiveZipper (project .getProjectDirAsFile (), project .getZippingDecider ());
149
- return zipper .zipProjectSources ();
150
- }
151
- }, new BgTaskListener <byte []>() {
152
- @ Override
153
- public void bgTaskReady (byte [] zipData ) {
154
- Map <String , String > extraParams = new HashMap <String , String >();
155
- extraParams .put ("error_msg_locale" , errorMsgLocale );
156
-
157
- CancellableCallable <ServerAccess .SubmissionResponse > submitTask = serverAccess .getSubmittingExerciseTask (exercise , zipData , extraParams );
158
- dialog .setTask (submitTask );
159
- BgTask .start ("Sending " + exercise .getName (), submitTask , submissionListener );
160
- }
161
-
162
- @ Override
163
- public void bgTaskCancelled () {
164
- submissionListener .bgTaskCancelled ();
165
- }
166
-
167
- @ Override
168
- public void bgTaskFailed (Throwable ex ) {
169
- submissionListener .bgTaskFailed (ex );
170
- }
171
136
});
172
137
}
173
- }
138
+ }
0 commit comments