From 8006543ab124228fc0020adad878a8219249844d Mon Sep 17 00:00:00 2001 From: Ray Lee Date: Fri, 4 Oct 2019 20:54:16 -0700 Subject: [PATCH] DRYD-765: Delay unmarshalling of payload parts until a part getter is called. --- .../services/client/PoxPayload.java | 88 ++++++++++++------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/services/client/src/main/java/org/collectionspace/services/client/PoxPayload.java b/services/client/src/main/java/org/collectionspace/services/client/PoxPayload.java index 827ceca1c..609c12430 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/PoxPayload.java +++ b/services/client/src/main/java/org/collectionspace/services/client/PoxPayload.java @@ -55,7 +55,7 @@ public abstract class PoxPayload { // The list of POX parts contained in the xmlText payload /** The parts. */ - private List parts = new ArrayList(); + private List parts = null; // Valid root element labels private static Set validRootElementLabels = new HashSet(Arrays.asList(DOCUMENT_ROOT_ELEMENT_LABEL, @@ -83,14 +83,16 @@ public abstract class PoxPayload { private void setDomDocument(Document dom) throws DocumentException { this.domDocument = dom; + this.parts = null; + String label = domDocument.getRootElement().getName().toLowerCase(); + if (label != null && getValidRootElementLables().contains(label)) { this.payloadName = label; } else { String msg = "The following incoming request payload is missing the root element or is otherwise malformed. For example valid payloads, see https://wiki.collectionspace.org/display/DOC/Common+Services+REST+API+documentation"; throw new DocumentException(msg + '\n' + this.xmlPayload); } - parseParts(); } /** @@ -186,20 +188,26 @@ public abstract class PoxPayload { * * @throws DocumentException the document exception */ - protected void parseParts() throws DocumentException { - Iterator it = getDOMDocument().getRootElement().elementIterator(); - PT payloadPart = null; - while (it.hasNext() == true) { - Element element = (Element) it.next(); - String label = element.getName(); - Object jaxbObject = PoxPayload.toObject(element); - if (jaxbObject != null) { - payloadPart = createPart(label, jaxbObject, element); - } else { - payloadPart = createPart(label, element); - } - if (payloadPart != null) { - this.addPart(payloadPart); + protected void parseParts() { + parts = new ArrayList(); + + Document document = this.domDocument; + + if (document != null) { + Iterator it = document.getRootElement().elementIterator(); + + while (it.hasNext() == true) { + Element element = (Element) it.next(); + String label = element.getName(); + Object jaxbObject = PoxPayload.toObject(element); + + PT payloadPart = (jaxbObject == null) + ? createPart(label, element) + : createPart(label, jaxbObject, element); + + if (payloadPart != null) { + this.addPart(payloadPart); + } } } } @@ -239,6 +247,8 @@ public abstract class PoxPayload { */ public PT getPart(String label) { PT result = null; + List parts = getParts(); + if (parts != null) { Iterator it = parts.iterator(); while (it.hasNext() == true) { @@ -252,27 +262,34 @@ public abstract class PoxPayload { return result; } - public List getParts(String label) { - List result = new ArrayList(); - if (parts != null) { - Iterator it = parts.iterator(); - while (it.hasNext() == true) { - PT part = it.next(); - if (part.getLabel().equalsIgnoreCase(label) == true) { - result.add(part); - } - } - } - - return result; - } + public List getParts(String label) { + List result = new ArrayList(); + List parts = getParts(); + + if (parts != null) { + Iterator it = parts.iterator(); + while (it.hasNext() == true) { + PT part = it.next(); + if (part.getLabel().equalsIgnoreCase(label) == true) { + result.add(part); + } + } + } + + return result; + } /** * Gets a list of the POX parts. * * @return the parts + * @throws DocumentException */ public List getParts() { + if (parts == null) { + parseParts(); + } + return parts; } @@ -288,12 +305,15 @@ public abstract class PoxPayload { /** * Adds a POX part to the list of existing parts with the label 'label'. * - * @param label the label + * @param label the label * @param entity the entity * @return the pT */ public PT addPart(String label, PT entity) { + List parts = getParts(); + parts.add(entity); + return entity; } @@ -304,15 +324,21 @@ public abstract class PoxPayload { * @return the pT */ public PT addPart(PT entity) { + List parts = getParts(); + parts.add(entity); + return entity; } /** * Removes a POX part from our list of parts + * * @param entity */ public void removePart(PT entity) { + List parts = getParts(); + parts.remove(entity); } -- 2.47.3