HelloDbResponse.java 2.9 KB

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