diff options
author | Ryan Campbell <ryanjcampbell@google.com> | 2017-09-11 16:24:09 -0700 |
---|---|---|
committer | Ryan Campbell <ryanjcampbell@google.com> | 2017-09-19 13:37:13 -0700 |
commit | d4265c96d3c4e3dcfe0ffb2ef314317478b16846 (patch) | |
tree | d839ef9db155c5477d29b88df9fa609d351ada7a /src/main/java/com/android/vts/api | |
parent | a9c0f414d5c2e77213e2e21739df96061e5f13cd (diff) | |
download | dashboard-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.java | 150 |
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); + } +} |