-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresponse.xsd
More file actions
250 lines (221 loc) · 10.7 KB
/
response.xsd
File metadata and controls
250 lines (221 loc) · 10.7 KB
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="urn:proforma:response:v0.6"
xmlns:tns="urn:proforma:response:v0.6">
<xs:element name="submission-response">
<xs:complexType>
<xs:sequence>
<!-- The following choice presents two different structure types
for the response format. It is up to the LMS to request the
preferred structure type in the submission format.
-->
<xs:choice>
<xs:element name="merged-test-feedback" type="tns:merged-test-feedback" />
<!-- merged-test-feedback:
Separate feedback items for both the entire submission and individual tests
are merged into a single HTML 'blob'.
-->
<xs:element name="separate-test-feedback" type="tns:separate-test-feedback" />
<!-- separate-test-feedback:
Contains the separate feedback items for the submission and individual tests.
Feedback items are either represented by plain text or HTML fragments.
Evaluating the tests' scores as well as presenting the results to the
student/teacher is done by the LMS.
-->
</xs:choice>
<xs:element name="files" type="tns:files" />
<xs:element name="meta-data" type="tns:meta-data" />
<!-- The meta-data element holds a namespace for the meta-data of each system
(e. g. information about the grader).
-->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="meta-data">
<xs:sequence>
<xs:element name="grader-engine" type="tns:grader-engine" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="grader-engine">
<xs:attribute name="name" use="required" />
<xs:attribute name="version" use="required" />
</xs:complexType>
<xs:complexType name="result">
<xs:sequence>
<xs:element name="score" type="tns:score" />
<xs:element name="validity" minOccurs="0" type="tns:validity" />
</xs:sequence>
<xs:attribute name="is-internal-error" type="xs:boolean" default="false" />
<!-- 'is-internal-error' indicates a system error that should not be attributed to the
student's submission (e. g. a fault with the JUnit test). -->
<!-- Use case example 1: If a test resulted in an internal error, the LMS would
invalidate the entire submission attempt. Since the fault was not with the student's
submission but with the grader/middleware itself, the student should not lose their
submission attempt (if such restrictions are in place). -->
<!-- Use case example 2: The grader is offline and cannot be reached by the middleware. The
middleware responds with a response XML file with 'is-internal-error' set to true and
an error feedback describing the error. -->
<!-- Use case example 3: If an internal-error occurs, send an email to the
person/teacher in charge. -->
</xs:complexType>
<xs:simpleType name="score">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0" />
<xs:maxInclusive value="1.0" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="validity">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0" />
<xs:maxInclusive value="1.0" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="merged-test-feedback">
<xs:sequence>
<xs:element name="overall-result" type="tns:result" />
<xs:element name="student-feedback" type="tns:feedback" minOccurs="0" />
<xs:element name="teacher-feedback" type="tns:feedback" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="separate-test-feedback">
<xs:sequence>
<xs:element name="submission-feedback-list" type="tns:feedback-list" />
<!-- The 'submission-feedback-list' represents the feedback for the entire submission rather
than for individual tests.
Use case examples: the incoming submission XML file was invalid and therefore
rejected. Or: a file was referenced in the taskxml format, but the file was not present in the
ZIP archive.
-->
<xs:element name="tests" type="tns:tests">
<!-- 'tests' contain test-specific test results. -->
<xs:unique name="testid">
<xs:selector xpath=".//tns:test" />
<xs:field xpath="@id" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="tests">
<xs:sequence>
<xs:element name="test" type="tns:test" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="test-result">
<xs:sequence>
<xs:element name="result" type="tns:result" />
<xs:element name="feedback-list" type="tns:feedback-list" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="test">
<xs:choice>
<xs:element name="test-result" type="tns:test-result" />
<xs:element name="subtests" type="tns:subtests">
<xs:unique name="subtestid">
<xs:selector xpath=".//tns:subtest" />
<xs:field xpath="@id" />
</xs:unique>
</xs:element>
</xs:choice>
<xs:attribute name="id" use="required" />
</xs:complexType>
<xs:complexType name="subtests">
<xs:sequence>
<xs:element name="subtest" maxOccurs="unbounded" type="tns:subtest" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="subtest">
<xs:sequence>
<xs:element name="test-result" type="tns:test-result" />
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:string" />
</xs:complexType>
<xs:complexType name="feedback-list">
<xs:sequence>
<xs:element name="student-feedback" minOccurs="0" maxOccurs="unbounded"
type="tns:feedback" />
<xs:element name="teacher-feedback" minOccurs="0" maxOccurs="unbounded"
type="tns:feedback" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="feedback">
<xs:sequence>
<!-- title is plain text. Multiple consecutive whitespaces might be
presented by the LMS as single spaces.
This title does not replace the "displaytitle" of the grading-hints, but
it can be used e. g. to output different sub-titles for teacher or student feedback,
for info or error feedback, etc. -->
<xs:element name="title" minOccurs="0" type="xs:string" />
<!-- title and content are meant to be presented to teachers and students by the LMS
as immediately readable text. Images may be embedded as data uri into content. -->
<xs:element name="content" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="format" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="html" />
<xs:enumeration value="plaintext" />
<!-- content includes preformatted whitespace -->
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="filerefs" type="tns:filerefs" minOccurs="0" />
</xs:sequence>
<xs:attribute name="level" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="debug" />
<xs:enumeration value="info" />
<xs:enumeration value="warn" />
<xs:enumeration value="error" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:complexType name="files">
<xs:sequence>
<xs:element name="file" minOccurs="0" maxOccurs="unbounded"
type="tns:file" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="file">
<xs:choice>
<xs:element name="embedded-file" type="tns:embedded-file" />
<!-- For embedding files in the response XML file.
The element content is the file's content.
The content can be optionally encoded to base64. -->
<xs:element name="attached-file" type="xs:string" />
<!-- For attaching files to a ZIP archive (along with the
response XML file).
The element content is the relative path to the file
in the ZIP archive. -->
</xs:choice>
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="title" type="xs:string" use="required" />
<xs:attribute name="mimetype" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="embedded-file">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="filename" type="xs:string"
use="required" />
<xs:attribute name="is-base64-encoded" type="xs:boolean"
default="false" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="filerefs">
<xs:sequence maxOccurs="unbounded">
<xs:element name="fileref" type="tns:fileref" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="fileref">
<xs:attribute name="refid" type="xs:string" use="required" />
</xs:complexType>
</xs:schema>