From d43220f86abfdeb48ba14c587b05efc5eba56c9d Mon Sep 17 00:00:00 2001 From: Aron Roberts Date: Wed, 30 May 2012 19:13:44 -0700 Subject: [PATCH] CSPACE-5012: Now correctly retrieves values from both namespaced and non-namespaced elements, as well as from records that have multiple schema parts (such as a common and extension part). Uses an abominable hack to wrap the XML fragment before extracting inAuthority value. --- .../services/imports/TemplateExpander.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/services/imports/service/src/main/java/org/collectionspace/services/imports/TemplateExpander.java b/services/imports/service/src/main/java/org/collectionspace/services/imports/TemplateExpander.java index 7d51e541c..0a8353838 100644 --- a/services/imports/service/src/main/java/org/collectionspace/services/imports/TemplateExpander.java +++ b/services/imports/service/src/main/java/org/collectionspace/services/imports/TemplateExpander.java @@ -59,7 +59,8 @@ public class TemplateExpander { private static Map docTypeSvcNameRegistry = new HashMap(); private static XPath xpath = XPathFactory.newInstance().newXPath(); - private static final String IN_AUTHORITY_XPATH = "//*[local-name()='inAuthority']"; + private static final String IN_AUTHORITY_NAMESPACE_XPATH = "//*[local-name()='inAuthority']"; + private static final String IN_AUTHORITY_NO_NAMESPACE_XPATH = "//inAuthority"; protected static String var(String theVar){ return "\\$\\{"+theVar+"\\}"; @@ -233,7 +234,22 @@ public class TemplateExpander { // their uniqueness against those already present in a running system. // - ADR 2012-05-24 private static String getInAuthorityValue(String xmlFragment) { - return extractValueFromXmlFragment(IN_AUTHORITY_XPATH, xmlFragment); + String inAuthorityValue = ""; + // Check in two ways for the inAuthority value: one intended for records with + // namespace-qualified elements, the second for unqualified elements. + // (There may be a more elegant way to do this with a single XPath expression, + // via an OR operator or the like.) + System.out.println("before setting inAuthority value"); + inAuthorityValue = extractValueFromXmlFragment(IN_AUTHORITY_NAMESPACE_XPATH, xmlFragment); + System.out.println("after setting namespaced inAuthority value: " + inAuthorityValue); + if (Tools.isBlank(inAuthorityValue)) { + System.out.println("in if block ..."); + inAuthorityValue = extractValueFromXmlFragment(IN_AUTHORITY_NO_NAMESPACE_XPATH, xmlFragment); + System.out.println("after setting non-namespaced inAuthority value: " + inAuthorityValue); + } else { + System.out.println("bypassed if block ..."); + } + return inAuthorityValue; } // FIXME: Need to handle cases here where the xmlFragment may contain more @@ -243,10 +259,13 @@ public class TemplateExpander { private static String extractValueFromXmlFragment(String xpathExpr, String xmlFragment) { String value = ""; try { - InputSource input = new InputSource(new StringReader(xmlFragment)); + // FIXME: Cruelly ugly hack; at this point for imported records + // with more than one child, we have a non-well-formed fragment. + String xmlFragmentWrapped = "" + xmlFragment + ""; + InputSource input = new InputSource(new StringReader(xmlFragmentWrapped)); value = xpath.evaluate(xpathExpr, input); } catch (XPathExpressionException e) { - // Do nothing here. + System.out.println(e.getMessage()); } return value; -- 2.47.3