changeset 215:554b822def15

Unify common web service service code part 2 This code gets rid of MongoStorageHandler entirely, and enhances MongoExecutor to handle all cases. The common code is simpler. At this point, almost any GET request (except for jvms/tree, which has its own implementation) can return metadata and handle pagination. Reviewed-by: sgehwolf Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-July/024279.html
author Simon Tooke <stooke@redhat.com>
date Tue, 25 Jul 2017 14:26:07 -0400
parents d9afe9c11b06
children 638f67045739
files common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/MongoStorageHandler.java common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/executor/MongoExecutor.java common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/servlet/MongoHttpHandlerHelper.java services/jvms/src/main/java/com/redhat/thermostat/gateway/service/jvms/mongo/JvmInfoMongoStorageHandler.java
diffstat 4 files changed, 81 insertions(+), 234 deletions(-) [+]
line wrap: on
line diff
--- a/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/MongoStorageHandler.java	Tue Jul 25 11:21:41 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*
- * Copyright 2012-2017 Red Hat, Inc.
- *
- * This file is part of Thermostat.
- *
- * Thermostat is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * Thermostat is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Thermostat; see the file COPYING.  If not see
- * <http://www.gnu.org/licenses/>.
- *
- * Linking this code with other modules is making a combined work
- * based on this code.  Thus, the terms and conditions of the GNU
- * General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of this code give
- * you permission to link this code with independent modules to
- * produce an executable, regardless of the license terms of these
- * independent modules, and to copy and distribute the resulting
- * executable under terms of your choice, provided that you also
- * meet, for each linked independent module, the terms and conditions
- * of the license of that module.  An independent module is a module
- * which is not derived from or based on this code.  If you modify
- * this code, you may extend this exception to your version of the
- * library, but you are not obligated to do so.  If you do not wish
- * to do so, delete this exception statement from your version.
- */
-
-package com.redhat.thermostat.gateway.common.mongodb;
-
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Projections.exclude;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static com.redhat.thermostat.gateway.common.mongodb.filters.MongoRequestFilters.buildAnd;
-import static com.redhat.thermostat.gateway.common.mongodb.filters.MongoRequestFilters.buildEq;
-
-import java.util.Arrays;
-import java.util.List;
-
-import com.redhat.thermostat.gateway.common.mongodb.filters.MongoQuery;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.CursorType;
-import com.mongodb.DBObject;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.util.JSON;
-import com.redhat.thermostat.gateway.common.mongodb.filters.MongoRequestFilters;
-import com.redhat.thermostat.gateway.common.mongodb.filters.MongoSortFilters;
-import com.redhat.thermostat.gateway.common.mongodb.response.MongoResponseBuilder;
-
-public class MongoStorageHandler {
-
-    private static final String SET_FIELD_NAME = "set";
-
-    private final MongoResponseBuilder.Builder mongoResponseBuilder = new MongoResponseBuilder.Builder();
-
-    public String getMany(MongoCollection<Document> collection, String queries, Integer limit, Integer offset, String sort, String includes, String excludes) {
-        final MongoQuery query = queries == null ? null : new MongoQuery(MongoRequestFilters.buildQueriesFilter(queries));
-        return getMany(collection, query, limit, offset, sort, includes, excludes);
-    }
-
-    public String getMany(MongoCollection<Document> collection, Bson query, Integer limit, Integer offset, String sort, String includes, String excludes) {
-        FindIterable<Document> documents = query == null ? collection.find() : collection.find(query);
-        documents = buildProjection(documents, includes, excludes);
-        final Bson sortObject = MongoSortFilters.createSortObject(sort);
-        documents = documents.sort(sortObject).limit(limit).skip(offset).batchSize(limit).cursorType(CursorType.NonTailable);
-        return mongoResponseBuilder.addQueryDocuments(documents).build();
-    }
-
-    private FindIterable<Document> buildProjection(FindIterable<Document> documents, String includes, String excludes) {
-        if (excludes != null) {
-            List<String> excludesList = Arrays.asList(excludes.split(","));
-            documents = documents.projection(fields(exclude(excludesList), excludeId()));
-        } else if (includes != null) {
-            List<String> includesList = Arrays.asList(includes.split(","));
-            documents = documents.projection(fields(include(includesList), excludeId()));
-        } else {
-            documents = documents.projection(excludeId());
-        }
-
-        return documents;
-    }
-
-    public void addSystemObjects(MongoCollection<DBObject> collection, String systemId, String body) {
-        if (body.length() > 0) {
-            List<DBObject> inputList = (List<DBObject>) JSON.parse(body);
-            for (DBObject o : inputList) {
-                o.put(ThermostatFields.SYSTEM_ID, systemId);
-            }
-            collection.insertMany(inputList);
-        }
-    }
-
-    public void addJvmObjects(MongoCollection<DBObject> collection, String systemId, String jvmId, String body) {
-        if (body.length() > 0) {
-            List<DBObject> inputList = (List<DBObject>) JSON.parse(body);
-            for (DBObject o : inputList) {
-                o.put(ThermostatFields.SYSTEM_ID, systemId);
-                o.put(ThermostatFields.JVM_ID, jvmId);
-            }
-            collection.insertMany(inputList);
-        }
-    }
-
-    public void deleteMany(MongoCollection<Document> collection, Bson query) {
-        collection.deleteMany(query);
-    }
-
-    public void updateOneSystemObject(MongoCollection<Document> collection, final String systemId, String queries, String body) {
-        Bson sysQuery = buildEq(ThermostatFields.SYSTEM_ID, systemId);
-        Bson query  = buildAnd(sysQuery, MongoRequestFilters.buildQueriesFilter(queries));
-
-        BasicDBObject inputObject = (BasicDBObject) JSON.parse(body);
-        BasicDBObject setObject = (BasicDBObject) inputObject.get(SET_FIELD_NAME);
-
-        if (setObject.containsField(ThermostatFields.SYSTEM_ID)) {
-            throw new UnsupportedOperationException("Updating " + ThermostatFields.SYSTEM_ID + " field is not allowed");
-        }
-
-        final Bson fields = new Document("$set", setObject);
-
-        collection.updateMany(query, fields);
-    }
-
-    public void updateOneJvmObject(MongoCollection<Document> collection, final String systemId, final String jvmId, String queries, String body) {
-        Bson sysQuery = buildEq(ThermostatFields.SYSTEM_ID, systemId);
-        Bson jvmQuery = buildEq(ThermostatFields.JVM_ID, jvmId);
-        Bson query  = buildAnd(buildAnd(sysQuery, jvmQuery), MongoRequestFilters.buildQueriesFilter(queries));
-
-        BasicDBObject inputObject = (BasicDBObject) JSON.parse(body);
-        BasicDBObject setObject = (BasicDBObject) inputObject.get(SET_FIELD_NAME);
-
-        if (setObject.containsField(ThermostatFields.SYSTEM_ID)) {
-            throw new UnsupportedOperationException("Updating " + ThermostatFields.SYSTEM_ID + " field is not allowed");
-        }
-        if (setObject.containsField(ThermostatFields.JVM_ID)) {
-            throw new UnsupportedOperationException("Updating " + ThermostatFields.JVM_ID + " field is not allowed");
-        }
-        final Bson fields = new Document("$set", setObject);
-
-        collection.updateMany(query, fields);
-    }
-}
--- a/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/executor/MongoExecutor.java	Tue Jul 25 11:21:41 2017 -0400
+++ b/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/executor/MongoExecutor.java	Tue Jul 25 14:26:07 2017 -0400
@@ -47,7 +47,7 @@
 import java.util.List;
 import java.util.Set;
 
-import com.redhat.thermostat.gateway.common.mongodb.MongoStorageHandler;
+import com.redhat.thermostat.gateway.common.mongodb.ThermostatFields;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 
@@ -87,8 +87,9 @@
     }
 
     public MongoDataResultContainer execPutRequest(MongoCollection<Document> collection, String body,
-                                                   String queries, Set<String> realms) throws IOException {
-        return execPutRequest(collection, body, buildClientQueries(queries), realms);
+                                                   String queries, Set<String> realms, String systemId, String jvmId) throws IOException {
+        List<String> queryList = buildClientQueries(queries, systemId, jvmId);
+        return execPutRequest(collection, body, queryList, realms);
     }
 
     public MongoDataResultContainer execPutRequest(MongoCollection<Document> collection, String body,
@@ -98,6 +99,9 @@
 
         Document setDocument = inputDocument.get("set", Document.class);
         setDocument.remove(KeycloakFields.REALMS_KEY);
+        setDocument.remove(ThermostatFields.SYSTEM_ID);
+        setDocument.remove(ThermostatFields.JVM_ID);
+
         final Bson fields = new Document("$set", setDocument);
 
         final Bson bsonQueries = MongoRequestFilters.buildQuery(queries, realms);
@@ -115,7 +119,7 @@
         return execDeleteRequest(collection, buildClientQueries(queries), realms);
     }
 
-    public MongoDataResultContainer execDeleteRequest(MongoCollection<Document> collection, List<String> queries,
+    private MongoDataResultContainer execDeleteRequest(MongoCollection<Document> collection, List<String> queries,
                                                       Set<String> realms) {
         MongoDataResultContainer metaDataContainer = new MongoDataResultContainer();
         if (queries != null && !queries.isEmpty() || realms != null && !realms.isEmpty()) {
@@ -131,7 +135,7 @@
     }
 
     public MongoDataResultContainer execPostRequest(MongoCollection<DBObject> collection, String body,
-                                                    Set<String> realms) {
+                                                    Set<String> realms, String systemId, String jvmId) {
         MongoDataResultContainer metaDataContainer = new MongoDataResultContainer();
 
         if (body.length() > 0) {
@@ -142,7 +146,12 @@
                 if (realms != null && !realms.isEmpty())  {
                     object.put(KeycloakFields.REALMS_KEY, realms);
                 }
-
+                if (systemId != null && !systemId.isEmpty()) {
+                    object.put(ThermostatFields.SYSTEM_ID, systemId);
+                }
+                if (jvmId != null && !jvmId.isEmpty()) {
+                    object.put(ThermostatFields.JVM_ID, jvmId);
+                }
             }
 
             collection.insertMany(inputList);
@@ -151,6 +160,10 @@
         return metaDataContainer;
     }
 
+    private List<String> buildClientQueries(String queries, String systemId, String jvmId) throws IOException {
+        return buildClientQueries(andSystemIdJvmIdQuery(queries, systemId, jvmId));
+    }
+
     private List<String> buildClientQueries(String queries) throws IOException {
         if (queries != null) {
             List<String> queriesList = Arrays.asList(queries.split(","));
@@ -179,4 +192,22 @@
 
         return documents;
     }
+
+    private String andSystemIdJvmIdQuery(final String originalQuery, final String systemId, final String jvmId) {
+        if (jvmId == null || jvmId.isEmpty()) {
+            final String sysQuery = (isNullOrEmpty(systemId) ? null : ThermostatFields.SYSTEM_ID + "==\"" + systemId + '"');
+            if (sysQuery == null) {
+                return originalQuery;
+            }
+            return isNullOrEmpty(originalQuery) ? sysQuery : sysQuery + ',' + originalQuery;
+        } else {
+            final String jvmQuery = ThermostatFields.JVM_ID + "==\"" + jvmId ;
+            final String sysJvmQuery = jvmQuery + (isNullOrEmpty(systemId) ? "" : ',' + ThermostatFields.SYSTEM_ID + "==\"" + systemId + '"');
+            return isNullOrEmpty(originalQuery) ? sysJvmQuery : sysJvmQuery + ',' + originalQuery;
+        }
+    }
+
+    private final boolean isNullOrEmpty(final String s) {
+        return s == null || s.isEmpty();
+    }
 }
\ No newline at end of file
--- a/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/servlet/MongoHttpHandlerHelper.java	Tue Jul 25 11:21:41 2017 -0400
+++ b/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/servlet/MongoHttpHandlerHelper.java	Tue Jul 25 14:26:07 2017 -0400
@@ -39,14 +39,12 @@
 import com.mongodb.DBObject;
 import com.mongodb.MongoTimeoutException;
 import com.mongodb.MongoWriteException;
+
 import com.redhat.thermostat.gateway.common.core.auth.keycloak.RealmAuthorizer;
-import com.redhat.thermostat.gateway.common.mongodb.MongoStorageHandler;
 import com.redhat.thermostat.gateway.common.mongodb.ThermostatFields;
 import com.redhat.thermostat.gateway.common.mongodb.ThermostatMongoStorage;
 import com.redhat.thermostat.gateway.common.mongodb.executor.MongoDataResultContainer;
 import com.redhat.thermostat.gateway.common.mongodb.executor.MongoExecutor;
-import com.redhat.thermostat.gateway.common.mongodb.filters.MongoQuery;
-import com.redhat.thermostat.gateway.common.mongodb.filters.MongoRequestFilters;
 import com.redhat.thermostat.gateway.common.mongodb.response.MongoMetaDataGenerator;
 import com.redhat.thermostat.gateway.common.mongodb.response.MongoMetaDataResponseBuilder;
 import com.redhat.thermostat.gateway.common.mongodb.response.MongoResponseBuilder;
@@ -67,7 +65,6 @@
 
     private final String collectionName;
     private final MongoExecutor mongoExecutor = new MongoExecutor();
-    private final MongoStorageHandler mongoStorageHandler = new MongoStorageHandler();
     private final HttpResponseExceptionHandler exceptionHandler = new HttpResponseExceptionHandler();
 
     public MongoHttpHandlerHelper(String collectionName) {
@@ -84,29 +81,12 @@
      *  HTTP GET handling
      */
 
-    public Response handleGetWithJvmID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, Integer limit, Integer offset, String sort, String queries, String includes, String excludes, String returnMetadata) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            final MongoQuery querySystemId = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.SYSTEM_ID, systemId));
-            final MongoQuery queryJvmId = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.JVM_ID, jvmId));
-            String message = mongoStorageHandler.getMany(storage.getDatabase().getCollection(collectionName),
-                    MongoRequestFilters.buildAnd(querySystemId, queryJvmId), 1, 0, null, includes, excludes);
-            return Response.status(Response.Status.OK).entity(message).build();
-        } catch (Exception e) {
-            return Response.status(Response.Status.BAD_REQUEST).build();
-        }
+    public Response handleGetWithSystemID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, Integer limit, Integer offset, String sort, String queries, String includes, String excludes, String returnMetadata) {
+        return handleGet(httpServletRequest, context, limit, offset, sort, andSystemIdQuery(queries, systemId), includes, excludes, returnMetadata);
     }
 
-    public Response handleGetWithSystemID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, Integer limit, Integer offset, String sort, String queries, String includes, String excludes, String returnMetadata) {
-        try {
-            final ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            final MongoQuery systemIdQuery = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.SYSTEM_ID, systemId));
-            final MongoQuery query = new MongoQuery(MongoRequestFilters.buildAnd(systemIdQuery, MongoRequestFilters.buildQueriesFilter(queries)));
-            final String message = mongoStorageHandler.getMany(storage.getDatabase().getCollection(collectionName), query, limit, offset, sort, includes, excludes);
-            return Response.status(Response.Status.OK).entity(message).build();
-        } catch (Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+    public Response handleGetWithJvmID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, Integer limit, Integer offset, String sort, String queries, String includes, String excludes, String returnMetadata) {
+        return handleGet(httpServletRequest, context, limit, offset, sort, andSystemIdJvmIdQuery(queries, systemId, jvmId), includes, excludes, returnMetadata);
     }
 
     public Response handleGet(HttpServletRequest httpServletRequest, ServletContext context, Integer limit, Integer offset, String sort, String queries, String includes, String excludes, String returnMetadata) {
@@ -153,38 +133,30 @@
      */
 
     public Response handlePutWithSystemId(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String queries, String metadata, String body) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            mongoStorageHandler.updateOneSystemObject(storage.getDatabase().getCollection(collectionName), systemId, queries, body);
-            return Response.status(Response.Status.OK).build();
-        } catch (Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+        return handlePut(httpServletRequest, context, systemId, null, queries, metadata, body);
     }
 
     public Response handlePutWithJvmId(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, String queries, String metadata, String body) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            mongoStorageHandler.updateOneJvmObject(storage.getDatabase().getCollection(collectionName), systemId, jvmId, queries, body);
-            return Response.status(Response.Status.OK).build();
-        } catch (Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+        return handlePut(httpServletRequest, context, systemId, jvmId, queries, metadata, body);
     }
 
     public Response handlePut(HttpServletRequest httpServletRequest, ServletContext context, String queries, String metadata, String body) {
+        return handlePut(httpServletRequest, context, null, null, queries, metadata, body);
+    }
+
+    public Response handlePut(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, String queries, String metadata, String body) {
         try {
             RealmAuthorizer realmAuthorizer = (RealmAuthorizer) httpServletRequest.getAttribute(RealmAuthorizer.class.getName());
             ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
 
             if (realmAuthorizer != null) {
                 if (realmAuthorizer.updatable()) {
-                    mongoExecutor.execPutRequest(storage.getDatabase().getCollection(collectionName), body, queries, realmAuthorizer.getUpdatableRealms());
+                    mongoExecutor.execPutRequest(storage.getDatabase().getCollection(collectionName), body, queries, realmAuthorizer.getUpdatableRealms(), systemId, jvmId);
                 } else {
                     return Response.status(Response.Status.FORBIDDEN).build();
                 }
             } else {
-                mongoExecutor.execPutRequest(storage.getDatabase().getCollection(collectionName), body, queries, null);
+                mongoExecutor.execPutRequest(storage.getDatabase().getCollection(collectionName), body, queries, null, systemId, jvmId);
             }
 
             return Response.status(Response.Status.OK).build();
@@ -198,28 +170,26 @@
      */
 
     public Response handlePostWithSystemID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String returnMetadata, String body) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            mongoStorageHandler.addSystemObjects(storage.getDatabase().getCollection(collectionName, DBObject.class), systemId, body);
-            return Response.status(Response.Status.OK).build();
-        } catch (Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+        return handlePost(httpServletRequest, context, systemId, null, returnMetadata, body);
     }
 
-    public Response handlePost(HttpServletRequest httpServletRequest, ServletContext context, String metadata, String body) {
+    public Response handlePost(HttpServletRequest httpServletRequest, ServletContext context, String returnMetadata, String body) {
+        return handlePost(httpServletRequest, context, null, null, returnMetadata, body);
+    }
+
+    public Response handlePost(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, String metadata, String body) {
         try {
             RealmAuthorizer realmAuthorizer = (RealmAuthorizer) httpServletRequest.getAttribute(RealmAuthorizer.class.getName());
             ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
 
             if (realmAuthorizer != null) {
                 if (realmAuthorizer.writable()) {
-                    mongoExecutor.execPostRequest(storage.getDatabase().getCollection(collectionName, DBObject.class), body, realmAuthorizer.getWritableRealms());
+                    mongoExecutor.execPostRequest(storage.getDatabase().getCollection(collectionName, DBObject.class), body, realmAuthorizer.getWritableRealms(), systemId, jvmId);
                 } else {
                     return Response.status(Response.Status.FORBIDDEN).build();
                 }
             } else {
-                mongoExecutor.execPostRequest(storage.getDatabase().getCollection(collectionName, DBObject.class), body, null);
+                mongoExecutor.execPostRequest(storage.getDatabase().getCollection(collectionName, DBObject.class), body, null, systemId, jvmId);
             }
             return Response.status(Response.Status.OK).build();
         } catch (Exception e) {
@@ -232,26 +202,11 @@
      */
 
     public Response handleDeleteWithSystemID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String queries, String metadata) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            final MongoQuery query = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.SYSTEM_ID, systemId));
-            mongoStorageHandler.deleteMany(storage.getDatabase().getCollection(collectionName), query);
-            return Response.status(Response.Status.OK).build();
-        } catch(Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+        return handleDelete(httpServletRequest, context, andSystemIdQuery(queries, systemId), metadata);
     }
 
     public Response handleDeleteWithJvmID(HttpServletRequest httpServletRequest, ServletContext context, String systemId, String jvmId, String queries, String metadata) {
-        try {
-            ThermostatMongoStorage storage = (ThermostatMongoStorage) context.getAttribute(ServletContextConstants.MONGODB_CLIENT_ATTRIBUTE);
-            final MongoQuery querySystemId = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.SYSTEM_ID, systemId));
-            final MongoQuery queryJvmId = new MongoQuery(MongoRequestFilters.buildEq(ThermostatFields.JVM_ID, jvmId));
-            mongoStorageHandler.deleteMany(storage.getDatabase().getCollection(collectionName), MongoRequestFilters.buildAnd(querySystemId, queryJvmId));
-            return Response.status(Response.Status.OK).build();
-        } catch (Exception e) {
-            return exceptionHandler.generateResponseForException(e);
-        }
+        return handleDelete(httpServletRequest, context, andSystemIdJvmIdQuery(queries, systemId, jvmId), metadata);
     }
 
     public Response handleDelete(HttpServletRequest httpServletRequest, ServletContext context, String queries, String metadata) {
@@ -273,4 +228,24 @@
             return exceptionHandler.generateResponseForException(e);
         }
     }
+
+    /*
+     * Utility code
+     */
+
+    private String andSystemIdQuery(final String originalQuery, final String systemId) {
+        final String sysQuery = ThermostatFields.SYSTEM_ID + "==\"" + systemId + '"';
+        return isNullOrEmpty(originalQuery) ? sysQuery : sysQuery + ',' + originalQuery;
+    }
+
+    private String andSystemIdJvmIdQuery(final String originalQuery, final String systemId, final String jvmId) {
+        final String jvmQuery = ThermostatFields.JVM_ID + "==\"" + jvmId + '"';
+        final String sysJvmQuery = jvmQuery + (isNullOrEmpty(systemId) ? "" : ',' + ThermostatFields.SYSTEM_ID + "==\"" + systemId + '"');
+        return isNullOrEmpty(originalQuery) ? sysJvmQuery : sysJvmQuery + ',' + originalQuery;
+    }
+
+    private final boolean isNullOrEmpty(final String s) {
+        return s == null || s.isEmpty();
+    }
+
 }
--- a/services/jvms/src/main/java/com/redhat/thermostat/gateway/service/jvms/mongo/JvmInfoMongoStorageHandler.java	Tue Jul 25 11:21:41 2017 -0400
+++ b/services/jvms/src/main/java/com/redhat/thermostat/gateway/service/jvms/mongo/JvmInfoMongoStorageHandler.java	Tue Jul 25 14:26:07 2017 -0400
@@ -52,8 +52,6 @@
 import java.util.List;
 import java.util.Map;
 
-import com.redhat.thermostat.gateway.common.mongodb.MongoStorageHandler;
-
 import org.bson.Document;
 import org.bson.conversions.Bson;
 
@@ -62,7 +60,7 @@
 import com.mongodb.client.MongoCollection;
 import com.mongodb.util.JSON;
 
-public class JvmInfoMongoStorageHandler extends MongoStorageHandler {
+public class JvmInfoMongoStorageHandler  {
 
     private static final String SET_KEY = "$set";