From 4f4de6ef98f86baec22e3f345f769cb9721e245e Mon Sep 17 00:00:00 2001 From: Louise Davies Date: Thu, 4 Mar 2021 13:12:03 +0000 Subject: [PATCH] #247 - fix recursion bug caused by prune method not being called for field sets --- .../core/manager/EntityBeanManager.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/main/java/org/icatproject/core/manager/EntityBeanManager.java b/src/main/java/org/icatproject/core/manager/EntityBeanManager.java index 4654d681..e5f8b017 100644 --- a/src/main/java/org/icatproject/core/manager/EntityBeanManager.java +++ b/src/main/java/org/icatproject/core/manager/EntityBeanManager.java @@ -1824,6 +1824,46 @@ public List search(String userId, String query, EntityManager manager, String } logger.debug("Clones {}", clones); return clones; + } else if (result.size() > 0 && (result.get(0) == null || result.get(0) instanceof Object[])) { + List clones = new ArrayList(); + long descendantCount = 0; + for (Object item : result) { + Object[] fieldSet = (Object[]) item; + for (int i = 0; i < fieldSet.length; i++) { + if (fieldSet[i] instanceof EntityBaseBean) { + Object beanManaged = fieldSet[i]; + if (beanManaged == null) { + if ((descendantCount += 1) > maxEntities) { + throw new IcatException(IcatExceptionType.VALIDATION, + "attempt to return more than " + maxEntities + " entities"); + } + fieldSet[i] = null; + } else { + EntityBaseBean eb = ((EntityBaseBean) beanManaged).pruned(false, 0, null, maxEntities, gateKeeper, + userId, manager); + if ((descendantCount += eb.getDescendantCount(maxEntities)) > maxEntities) { + throw new IcatException(IcatExceptionType.VALIDATION, + "attempt to return more than " + maxEntities + " entities"); + } + fieldSet[i] = eb; + } + } + } + clones.add(fieldSet); + } + logger.debug("Obtained " + descendantCount + " entities."); + + if (logRequests.contains(CallType.READ)) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (JsonGenerator gen = Json.createGenerator(baos).writeStartObject()) { + gen.write("userName", userId); + gen.write("query", query); + gen.writeEnd(); + } + transmitter.processMessage("search", ip, baos.toString(), startMillis); + } + logger.debug("Clones {}", clones); + return clones; } else { if (logRequests.contains(CallType.READ)) { ByteArrayOutputStream baos = new ByteArrayOutputStream();