forked from pc2ccs/pc2v9
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RemoteRunSubmitter.java
220 lines (185 loc) · 7.83 KB
/
RemoteRunSubmitter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// Copyright (C) 1989-2019 PC2 Development Team: John Clevenger, Douglas Lane, Samir Ashoo, and Troy Boudreau.
package edu.csus.ecs.pc2.shadow;
import java.security.InvalidParameterException;
import java.util.Arrays;
import java.util.List;
import edu.csus.ecs.pc2.core.IInternalController;
import edu.csus.ecs.pc2.core.list.AccountComparator;
import edu.csus.ecs.pc2.core.model.Account;
import edu.csus.ecs.pc2.core.model.ClientId;
import edu.csus.ecs.pc2.core.model.IFile;
import edu.csus.ecs.pc2.core.model.IInternalContest;
import edu.csus.ecs.pc2.core.model.Language;
import edu.csus.ecs.pc2.core.model.Problem;
import edu.csus.ecs.pc2.core.model.SerializedFile;
/**
* This class is used to submit runs, obtained from a remote CCS being shadowed by this instance of PC2,
* to the local PC2 server.
*
* The class is instantiated with a PC2 Controller ({@link IInternalController}) which it uses to submit
* the run to the local server.
*
*
* @author [email protected]
*
*/
public class RemoteRunSubmitter {
private IInternalController controller;
private IInternalContest contest;
private int thisSiteNumber;
public RemoteRunSubmitter(IInternalController controller) {
this.controller = controller;
this.contest = controller.getContest();
this.thisSiteNumber = contest.getSiteNumber();
}
/**
* Submit a run to the server.
*
* @param clientIdString - "teamN" client name
* @param problemID - problem id
* @param languageID - CLICS language id
* @param mainFile - main file name
* @param auxFiles - other submittted files
* @param overrideTimeMS - override submission time in MS
* @param overrideRunId - override run id
*/
public void submitRun(String clientIdString, String problemID, String languageID, IFile mainFile, List<IFile> auxFiles, long overrideTimeMS, long overrideRunId) {
submitRun(clientIdString, problemID, languageID, null, mainFile, auxFiles, overrideTimeMS, overrideRunId);
}
/**
* Submit a run to the server.
*
* @param clientIdString - "teamN" client name
* @param problemID - problem id
* @param languageID - CLICS language id
* @param entry_point - entry point, null if default or none
* @param mainFile - main file name
* @param auxFiles - other submittted files
* @param overrideTimeMS - override submission time in MS
* @param overrideRunId - override run id
*/
public void submitRun(String clientIdString, String problemID, String languageID, String entry_point, IFile mainFile, List<IFile> auxFiles, long overrideTimeMS, long overrideRunId) {
isEmptyString(clientIdString, "ClientId parameter is null");
isEmptyString(problemID, "Parameter problemID is null or empty");
isEmptyString(languageID, "Parameter languageID is null or empty");
isEmpty(mainFile, "Parameter mainFile is null");
if (mainFile == null)
{
throw new InvalidParameterException("Parameter mainFile is null");
}
if (overrideRunId <= 0)
{
throw new InvalidParameterException("Parameter overrideRunId has invalid id. " + overrideRunId + " <= 0");
}
/**
* Verify input fields
*/
if (contest == null) {
throw new RuntimeException("contest field is null");
}
Account account = getSubmitterId(contest, clientIdString.trim());
if (account == null) {
throw new InvalidParameterException("Parameter clientIdString does not match any pc2 account: '" + clientIdString + "'");
}
ClientId submitter = account.getClientId();
Problem problem = getProblemByName(contest, problemID);
isEmpty(problem, "Parameter problemID does not match any pc2 problem: '" + problemID + "'");
// Language language = getLanguageByName(contest, languageID);
// Language language = getLanguageByID(contest, languageID);
Language language = getLanguageByCLICSID(contest, languageID);
if (language == null){
language = getLanguageByName(contest, languageID);
}
isEmpty(language, "Parameter languageID does not match any pc2 language: '" + languageID + "'");
SerializedFile mainSubmissionFile = new SerializedFile(mainFile);
SerializedFile[] additionalFiles = new SerializedFile[0];
if (auxFiles != null) {
additionalFiles = new SerializedFile[auxFiles.size()];
for (int i = 0; i < auxFiles.size(); i++) {
isEmpty(auxFiles.get(i), "Aux file in list is empty, index = " + i);
additionalFiles[i] = new SerializedFile(auxFiles.get(i));
}
}
controller.submitRun(submitter, problem, language, entry_point, mainSubmissionFile, additionalFiles, overrideTimeMS, overrideRunId);
}
private Language getLanguageByName(IInternalContest contest2, String languageName) {
Language outLang = null;
Language[] languages = contest.getLanguages();
for (Language language : languages) {
if (language.getDisplayName().trim().equals(languageName.trim())) {
outLang = language;
}
}
return outLang;
}
private Language getLanguageByCLICSID(IInternalContest contest2, String languageName) {
Language outLang = null;
Language[] languages = contest.getLanguages();
for (Language language : languages) {
if (language.getID().trim().equals(languageName.trim())) {
outLang = language;
}
}
return outLang;
}
private Problem getProblemByName(IInternalContest contest2, String problemName) {
Problem outProblem = null;
Problem[] problems = contest.getProblems();
for (Problem problem : problems) {
if (problem.getShortName().trim().equals(problemName.trim())) {
outProblem = problem;
}
}
return outProblem;
}
/**
* Return account for input client id.
*
* Searches local site's accounts first, then all site's accounts.
* Will prepend "team" onto client id if client id string not found.
*
* @param contest2
* @param clientIdString
* @return null if no account found, else the account.
*/
private Account getSubmitterId(IInternalContest internalContest, String clientIdString) {
Account[] accounts = internalContest.getAccounts();
// search for this site's logins first
for (Account account : accounts) {
if (account.getSiteNumber() == thisSiteNumber) {
if (account.getClientId().getName().equals(clientIdString) ||
account.getAliasName().equals(clientIdString)) {
return account;
}
if (account.getClientId().getName().equals("team" + clientIdString)) {
return account;
}
}
}
// Sort by site, type then id.
Arrays.sort(accounts, new AccountComparator());
// search all site's logins
for (Account account : accounts) {
if (account.getClientId().getName().equals(clientIdString) ||
account.getAliasName().equals(clientIdString)) {
return account;
}
if (account.getClientId().getName().equals("team" + clientIdString)) {
return account;
}
}
return null;
}
private void isEmpty(Object obj, String message) {
if (obj == null)
{
throw new InvalidParameterException(message);
}
}
private void isEmptyString(String s, String message) {
if (s == null || s.trim().length() == 0)
{
throw new InvalidParameterException(message);
}
}
}