]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-1026 recognizes whitespaces in repeated fields, was already recognizing elsewhere
authorSanjay Dalal <sanjay.dalal@berkeley.edu>
Tue, 2 Mar 2010 01:34:41 +0000 (01:34 +0000)
committerSanjay Dalal <sanjay.dalal@berkeley.edu>
Tue, 2 Mar 2010 01:34:41 +0000 (01:34 +0000)
added tests that read raw xml from a file without jaxb unmarshaller. added utility methods in AbstractServiceTestImpl for the same.
test: collectionobject tests

M    services/collectionobject/client/src/test/java/org/collectionspace/services/client/test/CollectionObjectServiceTest.java
A    services/collectionobject/client/src/test/resources/test-data/repfield_whitesp3.xml
A    services/collectionobject/client/src/test/resources/test-data/repfield_whitesp4.xml
A    services/collectionobject/client/src/test/resources/test-data/repfield_whitesp1.xml
A    services/collectionobject/client/src/test/resources/test-data/repfield_whitesp2.xml
M    services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java
M    services/pom.xml
M    services/client/src/main/java/org/collectionspace/services/client/test/AbstractServiceTestImpl.java
M    services/client/pom.xml

services/client/pom.xml
services/client/src/main/java/org/collectionspace/services/client/test/BaseServiceTest.java
services/collectionobject/client/src/test/java/org/collectionspace/services/client/test/CollectionObjectServiceTest.java
services/collectionobject/client/src/test/resources/test-data/repfield_whitesp1.xml [new file with mode: 0644]
services/collectionobject/client/src/test/resources/test-data/repfield_whitesp2.xml [new file with mode: 0644]
services/collectionobject/client/src/test/resources/test-data/repfield_whitesp3.xml [new file with mode: 0644]
services/collectionobject/client/src/test/resources/test-data/repfield_whitesp4.xml [new file with mode: 0644]
services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java
services/pom.xml

index aaf527faf68ba32ca09d2a98b35311b509784b1b..47433f6743067daf529ca7c6f965a03eb3d273bc 100644 (file)
             <artifactId>slf4j-log4j12</artifactId>\r
         </dependency>\r
         <dependency>\r
-          <groupId>org.apache.maven.plugins</groupId>\r
-          <artifactId>maven-surefire-plugin</artifactId>\r
-          <version>2.4.3</version>\r
+            <groupId>org.apache.maven.plugins</groupId>\r
+            <artifactId>maven-surefire-plugin</artifactId>\r
+            <version>2.4.3</version>\r
+        </dependency>\r
+        <dependency>\r
+            <groupId>commons-io</groupId>\r
+            <artifactId>commons-io</artifactId>\r
         </dependency>\r
         <dependency>\r
             <groupId>org.jboss.resteasy</groupId>\r
@@ -60,7 +64,7 @@
             <version>5.6</version>\r
         </dependency>\r
 \r
-      <!-- javax -->\r
+        <!-- javax -->\r
         <dependency>\r
             <groupId>javax.security</groupId>\r
             <artifactId>jaas</artifactId>\r
             <version>1.6.1</version>\r
             <scope>provided</scope>\r
         </dependency>\r
-        \r
+\r
         <!-- jboss -->\r
 \r
         <!-- nuxeo -->\r
     </dependencies>\r
-    \r
+\r
     <build>\r
         <finalName>collectionspace-services-client</finalName>\r
         <plugins>\r
index 1d4cfbd3c8fb443c133776814ac89cfff4f48f07..7234718b75c20533cb8d733646789b156579ec7c 100644 (file)
@@ -14,12 +14,14 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;\r
 import javax.xml.bind.Marshaller;\r
 import javax.xml.bind.Unmarshaller;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
 \r
 import org.apache.commons.httpclient.methods.DeleteMethod;\r
 import org.apache.commons.httpclient.methods.GetMethod;\r
 import org.apache.commons.httpclient.methods.PostMethod;\r
 import org.apache.commons.httpclient.methods.PutMethod;\r
 import org.apache.commons.httpclient.methods.StringRequestEntity;\r
+import org.apache.commons.io.FileUtils;\r
 import org.collectionspace.services.client.TestServiceClient;\r
 import org.jboss.resteasy.client.ClientResponse;\r
 import org.jboss.resteasy.plugins.providers.multipart.InputPart;\r
@@ -27,6 +29,7 @@ import org.jboss.resteasy.plugins.providers.multipart.MultipartInput;
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.testng.annotations.DataProvider;\r
+import org.w3c.dom.Document;\r
 \r
 public abstract class BaseServiceTest {\r
 \r
@@ -343,6 +346,22 @@ public abstract class BaseServiceTest {
         return getObjectFromStream(jaxbClass, is);\r
     }\r
 \r
+    protected Document getXmlDocument(String fileName) throws Exception {\r
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+        File f = new File(fileName);\r
+        if (!f.exists()) {\r
+            throw new IllegalArgumentException("test data file " + fileName + " not found!");\r
+        }\r
+        // Create the builder and parse the file\r
+        return factory.newDocumentBuilder().parse(f);\r
+    }\r
+\r
+    protected String getXmlDocumentAsString(String fileName) throws Exception {\r
+        byte[] b = FileUtils.readFileToByteArray(new File(fileName));\r
+        return new String(b);\r
+    }\r
+\r
+\r
     /**\r
      * getObjectFromStream get object of given class from given inputstream\r
      * @param jaxbClass\r
index f534e4301c7d14d84cc89350b826a4a6a3c63414..5bbc7fdf0035ed6d272baec3bf4a039088262902 100644 (file)
@@ -117,34 +117,28 @@ public class CollectionObjectServiceTest extends AbstractServiceTestImpl {
     }
 
     @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
-    public void createFromXml(String testName) throws Exception {
+    public void createFromXmlCambridge(String testName) throws Exception {
+        createFromXmlFile(testName, "./test-data/testCambridge.xml", true);
+    }
 
-        // Perform setup, such as initializing the type of service request
-        // (e.g. CREATE, DELETE), its valid and expected status codes, and
-        // its associated HTTP method name (e.g. POST, DELETE).
-        setupCreate(testName);
+    @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
+    public void createFromXmlRFWS1(String testName) throws Exception {
+        createFromXmlFile(testName, "./target/test-classes/test-data/repfield_whitesp1.xml", false);
+    }
 
-        // Submit the request to the service and store the response.
-        String identifier = createIdentifier();
-        MultipartOutput multipart =
-                createCollectionObjectInstanceFromXml(client.getCommonPartName(),
-                "test-data/testCambridge.xml");
-        ClientResponse<Response> res = client.create(multipart);
-        int statusCode = res.getStatus();
+    @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
+    public void createFromXmlRFWS2(String testName) throws Exception {
+        createFromXmlFile(testName, "./target/test-classes/test-data/repfield_whitesp2.xml", false);
+    }
 
-        // Check the status code of the response: does it match
-        // the expected response(s)?
-        //
-        // Specifically:
-        // Does it fall within the set of valid status codes?
-        // Does it exactly match the expected status code?
-        if (logger.isDebugEnabled()) {
-            logger.debug(testName + ": status = " + statusCode);
-        }
-        Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
-                invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
-        Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
-        allResourceIdsCreated.add(extractId(res));
+    @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
+    public void createFromXmlRFWS3(String testName) throws Exception {
+        createFromXmlFile(testName, "./target/test-classes/test-data/repfield_whitesp3.xml", false);
+    }
+
+    @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
+    public void createFromXmlRFWS4(String testName) throws Exception {
+        createFromXmlFile(testName, "./target/test-classes/test-data/repfield_whitesp4.xml", false);
     }
 
     /* (non-Javadoc)
@@ -802,10 +796,19 @@ public class CollectionObjectServiceTest extends AbstractServiceTestImpl {
 
     }
 
-    private MultipartOutput createCollectionObjectInstanceFromXml(String commonPartName,
+    /**
+     * createCollectionObjectInstanceFromXml uses JAXB unmarshaller to retrieve
+     * collectionobject from given file
+     * @param commonPartName
+     * @param commonPartFileName
+     * @return
+     * @throws Exception
+     */
+    private MultipartOutput createCollectionObjectInstanceFromXml(String testName, String commonPartName,
             String commonPartFileName) throws Exception {
 
-        CollectionobjectsCommon collectionObject = (CollectionobjectsCommon) getObjectFromFile(CollectionobjectsCommon.class,
+        CollectionobjectsCommon collectionObject =
+                (CollectionobjectsCommon) getObjectFromFile(CollectionobjectsCommon.class,
                 commonPartFileName);
         MultipartOutput multipart = new MultipartOutput();
         OutputPart commonPart = multipart.addPart(collectionObject,
@@ -813,10 +816,33 @@ public class CollectionObjectServiceTest extends AbstractServiceTestImpl {
         commonPart.getHeaders().add("label", commonPartName);
 
         if (logger.isDebugEnabled()) {
-            logger.debug("to be created, collectionobject common");
+            logger.debug(testName + " to be created, collectionobject common");
             logger.debug(objectAsXmlString(collectionObject,
                     CollectionobjectsCommon.class));
         }
+        return multipart;
+
+    }
+
+    /**
+     * createCollectionObjectInstanceFromRawXml uses stringified collectionobject
+     * retrieve from given file
+     * @param commonPartName
+     * @param commonPartFileName
+     * @return
+     * @throws Exception
+     */
+    private MultipartOutput createCollectionObjectInstanceFromRawXml(String testName, String commonPartName,
+            String commonPartFileName) throws Exception {
+
+        MultipartOutput multipart = new MultipartOutput();
+        String stringObject = getXmlDocumentAsString(commonPartFileName);
+        if (logger.isDebugEnabled()) {
+            logger.debug(testName + " to be created, collectionobject common " + "\n" + stringObject);
+        }
+        OutputPart commonPart = multipart.addPart(stringObject,
+                MediaType.APPLICATION_XML_TYPE);
+        commonPart.getHeaders().add("label", commonPartName);
 
         return multipart;
 
@@ -825,4 +851,31 @@ public class CollectionObjectServiceTest extends AbstractServiceTestImpl {
     private String getNHPartName() {
         return "collectionobjects_naturalhistory";
     }
+
+    private void createFromXmlFile(String testName, String fileName, boolean useJaxb) throws Exception {
+        // Perform setup, such as initializing the type of service request
+        // (e.g. CREATE, DELETE), its valid and expected status codes, and
+        // its associated HTTP method name (e.g. POST, DELETE).
+        setupCreate(testName);
+
+        MultipartOutput multipart = null;
+
+        if (useJaxb) {
+            multipart = createCollectionObjectInstanceFromXml(testName, 
+                    client.getCommonPartName(), fileName);
+        } else {
+            multipart = createCollectionObjectInstanceFromRawXml(testName, 
+                    client.getCommonPartName(), fileName);
+        }
+        ClientResponse<Response> res = client.create(multipart);
+        int statusCode = res.getStatus();
+
+        if (logger.isDebugEnabled()) {
+            logger.debug(testName + ": status = " + statusCode);
+        }
+        Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
+                invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
+        Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
+        allResourceIdsCreated.add(extractId(res));
+    }
 }
diff --git a/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp1.xml b/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp1.xml
new file mode 100644 (file)
index 0000000..b7b659f
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:collectionobjects_common xmlns:ns2="http://collectionspace.org/services/collectionobject">
+<objectNumber>objectNumber</objectNumber>
+
+<otherNumber>XXX</otherNumber>
+<otherNumberType>otherNumberType</otherNumberType>
+<briefDescription>briefDescription</briefDescription>
+<comments>comments</comments>
+<distinguishingFeatures>distFeatures</distinguishingFeatures>
+<numberOfObjects>numberOfObjects</numberOfObjects>
+<objectName>objectName</objectName>
+<objectNameCurrency>objectNameCurrency</objectNameCurrency>
+<objectNameLevel>XXX</objectNameLevel>
+<objectNameNote>objectNameNote</objectNameNote>
+<objectNameSystem>objectNameSystem</objectNameSystem>
+<objectNameType>objectNameType</objectNameType>
+
+<objectNameLanguage>objectNameLanguage</objectNameLanguage>
+<!-- test whitespace as first child node -->
+<responsibleDepartments> <responsibleDepartment> responsibleDept1</responsibleDepartment><responsibleDepartment>responsibleDept2</responsibleDepartment></responsibleDepartments>
+<title>title</title>
+<objectTitleLanguage>objectTitleLanguage</objectTitleLanguage>
+<titleTranslation>titleTranslation</titleTranslation>
+<titleType>titleType</titleType>
+<age>age</age>
+<ageQualifier>ageQualifier</ageQualifier>
+<ageUnit>ageUnit</ageUnit>
+<color>color</color>
+<contentActivity>contentActivity</contentActivity>
+<contentConcept>contentConcept</contentConcept>
+<contentDate>XXX</contentDate>
+<contentDescription>contentDescription</contentDescription>
+<contentEventName>contentEventName</contentEventName>
+<contentEventNameType>contentEventNameType</contentEventNameType>
+<contentNote>contentNote</contentNote>
+<contentLanguage>contentLanguage</contentLanguage>
+<contentObject>contentObject</contentObject>
+<contentObjectType>contentObjectType</contentObjectType>
+<contentOrganization>contentOrganization</contentOrganization>
+<contentOther>contentOther</contentOther>
+<contentOtherType>contentOtherType</contentOtherType>
+<contentPeople>contentPeople</contentPeople>
+<contentPerson>contentPerson</contentPerson>
+<contentPlace>contentPlace</contentPlace>
+<contentPosition>contentPosition</contentPosition>
+<contentScript>XXX</contentScript>
+<copyNumber>copyNumber</copyNumber>
+<dimension>dimension</dimension>
+<dimensionMeasuredPart>dimensionMeasuredPart</dimensionMeasuredPart>
+<dimensionMeasurementUnit>dimensionMeasurementUnit</dimensionMeasurementUnit>
+<dimensionValue>dimensionValue</dimensionValue>
+<dimensionValueDate>XXX</dimensionValueDate>
+<dimensionValueQualifier>dimensionValueQualifier</dimensionValueQualifier>
+<editionNumber>editionNumber</editionNumber>
+<form>form</form>
+<inscriptionContent>inscriptionContent</inscriptionContent>
+<inscriber>inscriber</inscriber>
+<inscriptionDate>inscriptionDate</inscriptionDate>
+<inscriptionInterpretation>inscriptionInterpretation</inscriptionInterpretation>
+<inscriptionLanguage>inscriptionLanguage</inscriptionLanguage>
+<inscriptionMethod>inscriptionMethod</inscriptionMethod>
+<inscriptionPosition>inscriptionPosition</inscriptionPosition>
+<inscriptionScript>inscriptionScript</inscriptionScript>
+<inscriptionTranslation>inscriptionTranslation</inscriptionTranslation>
+<inscriptionTransliteration>inscriptionTransliteration</inscriptionTransliteration>
+<inscriptionType>inscriptionType</inscriptionType>
+<inscriptionDescription>inscriptionDescription</inscriptionDescription>
+<inscriptionDescriptionInscriber>inscriptionDescriptionInscriber</inscriptionDescriptionInscriber>
+<inscriptionDescriptionDate>inscriptionDescriptionDate</inscriptionDescriptionDate>
+<inscriptionDescriptionInterpretation>inscriptionDescriptionInterpretation</inscriptionDescriptionInterpretation>
+<inscriptionDescriptionMethod>inscriptionDescriptionMethod</inscriptionDescriptionMethod>
+<inscriptionDescriptionPosition>inscriptionDescriptionPosition</inscriptionDescriptionPosition>
+<inscriptionDescriptionType>inscriptionDescriptionType</inscriptionDescriptionType>
+<material>material</material>
+<materialComponent>materialComponent</materialComponent>
+<materialComponentNote>materialComponentNote</materialComponentNote>
+<materialName>materialName</materialName>
+<materialSource>materialSource</materialSource>
+<objectStatus>objectStatus</objectStatus>
+<phase>phase</phase>
+<physicalDescription>physicalDescription</physicalDescription>
+<sex>sex</sex>
+<style>style</style>
+<technicalAttribute>technicalAttribute</technicalAttribute>
+<technicalAttributeMeasurement>technicalAttributeMeasurement</technicalAttributeMeasurement>
+<technicalAttributeMeasurementUnit>technicalAttributeMeasurementUnit</technicalAttributeMeasurementUnit>
+<objectComponentName>objectComponentName</objectComponentName>
+<objectComponentInformation>objectComponentInformation</objectComponentInformation>
+<dateAssociation>dateAssociation</dateAssociation>
+<dateEarliestSingle>{"level":"objectLevel","content-script":"descContentScript","content-method":"descContentMethod","otherNumber":"otherNumber"}</dateEarliestSingle>
+<dateEarliestSingleCertainty>dateEarliestSingleCertainty</dateEarliestSingleCertainty>
+<dateEarliestSingleQualifier>dateEarlierstSingleQualifier</dateEarliestSingleQualifier>
+<dateLatest>XXX</dateLatest>
+<dateLatestCertainty>dateLatestCertainty</dateLatestCertainty>
+<dateLatestQualifier>dateLatestQualifier</dateLatestQualifier>
+<datePeriod>datePeriod</datePeriod>
+<dateText>dateText</dateText>
+</ns2:collectionobjects_common> 
diff --git a/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp2.xml b/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp2.xml
new file mode 100644 (file)
index 0000000..1af6250
--- /dev/null
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:collectionobjects_common xmlns:ns2="http://collectionspace.org/services/collectionobject">
+<objectNumber>objectNumber</objectNumber>
+
+<otherNumber>XXX</otherNumber>
+<otherNumberType>otherNumberType</otherNumberType>
+<briefDescription>briefDescription</briefDescription>
+<comments>comments</comments>
+<distinguishingFeatures>distFeatures</distinguishingFeatures>
+<numberOfObjects>numberOfObjects</numberOfObjects>
+<objectName>objectName</objectName>
+<objectNameCurrency>objectNameCurrency</objectNameCurrency>
+<objectNameLevel>XXX</objectNameLevel>
+<objectNameNote>objectNameNote</objectNameNote>
+<objectNameSystem>objectNameSystem</objectNameSystem>
+<objectNameType>objectNameType</objectNameType>
+
+<objectNameLanguage>objectNameLanguage</objectNameLanguage>
+<!-- test newline whitespace -->
+<responsibleDepartments>
+<responsibleDepartment>responsibleDept1</responsibleDepartment>
+<responsibleDepartment>responsibleDept2</responsibleDepartment>
+</responsibleDepartments>
+
+<title>title</title>
+<objectTitleLanguage>objectTitleLanguage</objectTitleLanguage>
+<titleTranslation>titleTranslation</titleTranslation>
+<titleType>titleType</titleType>
+<age>age</age>
+<ageQualifier>ageQualifier</ageQualifier>
+<ageUnit>ageUnit</ageUnit>
+<color>color</color>
+<contentActivity>contentActivity</contentActivity>
+<contentConcept>contentConcept</contentConcept>
+<contentDate>XXX</contentDate>
+<contentDescription>contentDescription</contentDescription>
+<contentEventName>contentEventName</contentEventName>
+<contentEventNameType>contentEventNameType</contentEventNameType>
+<contentNote>contentNote</contentNote>
+<contentLanguage>contentLanguage</contentLanguage>
+<contentObject>contentObject</contentObject>
+<contentObjectType>contentObjectType</contentObjectType>
+<contentOrganization>contentOrganization</contentOrganization>
+<contentOther>contentOther</contentOther>
+<contentOtherType>contentOtherType</contentOtherType>
+<contentPeople>contentPeople</contentPeople>
+<contentPerson>contentPerson</contentPerson>
+<contentPlace>contentPlace</contentPlace>
+<contentPosition>contentPosition</contentPosition>
+<contentScript>XXX</contentScript>
+<copyNumber>copyNumber</copyNumber>
+<dimension>dimension</dimension>
+<dimensionMeasuredPart>dimensionMeasuredPart</dimensionMeasuredPart>
+<dimensionMeasurementUnit>dimensionMeasurementUnit</dimensionMeasurementUnit>
+<dimensionValue>dimensionValue</dimensionValue>
+<dimensionValueDate>XXX</dimensionValueDate>
+<dimensionValueQualifier>dimensionValueQualifier</dimensionValueQualifier>
+<editionNumber>editionNumber</editionNumber>
+<form>form</form>
+<inscriptionContent>inscriptionContent</inscriptionContent>
+<inscriber>inscriber</inscriber>
+<inscriptionDate>inscriptionDate</inscriptionDate>
+<inscriptionInterpretation>inscriptionInterpretation</inscriptionInterpretation>
+<inscriptionLanguage>inscriptionLanguage</inscriptionLanguage>
+<inscriptionMethod>inscriptionMethod</inscriptionMethod>
+<inscriptionPosition>inscriptionPosition</inscriptionPosition>
+<inscriptionScript>inscriptionScript</inscriptionScript>
+<inscriptionTranslation>inscriptionTranslation</inscriptionTranslation>
+<inscriptionTransliteration>inscriptionTransliteration</inscriptionTransliteration>
+<inscriptionType>inscriptionType</inscriptionType>
+<inscriptionDescription>inscriptionDescription</inscriptionDescription>
+<inscriptionDescriptionInscriber>inscriptionDescriptionInscriber</inscriptionDescriptionInscriber>
+<inscriptionDescriptionDate>inscriptionDescriptionDate</inscriptionDescriptionDate>
+<inscriptionDescriptionInterpretation>inscriptionDescriptionInterpretation</inscriptionDescriptionInterpretation>
+<inscriptionDescriptionMethod>inscriptionDescriptionMethod</inscriptionDescriptionMethod>
+<inscriptionDescriptionPosition>inscriptionDescriptionPosition</inscriptionDescriptionPosition>
+<inscriptionDescriptionType>inscriptionDescriptionType</inscriptionDescriptionType>
+<material>material</material>
+<materialComponent>materialComponent</materialComponent>
+<materialComponentNote>materialComponentNote</materialComponentNote>
+<materialName>materialName</materialName>
+<materialSource>materialSource</materialSource>
+<objectStatus>objectStatus</objectStatus>
+<phase>phase</phase>
+<physicalDescription>physicalDescription</physicalDescription>
+<sex>sex</sex>
+<style>style</style>
+<technicalAttribute>technicalAttribute</technicalAttribute>
+<technicalAttributeMeasurement>technicalAttributeMeasurement</technicalAttributeMeasurement>
+<technicalAttributeMeasurementUnit>technicalAttributeMeasurementUnit</technicalAttributeMeasurementUnit>
+<objectComponentName>objectComponentName</objectComponentName>
+<objectComponentInformation>objectComponentInformation</objectComponentInformation>
+<dateAssociation>dateAssociation</dateAssociation>
+<dateEarliestSingle>{"level":"objectLevel","content-script":"descContentScript","content-method":"descContentMethod","otherNumber":"otherNumber"}</dateEarliestSingle>
+<dateEarliestSingleCertainty>dateEarliestSingleCertainty</dateEarliestSingleCertainty>
+<dateEarliestSingleQualifier>dateEarlierstSingleQualifier</dateEarliestSingleQualifier>
+<dateLatest>XXX</dateLatest>
+<dateLatestCertainty>dateLatestCertainty</dateLatestCertainty>
+<dateLatestQualifier>dateLatestQualifier</dateLatestQualifier>
+<datePeriod>datePeriod</datePeriod>
+<dateText>dateText</dateText>
+</ns2:collectionobjects_common> 
diff --git a/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp3.xml b/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp3.xml
new file mode 100644 (file)
index 0000000..2d47eee
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:collectionobjects_common xmlns:ns2="http://collectionspace.org/services/collectionobject">
+<objectNumber>objectNumber</objectNumber>
+
+<otherNumber>XXX</otherNumber>
+<otherNumberType>otherNumberType</otherNumberType>
+<briefDescription>briefDescription</briefDescription>
+<comments>comments</comments>
+<distinguishingFeatures>distFeatures</distinguishingFeatures>
+<numberOfObjects>numberOfObjects</numberOfObjects>
+<objectName>objectName</objectName>
+<objectNameCurrency>objectNameCurrency</objectNameCurrency>
+<objectNameLevel>XXX</objectNameLevel>
+<objectNameNote>objectNameNote</objectNameNote>
+<objectNameSystem>objectNameSystem</objectNameSystem>
+<objectNameType>objectNameType</objectNameType>
+
+<objectNameLanguage>objectNameLanguage</objectNameLanguage>
+<!-- test newline whitespace -->
+<responsibleDepartments>
+<!-- test childnode as whitespace -->
+<responsibleDepartment> responsibleDept1</responsibleDepartment>
+<responsibleDepartment>responsibleDept2</responsibleDepartment>
+</responsibleDepartments>
+
+<title>title</title>
+<objectTitleLanguage>objectTitleLanguage</objectTitleLanguage>
+<titleTranslation>titleTranslation</titleTranslation>
+<titleType>titleType</titleType>
+<age>age</age>
+<ageQualifier>ageQualifier</ageQualifier>
+<ageUnit>ageUnit</ageUnit>
+<color>color</color>
+<contentActivity>contentActivity</contentActivity>
+<contentConcept>contentConcept</contentConcept>
+<contentDate>XXX</contentDate>
+<contentDescription>contentDescription</contentDescription>
+<contentEventName>contentEventName</contentEventName>
+<contentEventNameType>contentEventNameType</contentEventNameType>
+<contentNote>contentNote</contentNote>
+<contentLanguage>contentLanguage</contentLanguage>
+<contentObject>contentObject</contentObject>
+<contentObjectType>contentObjectType</contentObjectType>
+<contentOrganization>contentOrganization</contentOrganization>
+<contentOther>contentOther</contentOther>
+<contentOtherType>contentOtherType</contentOtherType>
+<contentPeople>contentPeople</contentPeople>
+<contentPerson>contentPerson</contentPerson>
+<contentPlace>contentPlace</contentPlace>
+<contentPosition>contentPosition</contentPosition>
+<contentScript>XXX</contentScript>
+<copyNumber>copyNumber</copyNumber>
+<dimension>dimension</dimension>
+<dimensionMeasuredPart>dimensionMeasuredPart</dimensionMeasuredPart>
+<dimensionMeasurementUnit>dimensionMeasurementUnit</dimensionMeasurementUnit>
+<dimensionValue>dimensionValue</dimensionValue>
+<dimensionValueDate>XXX</dimensionValueDate>
+<dimensionValueQualifier>dimensionValueQualifier</dimensionValueQualifier>
+<editionNumber>editionNumber</editionNumber>
+<form>form</form>
+<inscriptionContent>inscriptionContent</inscriptionContent>
+<inscriber>inscriber</inscriber>
+<inscriptionDate>inscriptionDate</inscriptionDate>
+<inscriptionInterpretation>inscriptionInterpretation</inscriptionInterpretation>
+<inscriptionLanguage>inscriptionLanguage</inscriptionLanguage>
+<inscriptionMethod>inscriptionMethod</inscriptionMethod>
+<inscriptionPosition>inscriptionPosition</inscriptionPosition>
+<inscriptionScript>inscriptionScript</inscriptionScript>
+<inscriptionTranslation>inscriptionTranslation</inscriptionTranslation>
+<inscriptionTransliteration>inscriptionTransliteration</inscriptionTransliteration>
+<inscriptionType>inscriptionType</inscriptionType>
+<inscriptionDescription>inscriptionDescription</inscriptionDescription>
+<inscriptionDescriptionInscriber>inscriptionDescriptionInscriber</inscriptionDescriptionInscriber>
+<inscriptionDescriptionDate>inscriptionDescriptionDate</inscriptionDescriptionDate>
+<inscriptionDescriptionInterpretation>inscriptionDescriptionInterpretation</inscriptionDescriptionInterpretation>
+<inscriptionDescriptionMethod>inscriptionDescriptionMethod</inscriptionDescriptionMethod>
+<inscriptionDescriptionPosition>inscriptionDescriptionPosition</inscriptionDescriptionPosition>
+<inscriptionDescriptionType>inscriptionDescriptionType</inscriptionDescriptionType>
+<material>material</material>
+<materialComponent>materialComponent</materialComponent>
+<materialComponentNote>materialComponentNote</materialComponentNote>
+<materialName>materialName</materialName>
+<materialSource>materialSource</materialSource>
+<objectStatus>objectStatus</objectStatus>
+<phase>phase</phase>
+<physicalDescription>physicalDescription</physicalDescription>
+<sex>sex</sex>
+<style>style</style>
+<technicalAttribute>technicalAttribute</technicalAttribute>
+<technicalAttributeMeasurement>technicalAttributeMeasurement</technicalAttributeMeasurement>
+<technicalAttributeMeasurementUnit>technicalAttributeMeasurementUnit</technicalAttributeMeasurementUnit>
+<objectComponentName>objectComponentName</objectComponentName>
+<objectComponentInformation>objectComponentInformation</objectComponentInformation>
+<dateAssociation>dateAssociation</dateAssociation>
+<dateEarliestSingle>{"level":"objectLevel","content-script":"descContentScript","content-method":"descContentMethod","otherNumber":"otherNumber"}</dateEarliestSingle>
+<dateEarliestSingleCertainty>dateEarliestSingleCertainty</dateEarliestSingleCertainty>
+<dateEarliestSingleQualifier>dateEarlierstSingleQualifier</dateEarliestSingleQualifier>
+<dateLatest>XXX</dateLatest>
+<dateLatestCertainty>dateLatestCertainty</dateLatestCertainty>
+<dateLatestQualifier>dateLatestQualifier</dateLatestQualifier>
+<datePeriod>datePeriod</datePeriod>
+<dateText>dateText</dateText>
+</ns2:collectionobjects_common> 
diff --git a/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp4.xml b/services/collectionobject/client/src/test/resources/test-data/repfield_whitesp4.xml
new file mode 100644 (file)
index 0000000..b17b621
--- /dev/null
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:collectionobjects_common xmlns:ns2="http://collectionspace.org/services/collectionobject">
+<objectNumber>objectNumber</objectNumber>
+
+<otherNumber>XXX</otherNumber>
+<otherNumberType>otherNumberType</otherNumberType>
+<briefDescription>briefDescription</briefDescription>
+<comments>comments</comments>
+<distinguishingFeatures>distFeatures</distinguishingFeatures>
+<numberOfObjects>numberOfObjects</numberOfObjects>
+<objectName>objectName</objectName>
+<objectNameCurrency>objectNameCurrency</objectNameCurrency>
+<objectNameLevel>XXX</objectNameLevel>
+<objectNameNote>objectNameNote</objectNameNote>
+<objectNameSystem>objectNameSystem</objectNameSystem>
+<objectNameType>objectNameType</objectNameType>
+
+<objectNameLanguage>objectNameLanguage</objectNameLanguage>
+<!-- test newline and tab whitespace -->
+<responsibleDepartments>
+    <responsibleDepartment>responsibleDept1</responsibleDepartment>
+    <responsibleDepartment>responsibleDept2</responsibleDepartment>
+</responsibleDepartments>
+
+<title>title</title>
+<objectTitleLanguage>objectTitleLanguage</objectTitleLanguage>
+<titleTranslation>titleTranslation</titleTranslation>
+<titleType>titleType</titleType>
+<age>age</age>
+<ageQualifier>ageQualifier</ageQualifier>
+<ageUnit>ageUnit</ageUnit>
+<color>color</color>
+<contentActivity>contentActivity</contentActivity>
+<contentConcept>contentConcept</contentConcept>
+<contentDate>XXX</contentDate>
+<contentDescription>contentDescription</contentDescription>
+<contentEventName>contentEventName</contentEventName>
+<contentEventNameType>contentEventNameType</contentEventNameType>
+<contentNote>contentNote</contentNote>
+<contentLanguage>contentLanguage</contentLanguage>
+<contentObject>contentObject</contentObject>
+<contentObjectType>contentObjectType</contentObjectType>
+<contentOrganization>contentOrganization</contentOrganization>
+<contentOther>contentOther</contentOther>
+<contentOtherType>contentOtherType</contentOtherType>
+<contentPeople>contentPeople</contentPeople>
+<contentPerson>contentPerson</contentPerson>
+<contentPlace>contentPlace</contentPlace>
+<contentPosition>contentPosition</contentPosition>
+<contentScript>XXX</contentScript>
+<copyNumber>copyNumber</copyNumber>
+<dimension>dimension</dimension>
+<dimensionMeasuredPart>dimensionMeasuredPart</dimensionMeasuredPart>
+<dimensionMeasurementUnit>dimensionMeasurementUnit</dimensionMeasurementUnit>
+<dimensionValue>dimensionValue</dimensionValue>
+<dimensionValueDate>XXX</dimensionValueDate>
+<dimensionValueQualifier>dimensionValueQualifier</dimensionValueQualifier>
+<editionNumber>editionNumber</editionNumber>
+<form>form</form>
+<inscriptionContent>inscriptionContent</inscriptionContent>
+<inscriber>inscriber</inscriber>
+<inscriptionDate>inscriptionDate</inscriptionDate>
+<inscriptionInterpretation>inscriptionInterpretation</inscriptionInterpretation>
+<inscriptionLanguage>inscriptionLanguage</inscriptionLanguage>
+<inscriptionMethod>inscriptionMethod</inscriptionMethod>
+<inscriptionPosition>inscriptionPosition</inscriptionPosition>
+<inscriptionScript>inscriptionScript</inscriptionScript>
+<inscriptionTranslation>inscriptionTranslation</inscriptionTranslation>
+<inscriptionTransliteration>inscriptionTransliteration</inscriptionTransliteration>
+<inscriptionType>inscriptionType</inscriptionType>
+<inscriptionDescription>inscriptionDescription</inscriptionDescription>
+<inscriptionDescriptionInscriber>inscriptionDescriptionInscriber</inscriptionDescriptionInscriber>
+<inscriptionDescriptionDate>inscriptionDescriptionDate</inscriptionDescriptionDate>
+<inscriptionDescriptionInterpretation>inscriptionDescriptionInterpretation</inscriptionDescriptionInterpretation>
+<inscriptionDescriptionMethod>inscriptionDescriptionMethod</inscriptionDescriptionMethod>
+<inscriptionDescriptionPosition>inscriptionDescriptionPosition</inscriptionDescriptionPosition>
+<inscriptionDescriptionType>inscriptionDescriptionType</inscriptionDescriptionType>
+<material>material</material>
+<materialComponent>materialComponent</materialComponent>
+<materialComponentNote>materialComponentNote</materialComponentNote>
+<materialName>materialName</materialName>
+<materialSource>materialSource</materialSource>
+<objectStatus>objectStatus</objectStatus>
+<phase>phase</phase>
+<physicalDescription>physicalDescription</physicalDescription>
+<sex>sex</sex>
+<style>style</style>
+<technicalAttribute>technicalAttribute</technicalAttribute>
+<technicalAttributeMeasurement>technicalAttributeMeasurement</technicalAttributeMeasurement>
+<technicalAttributeMeasurementUnit>technicalAttributeMeasurementUnit</technicalAttributeMeasurementUnit>
+<objectComponentName>objectComponentName</objectComponentName>
+<objectComponentInformation>objectComponentInformation</objectComponentInformation>
+<dateAssociation>dateAssociation</dateAssociation>
+<dateEarliestSingle>{"level":"objectLevel","content-script":"descContentScript","content-method":"descContentMethod","otherNumber":"otherNumber"}</dateEarliestSingle>
+<dateEarliestSingleCertainty>dateEarliestSingleCertainty</dateEarliestSingleCertainty>
+<dateEarliestSingleQualifier>dateEarlierstSingleQualifier</dateEarliestSingleQualifier>
+<dateLatest>XXX</dateLatest>
+<dateLatestCertainty>dateLatestCertainty</dateLatestCertainty>
+<dateLatestQualifier>dateLatestQualifier</dateLatestQualifier>
+<datePeriod>datePeriod</datePeriod>
+<dateText>dateText</dateText>
+</ns2:collectionobjects_common> 
index 57c580f237ed21311246641bd180eb97bdb9e4bf..32658cf428742bdd4f91ca073f0acfa789983c0c 100644 (file)
@@ -97,19 +97,25 @@ public class DocumentUtils {
         HashMap<String, Object> objectProps = new HashMap<String, Object>();
         // Get a list of all elements in the document
         Node root = document.getFirstChild();
-        NodeList nodeChildren = root.getChildNodes();
-        for (int i = 0; i < nodeChildren.getLength(); i++) {
-            Node node = nodeChildren.item(i);
+        NodeList rootChildren = root.getChildNodes();
+        for (int i = 0; i < rootChildren.getLength(); i++) {
+            Node node = rootChildren.item(i);
+            String name = node.getNodeName();
             if (node.getNodeType() == Node.ELEMENT_NODE) {
-                NodeList childNodes = node.getChildNodes();
-                Node cnode = childNodes.item(0);
-                if (cnode != null) {
-                    if (cnode.getNodeType() == Node.TEXT_NODE) {
-                        objectProps.put(node.getNodeName(), getTextNodeValue(node));
+                NodeList nodeChildren = node.getChildNodes();
+                int nodeChildrenLen = nodeChildren.getLength();
+                Node firstChild = nodeChildren.item(0);
+                Object value = null;
+                if (firstChild != null) {
+                    //first child node could be a whitespace char CSPACE-1026
+                    //so, check for number of children too
+                    if (firstChild.getNodeType() == Node.TEXT_NODE
+                            && nodeChildrenLen == 1) {
+                        value = getTextNodeValue(node);
                     } else {
-                        String[] vals = getMultiValues(node);
-                        objectProps.put(node.getNodeName(), vals);
+                        value = getMultiValues(node);
                     }
+                    objectProps.put(name, value);
                 }
             }
         }
@@ -118,15 +124,25 @@ public class DocumentUtils {
 
     /**
      * getMultiValues retrieve multi-value element values
+     * assumption: backend does not support more than 1 level deep hierarchy
      * @param node
      * @return
      */
     private static String[] getMultiValues(Node node) {
         ArrayList<String> vals = new ArrayList<String>();
-        NodeList children = node.getChildNodes();
-        for (int i = 0; i < children.getLength(); i++) {
-            Node cnode = children.item(i);
-            vals.add(qualify(cnode.getNodeName(), getTextNodeValue(cnode)));
+        NodeList nodeChildren = node.getChildNodes();
+        for (int i = 0; i < nodeChildren.getLength(); i++) {
+            Node child = nodeChildren.item(i);
+            String name = child.getNodeName();
+            //assumption: backend does not support more than 1 level deep
+            //hierarchy
+            String value = null;
+            if (child.getNodeType() == Node.ELEMENT_NODE) {
+                value = getTextNodeValue(child);
+                vals.add(qualify(name, value));
+            } else {
+                //skip text nodes with whitespaces
+            }
         }
         return vals.toArray(new String[0]);
     }
@@ -142,7 +158,7 @@ public class DocumentUtils {
         if (ccnode != null && ccnode.getNodeType() == Node.TEXT_NODE) {
             value = ccnode.getNodeValue();
         }
-        return value;
+        return value.trim();
     }
 
     /**
index 95bb2eff16e006ddb208b2d0dc9af3b69baf7cba..a797a30ea87b8445702db7338cb42b0903ff35cd 100644 (file)
                 <artifactId>commons-httpclient</artifactId>
                 <version>3.1</version>
             </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>1.4</version>
+            </dependency>
             <dependency>
                 <groupId>com.sun.xml.bind</groupId>
                 <artifactId>jaxb-impl</artifactId>