From: Aron Roberts Date: Thu, 31 May 2012 02:13:44 +0000 (-0700) Subject: CSPACE-5012: Now correctly retrieves values from both namespaced and non-namespaced... X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=d43220f86abfdeb48ba14c587b05efc5eba56c9d;p=tmp%2Fjakarta-migration.git 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. --- 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;