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
<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
<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
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
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
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
}
@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)
}
- 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,
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;
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));
+ }
}
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
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);
}
}
}
/**
* 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]);
}
if (ccnode != null && ccnode.getNodeType() == Node.TEXT_NODE) {
value = ccnode.getNodeValue();
}
- return value;
+ return value.trim();
}
/**
<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>