EvOwl is a Spring Boot web application with a bundled frontend under src/main/webapp.
First time setting up — Start with the End-to-End Setup guide, which walks through both repos in the right order. This README documents webapp-specific configuration keys, the built-in metric pages, and how to add terminology for a new language.
- Java 8
- Maven
- Node.js and npm
- MySQL Server running locally or remotely.
- Download / install MySQL Community Server (Version >= 9.0.0): https://dev.mysql.com/downloads/mysql/ (installation guide: https://dev.mysql.com/doc/refman/8.0/en/installing.html)
- Optional but recommended — MySQL Workbench, a GUI for browsing and verifying the data loaded by this tool: https://dev.mysql.com/downloads/workbench/
All keys live in config/application.properties.
| Key | Description |
|---|---|
spring.datasource.url |
MySQL JDBC URL. The database name is the segment after :3306/ and before ?. Must match evowl.instructor-tool.db-name and the instructor tool's --db. |
spring.datasource.username |
MySQL username. |
spring.datasource.password |
MySQL password. |
evowl.instructor-tool.db-name |
Shared database name. Must match the instructor tool. |
evowl.instructor-tool.jar-path |
Path to the built instructor-tool jar the webapp shells out to. |
server.ssl.key-store-password |
Password for the PKCS12 keystore at config/keystore.p12. |
server.port |
HTTPS port. Default: 8444. |
evowl.fetch-endpoint |
Host and port the compiled frontend bundle calls (e.g. https://your-host:8444). Changing this requires rebuilding the frontend. |
lti.instance |
LTI Consumer Key from the Canvas app configuration. |
lti.secret |
LTI Shared Secret from the Canvas app configuration. |
The instructor CLI tool (evowl-instructor-tool) loads rosters, groups, assignments, grades, and more. Run it before the webapp to populate the database. See the End-to-End Setup guide for the full sequenced walkthrough.
Which metric pages appear during peer grading is controlled entirely by the criteria defined in the instructor tool's assignment config. See the instructor tool for how to create and configure assignments.
Built-in metric pages — The webapp includes interactive metric pages for five built-in criteria. A built-in page is shown whenever a criterion's name field (after stripping HTML tags) contains one of the following keywords (case-insensitive):
| Keyword | Page shown |
|---|---|
modularity |
Modularity & Cohesion |
decoupling |
Decoupling |
encapsulation |
Encapsulation & Interfaces |
clarity |
Clarity |
robustness |
Robustness |
To disable a built-in page, simply omit the criterion with that keyword from the assignment config.
Custom (generic) metric pages — Any criterion whose name does not match a built-in keyword gets a generic (blank) metric page: two code editors and comparison controls, but no automated metrics in the sidebar. To add one, include a criterion in the config whose name does not contain any of the keywords above.
See the instructor tool for more information on configuring criteria displayed.
Terminology (e.g. "struct" vs "class", "package" vs "module") is managed by LanguageTerminology in src/main/webapp/src/editor/peerGradingInfo.ts.
Step 1 — Implement a subclass in peerGradingInfo.ts:
export class MyLangLanguageTerminology extends LanguageTerminology {
constructor(criteriaQuestions: Record<string, string>) {
super(criteriaQuestions);
}
// implement all abstract methods: structLabel, functionLabel,
// peerInstructions, taInstructions, structPrefix, functionPrefix,
// fileGroupMethod, showStructArgumentShouldBeInterface,
// cannotBeDecoupledMessage, moduleSRLabel, functionSRLabel,
// resolvedOrReturnedPercent, resolvedNorReturnedCheckbox
}Step 2 — In src/main/webapp/main.ts, inside makeGradingInfo, replace the return statement:
// Before:
return new GoOrTsPeerGradingInfo(isGo ? "go" : "typescript", criteriaQuestions);
// After (return your terminology instead):
return new MyLangPeerGradingInfo(criteriaQuestions);GoOrTsLanguageTerminology in peerGradingInfo.ts is the existing implementation for Go and TypeScript, use it as a reference.
This project owes its success to the following contributors:
Praise Mayor
Adam Tillou
Scott Rixner
Rebecca Schreib
Luisa Martinez
Lily Gao
Arantxa Pacheco