1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Frida Hjelm aa2394bf66 Update README with solution documentation 6 months ago
standalone Initial commit 6 months ago
webapp Remove unused GET handling from /echo endpoint 6 months ago
.gitignore Initial commit 6 months ago
README.md Update README with solution documentation 6 months ago
build.sh Initial commit 6 months ago
pom.xml Initial commit 6 months ago

README.md

Solution to the Java exercise for the backend recruiting process

Running the application

  1. Make sure you have a working Java development environment. The Maven configuration of the boilerplate requires at least Java 11.
  2. Clone this repository and don't fork as your code would be visible to other candidates in case you choose to push your implementation to a public repository.
  3. Compile by executing ./build.sh.
  4. After successful compilation execute ./standalone/jetty/target/dist/bin/rest. It launches a REST API and listens on port 8282.
  5. Test the API by fetching data from the status resource by executing curl http://localhost:8282/status.
  6. If any of the above fails you need to revisit your development environment or talk to hannes@metasolutions.se (it may be a bug).

Exercise

  1. Implement a new resource /echo that responds with the request body when posting (HTTP POST) to it; it should simply mirror the request back as response.
  2. Add content negotiation to the echo resource and convert the payload: if the request is made with MIME type text/csv (i.e., Content-Type: text/csv), and the response is expected to be delivered in text/html (i.e., Accept: text/html), then convert from CSV to a simple HTML table. Very basic handling of the CSV payload (use the snippet from the next section) is sufficient, you don't need to use third party libraries to handle advanced CSVs with apostrophes, line breaks, etc.. Only requests with Content-Type: text/csv and Accept: text/html need to trigger a conversion, all other requests should behave as described in 1. above.

Bonus for the Linked Data experienced:

  1. Add support for the output format Turtle (the RDF Turtle serialization format) to the echo resource (triggered by Accept: text/turtle). Use appropriate properties from the Dublin Core Terms metadata specification to map the CSV data to Turtle.

CSV snippet

title,description,created
Important document,This is an important document,2022-03-31
Less important document,,2022-03-31
Last document,,

Questions

If anything is unclear or if you get stuck somewhere in the exercise, do not hesitate to contact Hannes for advice.

Result

Document your implementation in Text or Markdown format and send it along with your code as a tar.gz archive to Hannes. You can also send a link to a Git repository.

Solution

The /echo endpoint will convert any data posted with Content-Type: text/csv and Accept: text/html to a simple html table. All other data will be echoed back unchanged. Empty datasets will return an explanatory message.

  • RestApplication.java
    • New router added for path /echo
  • resources/EchoResource.java
    • POST requests are handled depending on Content-Type. CSV-data is handled by the tablify method, all others by the echo method
    • The tablify method:
      • Checks for Accept: text/html to determine if table conversion should be performed. Requests that do not match are treated like other Content-Types.
      • Assumes the CSV format in the example.
      • Returns an explanatory string if POST data is missing or cannot be parsed.

Example use

$ cat test.csv 
title,description,created
Important document,This is an important document,2022-03-31
Less important document,,2022-03-31
Last document,,
$ curl -H 'Content-Type: text/csv' -H 'Accept: text/html' -X POST --data-binary @test.csv http://localhost:8282/echo                  
<table>
<tr>
<td>title</td>
<td>description</td>
<td>created</td>
</tr>
<tr>
<td>Important document</td>
<td>This is an important document</td>
<td>2022-03-31</td>
</tr>
<tr>
<td>Less important document</td>
<td></td>
<td>2022-03-31</td>
</tr>
<tr>
<td>Last document</td>
<td></td>
<td></td>
</tr>
</table>
$ curl -X POST -d "Example string" http://localhost:8282/echo
Example string