HelloDbResponse.java 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package hellowicket;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.util.concurrent.ThreadLocalRandom;
  6. import javax.sql.DataSource;
  7. import org.apache.wicket.request.resource.AbstractResource;
  8. import org.apache.wicket.util.string.StringValue;
  9. import com.fasterxml.jackson.databind.ObjectMapper;
  10. public class HelloDbResponse extends AbstractResource
  11. {
  12. private static final long serialVersionUID = 1L;
  13. private static final int DB_ROWS = 10000;
  14. private static final String CONTENT_TYPE = "application/json";
  15. private static final ObjectMapper mapper = new ObjectMapper();
  16. protected ResourceResponse newResourceResponse(Attributes attributes)
  17. {
  18. final StringValue queriesParam = attributes.getRequest().getQueryParameters().getParameterValue("queries");
  19. int qs = queriesParam.toInt(1);
  20. if (qs < 1)
  21. {
  22. qs = 1;
  23. }
  24. else if (qs > 500)
  25. {
  26. qs = 500;
  27. }
  28. final int queries = qs;
  29. final ResourceResponse response = new ResourceResponse();
  30. response.setContentType(CONTENT_TYPE);
  31. response.setWriteCallback(new WriteCallback()
  32. {
  33. public void writeData(Attributes attributes)
  34. {
  35. try
  36. {
  37. final ThreadLocalRandom random = ThreadLocalRandom.current();
  38. DataSource dataSource = WicketApplication.get().getDataSource();
  39. World[] worlds = new World[queries];
  40. try (Connection connection = dataSource.getConnection())
  41. {
  42. try (PreparedStatement statement = connection.prepareStatement(
  43. "SELECT * FROM World WHERE id = ?",
  44. ResultSet.TYPE_FORWARD_ONLY,
  45. ResultSet.CONCUR_READ_ONLY))
  46. {
  47. for (int i = 0; i < queries; i++)
  48. {
  49. statement.setInt(1, random.nextInt(DB_ROWS) + 1);
  50. try (ResultSet resultSet = statement.executeQuery())
  51. {
  52. resultSet.next();
  53. worlds[i] = new World(
  54. resultSet.getInt("id"),
  55. resultSet.getInt("randomNumber"));
  56. }
  57. }
  58. }
  59. }
  60. String data;
  61. if (queriesParam.isNull())
  62. {
  63. // request to /db should return JSON object
  64. data = HelloDbResponse.mapper.writeValueAsString(worlds[0]);
  65. }
  66. else
  67. {
  68. // request to /db?queries=xyz should return JSON array (issue #648)
  69. data = HelloDbResponse.mapper.writeValueAsString(worlds);
  70. }
  71. attributes.getResponse().write(data);
  72. }
  73. catch (Exception ex)
  74. {
  75. // do nothing
  76. }
  77. }
  78. });
  79. return response;
  80. }
  81. }