summaryrefslogtreecommitdiff
path: root/src/main/java/com/android/vts/api
diff options
context:
space:
mode:
authorRyan Campbell <ryanjcampbell@google.com>2017-09-11 16:24:09 -0700
committerRyan Campbell <ryanjcampbell@google.com>2017-09-19 13:37:13 -0700
commitd4265c96d3c4e3dcfe0ffb2ef314317478b16846 (patch)
treed839ef9db155c5477d29b88df9fa609d351ada7a /src/main/java/com/android/vts/api
parenta9c0f414d5c2e77213e2e21739df96061e5f13cd (diff)
downloaddashboard-d4265c96d3c4e3dcfe0ffb2ef314317478b16846.tar.gz
Create a REST servlet for reading/writing acks.
Create a REST servlet which can read all acknowledgements and receive new/updated acknowledgements. Test: $.post('/api/test_acknowledgements', JSON.stringify({'testName': 'VtsHalLight', 'branches' : ['branch1']})) in browser Bug: 65208372 Change-Id: I8cbba4a6d1e73b7d161f857386528e056a676fea
Diffstat (limited to 'src/main/java/com/android/vts/api')
-rw-r--r--src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java b/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java
new file mode 100644
index 0000000..309c3e2
--- /dev/null
+++ b/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you
+ * may not use this file except in compliance with the License. You may
+ * obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.vts.api;
+
+import com.android.vts.entity.TestAcknowledgmentEntity;
+import com.android.vts.util.DatastoreHelper;
+import com.google.appengine.api.datastore.DatastoreFailureException;
+import com.google.appengine.api.datastore.DatastoreService;
+import com.google.appengine.api.datastore.DatastoreServiceFactory;
+import com.google.appengine.api.datastore.DatastoreTimeoutException;
+import com.google.appengine.api.datastore.Entity;
+import com.google.appengine.api.datastore.Key;
+import com.google.appengine.api.datastore.KeyFactory;
+import com.google.appengine.api.datastore.Query;
+import com.google.appengine.api.datastore.Transaction;
+import com.google.appengine.api.users.User;
+import com.google.appengine.api.users.UserService;
+import com.google.appengine.api.users.UserServiceFactory;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.ConcurrentModificationException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** Servlet for handling requests to fetch test acknowledgments. */
+public class TestAcknowledgmentRestServlet extends HttpServlet {
+ protected static final Logger logger =
+ Logger.getLogger(TestAcknowledgmentRestServlet.class.getName());
+
+ /** Read all test acknowledgments. */
+ @Override
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
+
+ Query ackQuery = new Query(TestAcknowledgmentEntity.KIND);
+ List<JsonObject> testAcks = new ArrayList<>();
+ for (Entity ackEntity :
+ datastore.prepare(ackQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) {
+ TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromEntity(ackEntity);
+ if (ack == null) continue;
+ testAcks.add(ack.toJson());
+ }
+ response.setContentType("application/json");
+ PrintWriter writer = response.getWriter();
+ writer.print(new Gson().toJson(testAcks));
+ writer.flush();
+ }
+
+ /** Create a test acknowledgment. */
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+ UserService userService = UserServiceFactory.getUserService();
+ if (!userService.isUserAdmin()) {
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ User currentUser = userService.getCurrentUser();
+ DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
+
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = new BufferedReader(request.getReader());
+ String str;
+ while ((str = br.readLine()) != null) {
+ sb.append(str);
+ }
+ JsonObject json;
+ try {
+ json = new JsonParser().parse(sb.toString()).getAsJsonObject();
+ } catch (IllegalStateException e) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromJson(currentUser, json);
+ Transaction txn = datastore.beginTransaction();
+ try {
+ Key key = datastore.put(ack.toEntity());
+ txn.commit();
+
+ response.setContentType("application/json");
+ PrintWriter writer = response.getWriter();
+ writer.print(new Gson().toJson(KeyFactory.keyToString(key)));
+ writer.flush();
+ } catch (ConcurrentModificationException
+ | DatastoreFailureException
+ | DatastoreTimeoutException e) {
+ txn.rollback();
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ } finally {
+ if (txn.isActive()) {
+ logger.log(Level.WARNING, "Transaction rollback forced acknowledgment post.");
+ txn.rollback();
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ }
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+
+ /** Remove a test acknowledgment. */
+ @Override
+ public void doDelete(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+ UserService userService = UserServiceFactory.getUserService();
+ if (!userService.isUserAdmin()) {
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
+ String stringKey = request.getPathInfo();
+ if (stringKey == null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ if (stringKey.startsWith("/")) {
+ stringKey = stringKey.substring(1);
+ }
+ Key key = KeyFactory.stringToKey(stringKey);
+ if (!key.getKind().equals(TestAcknowledgmentEntity.KIND)) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ datastore.delete(key);
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+}