Browse Source

Merge pull request #1703 from dashorst/master

Wicket: respond with error code when exception is caught
Mike Smith 10 years ago
parent
commit
231fdbc9b7
1 changed files with 50 additions and 43 deletions
  1. 50 43
      frameworks/Java/wicket/src/main/java/hellowicket/HelloDbResponse.java

+ 50 - 43
frameworks/Java/wicket/src/main/java/hellowicket/HelloDbResponse.java

@@ -3,6 +3,7 @@ package hellowicket;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.concurrent.ThreadLocalRandom;
 
 import javax.sql.DataSource;
@@ -10,6 +11,7 @@ import javax.sql.DataSource;
 import org.apache.wicket.request.resource.AbstractResource;
 import org.apache.wicket.util.string.StringValue;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class HelloDbResponse extends AbstractResource
@@ -28,7 +30,7 @@ public class HelloDbResponse extends AbstractResource
     if (qs < 1)
     {
       qs = 1;
-    } 
+    }
     else if (qs > 500)
     {
       qs = 500;
@@ -38,55 +40,60 @@ public class HelloDbResponse extends AbstractResource
     final ResourceResponse response = new ResourceResponse();
     response.setContentType(CONTENT_TYPE);
 
-    response.setWriteCallback(new WriteCallback()
+    try
     {
-      public void writeData(Attributes attributes)
+      final String data = getDataFromDatabase(queriesParam, queries);
+      response.setWriteCallback(new WriteCallback()
       {
-        try
+        public void writeData(Attributes attributes)
         {
-          final ThreadLocalRandom random = ThreadLocalRandom.current();
-          DataSource dataSource = WicketApplication.get().getDataSource();
-          World[] worlds = new World[queries];
-          try (Connection connection = dataSource.getConnection())
-          {
-            try (PreparedStatement statement = connection.prepareStatement(
-                       "SELECT * FROM World WHERE id = ?",
-                       ResultSet.TYPE_FORWARD_ONLY,
-                       ResultSet.CONCUR_READ_ONLY))
-            {
-              for (int i = 0; i < queries; i++)
-              {
-                  statement.setInt(1, random.nextInt(DB_ROWS) + 1);
-                  try (ResultSet resultSet = statement.executeQuery())
-                  {
-                      resultSet.next();
-                      worlds[i] = new World(
-                              resultSet.getInt("id"),
-                              resultSet.getInt("randomNumber"));
-                  }
-              }
-            }
-          }
-
-          String data;
-          if (queriesParam.isNull())
-          {
-              // request to /db should return JSON object
-              data = HelloDbResponse.mapper.writeValueAsString(worlds[0]);
-          }
-          else
-          {
-              // request to /db?queries=xyz should return JSON array (issue #648)
-              data = HelloDbResponse.mapper.writeValueAsString(worlds);
-          }
           attributes.getResponse().write(data);
         }
-        catch (Exception ex)
+      });
+    }
+    catch (Exception ex)
+    {
+      response.setContentType("text/plain");
+      response.setError(500, ex.getClass().getSimpleName() + ": " + ex.getMessage());
+      ex.printStackTrace();
+    }
+    return response;
+  }
+
+  private String getDataFromDatabase(final StringValue queriesParam, final int queries)
+      throws SQLException, JsonProcessingException
+  {
+    final ThreadLocalRandom random = ThreadLocalRandom.current();
+    DataSource dataSource = WicketApplication.get().getDataSource();
+    World[] worlds = new World[queries];
+    try (Connection connection = dataSource.getConnection())
+    {
+      try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM World WHERE id = ?",
+          ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY))
+      {
+        for (int i = 0; i < queries; i++)
         {
-          // do nothing
+          statement.setInt(1, random.nextInt(DB_ROWS) + 1);
+          try (ResultSet resultSet = statement.executeQuery())
+          {
+            resultSet.next();
+            worlds[i] = new World(resultSet.getInt("id"), resultSet.getInt("randomNumber"));
+          }
         }
       }
-    });
-    return response;
+    }
+
+    String data;
+    if (queriesParam.isNull())
+    {
+      // request to /db should return JSON object
+      data = HelloDbResponse.mapper.writeValueAsString(worlds[0]);
+    }
+    else
+    {
+      // request to /db?queries=xyz should return JSON array (issue #648)
+      data = HelloDbResponse.mapper.writeValueAsString(worlds);
+    }
+    return data;
   }
 }