]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
DRYD-205: Added service for parsing display date strings into structured date strings...
authorremillet <remillet@yahoo.com>
Wed, 31 Jan 2018 04:35:28 +0000 (20:35 -0800)
committerremillet <remillet@yahoo.com>
Wed, 31 Jan 2018 04:35:28 +0000 (20:35 -0800)
66 files changed:
services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-Both-Template.res.xml [new file with mode: 0644]
services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml [new file with mode: 0644]
services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/structureddate.xml [new file with mode: 0644]
services/JaxRsServiceProvider/pom.xml
services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java
services/common/src/main/cspace/config/services/tenants/tenant-bindings-proto-unified.xml
services/common/src/main/cspace/config/services/tenants/tenant-bindings.touchstone.xml [deleted file]
services/common/src/main/java/org/collectionspace/services/common/config/ServiceConfigUtils.java
services/common/src/main/java/org/collectionspace/services/common/context/AbstractServiceContextImpl.java
services/common/src/main/java/org/collectionspace/services/common/security/SecurityInterceptor.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RemoteSubItemDocumentModelHandlerImpl.java
services/config/src/main/resources/service.xsd
services/loanin/service/pom.xml
services/structureddate/client/pom.xml [new file with mode: 0644]
services/structureddate/client/src/main/java/org/collectionspace/services/structureddate/StructuredDateClient.java [new file with mode: 0644]
services/structureddate/client/src/test/resources/log4j.properties [new file with mode: 0644]
services/structureddate/jaxb/pom.xml [new file with mode: 0644]
services/structureddate/jaxb/src/main/resources/structureddate-common.xsd [new file with mode: 0644]
services/structureddate/pom.xml
services/structureddate/service/pom.xml [new file with mode: 0644]
services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructuredDateResource.java [new file with mode: 0644]
services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructureddateDocumentHandler.java [new file with mode: 0644]
services/structureddate/service/src/test/resources/log4j.xml [new file with mode: 0644]
services/structureddate/structureddate/README.txt [moved from services/structureddate/README.txt with 100% similarity]
services/structureddate/structureddate/pom.xml [new file with mode: 0644]
services/structureddate/structureddate/src/main/antlr4/org/collectionspace/services/structureddate/antlr/StructuredDate.g4 [moved from services/structureddate/src/main/antlr4/org/collectionspace/services/structureddate/antlr/StructuredDate.g4 with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/Certainty.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/Certainty.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/Date.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/Date.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DateUtils.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DateUtils.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredCenturyStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredDecadeStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredHalfCenturyStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMillenniumStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMonthEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredMonthEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialCenturyStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredPartialDecadeStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyEndDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyEndDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyStartDate.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/DeferredQuarterCenturyStartDate.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/Era.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/Era.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/InvalidDateException.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/InvalidDateException.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/ParseDates.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/ParseDates.java with 97% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/Part.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/Part.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/QualifierType.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/QualifierType.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/QualifierUnit.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/QualifierUnit.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDateEvaluator.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDateEvaluator.java with 50% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDateFormatException.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDateFormatException.java with 100% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDateInternal.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/StructuredDate.java with 96% similarity]
services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java [moved from services/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java with 99% similarity]
services/structureddate/structureddate/src/test/java/org/collectionspace/services/structureddate/StructuredDateEvaluatorTest.java [moved from services/structureddate/src/test/java/org/collectionspace/services/structureddate/StructuredDateEvaluatorTest.java with 86% similarity]
services/structureddate/structureddate/src/test/java/org/collectionspace/services/structureddate/StructuredDateTest.java [moved from services/structureddate/src/test/java/org/collectionspace/services/structureddate/StructuredDateTest.java with 100% similarity]
services/structureddate/structureddate/src/test/resources/log4j.properties [moved from services/structureddate/src/test/resources/log4j.properties with 100% similarity]
services/structureddate/structureddate/src/test/resources/test-dates.yaml [moved from services/structureddate/src/test/resources/test-dates.yaml with 100% similarity]

diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-Both-Template.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-Both-Template.res.xml
new file mode 100644 (file)
index 0000000..9feb343
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:structureddate_common xmlns:ns2="http://collectionspace.org/services/structureddate">
+    <earliestSingleDate>
+        <year>${earliestYear}</year>
+        <month>${earliestMonth}</month>
+        <day>${earliestDay}</day>
+        <era>urn:cspace:testsci.collectionspace.org:vocabularies:name(dateera):item:name(${earliestEraShortId})'${earliestEraShortDisplayName}'</era>
+    </earliestSingleDate>
+    <latestDate>
+        <year>${latestYear}</year>
+        <month>${latestMonth}</month>
+        <day>${latestDay}</day>
+        <era>urn:cspace:testsci.collectionspace.org:vocabularies:name(dateera):item:name(${latestEraShortId})'${latestEraShortDisplayName}'</era>
+    </latestDate>
+    <scalarValuesComputed>false</scalarValuesComputed>
+</ns2:structureddate_common>
\ No newline at end of file
diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml
new file mode 100644 (file)
index 0000000..dc64393
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:structureddate_common xmlns:ns2="http://collectionspace.org/services/structureddate">
+    <earliestSingleDate>
+        <year>${earliestYear}</year>
+        <month>${earliestMonth}</month>
+        <day>${earliestDay}</day>
+        <era>urn:cspace:testsci.collectionspace.org:vocabularies:name(dateera):item:name(${earliestEraShortId})'${earliestEraShortDisplayName}'</era>
+    </earliestSingleDate>
+    <scalarValuesComputed>false</scalarValuesComputed>
+</ns2:structureddate_common>
\ No newline at end of file
diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/structureddate.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/structureddate/structureddate.xml
new file mode 100644 (file)
index 0000000..c1ee0a0
--- /dev/null
@@ -0,0 +1,450 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmlReplay>
+    <auths>
+        <!-- IMPORTANT: THESE ARE STICKY :: THEY STICK AROUND UNTIL RESET, IN EXEC ORDER OF THIS FILE. -->
+        <auth ID="admin@testsci.collectionspace.org">YWRtaW5AdGVzdHNjaS5jb2xsZWN0aW9uc3BhY2Uub3JnOkFkbWluaXN0cmF0b3I=</auth>
+        <auth ID="admin@core.collectionspace.org">YWRtaW5AY29yZS5jb2xsZWN0aW9uc3BhY2Uub3JnOkFkbWluaXN0cmF0b3I=</auth>
+    </auths>
+
+    <testGroup ID="StructuredDate" autoDeletePOSTS="true">
+        <test ID="EmptyRequestBad" auth="admin@testsci.collectionspace.org">
+            <expectedCodes>400</expectedCodes>
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=</uri>
+        </test>
+        <test ID="Malformed - Octo 19, 1821" auth="admin@testsci.collectionspace.org">
+            <expectedCodes>400</expectedCodes>
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=Octo+19,+1821</uri>
+        </test>
+        <test ID="1977" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1977</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1977</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1977</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 BC" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+BC</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 bc" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+bc</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 B.C." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+B.C.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 b.c." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+b.c.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 BCE" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+BCE</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 bce" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+bce</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 B.C.E." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+B.C.E.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="53 b.c.e." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=53+b.c.e.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">53</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">bce</var>
+                    <var ID="earliestEraShortDisplayName">BCE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">53</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">bce</var>
+                    <var ID="latestEraShortDisplayName">BCE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 AD" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+AD</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 ad" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+ad</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 A.D." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+A.D.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 a.d." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+a.d.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 c.e." auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+c.e.</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1974 ce" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1974+ce</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1974</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1974</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="1800's-1900's" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=1800%27s-1900%27s</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1800</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1999</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-Both-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="ca. 1730's" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=ca.+1730%27s</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1711</var>
+                    <var ID="earliestMonth">1</var>
+                    <var ID="earliestDay">1</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                    <!-- latestDate -->
+                    <var ID="latestYear">1757</var>
+                    <var ID="latestMonth">12</var>
+                    <var ID="latestDay">31</var>
+                    <var ID="latestEraShortId">ce</var>
+                    <var ID="latestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml</filename>
+            </response>
+        </test>
+        <!--
+            ***
+
+            Adding more tests here - https://github.com/collectionspace/services/blob/master/services/structureddate/src/test/resources/test-dates.yaml
+
+            ***
+        -->
+        <test ID="3/12/2013" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=3%2F12%2F2013</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">2013</var>
+                    <var ID="earliestMonth">3</var>
+                    <var ID="earliestDay">12</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="7-6-1773" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=7-6-1773</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1773</var>
+                    <var ID="earliestMonth">7</var>
+                    <var ID="earliestDay">6</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml</filename>
+            </response>
+        </test>
+        <test ID="07-06-1773" auth="admin@testsci.collectionspace.org">
+            <method>GET</method>
+            <uri>/cspace-services/structureddates/?dateToParse=07-06-1773</uri>
+            <response>
+                <vars>
+                    <!-- earliestSingleDate -->
+                    <var ID="earliestYear">1773</var>
+                    <var ID="earliestMonth">7</var>
+                    <var ID="earliestDay">6</var>
+                    <var ID="earliestEraShortId">ce</var>
+                    <var ID="earliestEraShortDisplayName">CE</var>
+                </vars>
+                <expected level="ADDOK"></expected>
+                <filename>structureddate/responses/GetStructuredDate-earliestSingleDate-Template.res.xml</filename>
+            </response>
+        </test>
+    </testGroup>
+</xmlReplay>
index 76070e3e5e74608451d78670f602bdb930765435..898791f5241336960436b2fc1b12adf41bd68395 100644 (file)
              <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.structureddate.service</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>        
             <groupId>org.collectionspace.services</groupId>
             <artifactId>org.collectionspace.services.media.service</artifactId>
             <version>${project.version}</version>
index 8fcb91877dff240926483e4f35171cc4f57f28d5..5523e8a11197615d578a84c6c20bb0ed28a79a3c 100644 (file)
@@ -49,6 +49,7 @@ import org.collectionspace.services.report.ReportResource;
 import org.collectionspace.services.acquisition.AcquisitionResource;
 import org.collectionspace.services.dimension.DimensionResource;
 import org.collectionspace.services.servicegroup.ServiceGroupResource;
+import org.collectionspace.services.structureddate.StructuredDateResource;
 import org.collectionspace.services.contact.ContactResource;
 import org.collectionspace.services.vocabulary.VocabularyResource;
 import org.collectionspace.services.organization.OrgAuthorityResource;
@@ -106,6 +107,7 @@ public class CollectionSpaceJaxRsApplication extends Application
         singletons.add(new PermissionResource());
         singletons.add(new ServiceGroupResource());
         singletons.add(new ImportsResource());
+        singletons.add(new StructuredDateResource());
 
         addResourceToMapAndSingletons(new VocabularyResource());
         addResourceToMapAndSingletons(new PersonAuthorityResource());
index 7d759a1d99d6525b8c8d79bf16bbe36a446eb25d..706cf5b4cb6cb641d6b21a27dc94b8d2fea3e51b 100644 (file)
                <!-- begin servicegroup service meta-data -->
                <!-- Servicegroup is a task service that has no representation in the repo, but provides tools like keyword search across 
                        many types of services. -->
-               <tenant:serviceBindings id="servicegroups" merge:matcher="id" name="servicegroups" type="utility"
-                       version="1.0">
+           <tenant:serviceBindings id="servicegroups" merge:matcher="id" name="servicegroups" requiresDocumentHandler="false" type="utility" version="1.0">
                        <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-                       <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.servicegroup.nuxeo.ServiceGroupDocumentModelHandler
+                       <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">
+                           org.collectionspace.services.servicegroup.nuxeo.ServiceGroupDocumentModelHandler
                        </service:documentHandler>
                </tenant:serviceBindings>
                <!-- end servicegroup service meta-data -->
+           
+           <!-- begin structureddate service meta-data -->
+           <!-- structureddate is a task service that has no representation in the repo, but provides a date string parsing service. -->
+           <tenant:serviceBindings id="structureddates" merge:matcher="id" name="structureddates" type="utility"
+               version="1.0">
+               <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
+               <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">
+                   org.collectionspace.services.structureddate.StructureddateDocumentHandler
+               </service:documentHandler>
+           </tenant:serviceBindings>
+           <!-- end structureddate service meta-data -->
 
                <!-- begin blob service meta-data -->
                <!-- This should likely be type="object" -->
diff --git a/services/common/src/main/cspace/config/services/tenants/tenant-bindings.touchstone.xml b/services/common/src/main/cspace/config/services/tenants/tenant-bindings.touchstone.xml
deleted file mode 100644 (file)
index d585c8c..0000000
+++ /dev/null
@@ -1,2748 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<tenant:TenantBindingConfig xmlns:tenant="http://collectionspace.org/services/config/tenant" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://collectionspace.org/services/config/tenant http://collectionspace.org/services/config/tenant.xsd">
-  <tenant:tenantBinding id="2" name="testsci.collectionspace.org" displayName="Default tenant testsci" version="0.1">
-    <tenant:repositoryDomain name="default-domain" storageName="testsci_domain" repositoryClient="nuxeo-java" repositoryName="testsci_domain" />
-    <tenant:properties>
-      <types:item xmlns:types="http://collectionspace.org/services/config/types">
-        <types:key>datePattern</types:key>
-        <types:value>MM/dd/yyyy</types:value>
-      </types:item>
-      <types:item xmlns:types="http://collectionspace.org/services/config/types">
-        <types:key>datePattern</types:key>
-        <types:value>MMM dd, yyyy</types:value>
-      </types:item>
-      <types:item xmlns:types="http://collectionspace.org/services/config/types">
-        <types:key>datePattern</types:key>
-        <types:value>dd.MM.yyyy</types:value>
-      </types:item>
-      <types:item xmlns:types="http://collectionspace.org/services/config/types">
-        <types:key>localeLanguage</types:key>
-        <types:value>en</types:value>
-      </types:item>
-    </tenant:properties>
-    <tenant:serviceBindings id="Accounts" name="Accounts" type="security" version="1.1">
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.account.storage.AccountDocumentHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>personRefName</service:element>
-              <service:xpath>personRefName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>status</service:element>
-              <service:xpath>status</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>email</service:element>
-              <service:xpath>email</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>screenName</service:element>
-              <service:xpath>screenName</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.account.storage.AccountValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Account" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="accounts-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="accounts_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/account" schemaLocation="http://collectionspace.org/services/account http://services.collectionspace.org/account/accounts_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Persons" id="Persons" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.person.nuxeo.PersonDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>surName</service:element>
-              <service:xpath>personTermGroupList/[0]/surName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>foreName</service:element>
-              <service:xpath>personTermGroupList/[0]/foreName</service:xpath>
-            </service:ListResultField>
-                                               <service:ListResultField>
-              <service:element>entityType</service:element>
-              <service:schema>persons_naturalhistory</service:schema>
-              <service:xpath>entityType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.person.nuxeo.PersonValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>persons_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>persontermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-          <service:field>
-            <service:table>persons_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>personTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Person" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="persons-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="persons_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/person" schemaLocation="http://collectionspace.org/services/person http://services.collectionspace.org/person/persons_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>birthPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>deathPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>personTermGroupList/*/termType</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="3" control_group="Managed" versionable="true" auditable="false" label="persons_naturalhistory" updated="" order="3">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/person/domain/naturalhistory" schemaLocation="http://collectionspace.org/services/person/domain/naturalhistory http://collectionspace.org/services/person/domain/persons_naturalhistory.xsd" />
-          </service:content>
-          <service:properties>
-            <!-- See CSPACE-3938 for potential additional authRef and termRef entries -->
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>affiliatedPersonOrgGroupList/*/affiliatedPersonOrg</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>orgContactNames|orgContactName</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>affiliatedPersonOrgGroupList/*/affiliatedPersonOrgType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>nameTypes|nameType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>nameSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>entityType</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Personauthorities" id="Personauthorities" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.person.nuxeo.PersonAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.person.nuxeo.PersonAuthorityValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>personauthorities_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>personauthorities_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Personauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="personauthorities-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="personauthorities_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/person" schemaLocation="http://collectionspace.org/services/person http://services.collectionspace.org/person/personauthorities_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Concepts" id="Concepts" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.concept.nuxeo.ConceptDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.concept.nuxeo.ConceptValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>concepttermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-          <service:field>
-            <service:table>concepts_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>concepts_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>conceptTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Conceptitem" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="concepts-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="concepts_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/concept" schemaLocation="http://collectionspace.org/services/concept http://services.collectionspace.org/concept/concepts_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>conceptTermGroupList/*/termLanguage</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Conceptauthorities" id="Conceptauthorities" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.concept.nuxeo.ConceptAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>conceptauthorities_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>conceptauthorities_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Conceptauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="conceptauthorities-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="conceptauthorities_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/concept" schemaLocation="http://collectionspace.org/services/concept http://services.collectionspace.org/concept/conceptauthorities_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Locations" id="Locations" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.location.nuxeo.LocationDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.location.nuxeo.LocationValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>loctermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-          <service:field>
-            <service:table>locations_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>locations_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>locTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Locationitem" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="locations-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="locations_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/location" schemaLocation="http://collectionspace.org/services/location http://services.collectionspace.org/location/locations_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>locTermGroupList/*/termLanguage</types:value>
-            </types:item>
-                                               <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>locationType</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Locationauthorities" id="Locationauthorities" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.location.nuxeo.LocationAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>locationauthorities_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>locationauthorities_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Locationauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="locationauthorities-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="locationauthorities_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/location" schemaLocation="http://collectionspace.org/services/location http://services.collectionspace.org/location/locationauthorities_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings id="Loansin" name="Loansin" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.loanin.nuxeo.LoaninDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>loanInNumber</service:element>
-              <service:xpath>loanInNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>loanReturnDate</service:element>
-              <service:xpath>loanReturnDate</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>lender</service:element>
-              <service:xpath>lenderGroupList/[0]/lender</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.loanin.nuxeo.LoaninValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>lenderGroupList/[0]/lender</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>loanInNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Loanin" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="loansin-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="loansin_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/loanin" schemaLocation="http://collectionspace.org/services/loanin http://services.collectionspace.org/loanin/loansin_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>lenderGroupList/*/lendersContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>lenderGroupList/*/lendersAuthorizer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>borrowersAuthorizer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>loanStatusGroupList/*/loanStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>borrowersContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>lenderGroupList/*/lender</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>loanPurpose</types:value>
-            </types:item>
-          </service:properties>
-          </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings id="Loansout" name="Loansout" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.loanout.nuxeo.LoanoutDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>borrower</service:element>
-              <service:xpath>borrower</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>loanOutNumber</service:element>
-              <service:xpath>loanOutNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>loanReturnDate</service:element>
-              <service:xpath>loanReturnDate</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.loanout.nuxeo.LoanoutValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>borrower</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>loanOutNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Loanout" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="loansout-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="loansout_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/loanout" schemaLocation="http://collectionspace.org/services/loanout http://services.collectionspace.org/loanout/loansout_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>borrower</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>lendersContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>lendersAuthorizer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>borrowersAuthorizer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>loanStatusGroupList/*/loanStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>borrowersContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>loanPurpose</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>    
-    <tenant:serviceBindings id="Acquisitions" name="Acquisitions" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.acquisition.nuxeo.AcquisitionDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>acquisitionReferenceNumber</service:element>
-              <service:xpath>acquisitionReferenceNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>acquisitionSource</service:element>
-              <service:xpath>acquisitionSources/[0]</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>owner</service:element>
-              <service:xpath>owners/[0]</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.acquisition.nuxeo.AcquisitionValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>acquisitionSources/[0]</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>acquisitionReferenceNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Acquisition" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="acquisitions-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="acquisitions_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/acquisition" schemaLocation="http://collectionspace.org/services/acquisition http://services.collectionspace.org/acquisition/acquisitions_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectOfferPriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>acquisitionFundingList/*/acquisitionFundingSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>groupPurchasePriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectPurchasePriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>acquisitionFundingList/*/acquisitionFundingCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>originalObjectPurchasePriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>acquisitionSources|acquisitionSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>owners|owner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectPurchaseOfferPriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>acquisitionAuthorizer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>acquisitionMethod</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Organizations" id="Organizations" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.organization.nuxeo.OrganizationDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.organization.nuxeo.OrganizationValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>organizations_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>organizations_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-          <service:field>
-            <service:table>orgtermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>orgTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Organization" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="organizations-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="organizations_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/organization" schemaLocation="http://collectionspace.org/services/organization http://services.collectionspace.org/organization/organizations_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contactNames|contactName</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>orgTermGroupList/*/termLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>foundingPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>orgTermGroupList/*/termType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>orgTermGroupList/*/termStatus</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <tenant:serviceBindings name="Orgauthorities" id="Orgauthorities" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.organization.nuxeo.OrgAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.organization.nuxeo.OrgAuthorityValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>orgauthorities_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>orgauthorities_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Orgauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="orgauthorities-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="orgauthorities_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/organization" schemaLocation="http://collectionspace.org/services/organization http://services.collectionspace.org/organization/orgauthorities_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-<tenant:serviceBindings id="CollectionObjects" name="CollectionObjects" type="object" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.collectionobject.nuxeo.CollectionObjectDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:RefnameDisplayNameField>
-            <service:element>objectNumber</service:element>
-            <service:xpath>objectNumber</service:xpath>
-          </service:RefnameDisplayNameField>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>title</service:element>
-              <service:xpath>titleGroupList/[0]/title</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>objectNumber</service:element>
-              <service:xpath>objectNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>objectName</service:element>
-              <service:xpath>objectNameList/[0]/objectName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>responsibleDepartment</service:element>
-              <service:xpath>responsibleDepartments/[0]</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>taxon</service:element>
-              <service:schema>collectionobjects_naturalhistory</service:schema>
-              <service:xpath>taxonomicIdentGroupList/[0]/taxon</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.collectionobject.nuxeo.CollectionObjectValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>objectNameList/[0]/objectName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>objectNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="CollectionObject" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="collectionobjects-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="collectionobjects_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/collectionobject" schemaLocation="http://collectionspace.org/services/collectionobject http://services.collectionspace.org/collectionobject/collectionobjects_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocEventPersons|assocEventPerson</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>textualInscriptionGroupList/*/inscriptionContentInscriber</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>fieldCollectionMethods|fieldCollectionMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ownershipExchangePriceCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentOrganizations|contentOrganization</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>objectProductionPersonGroupList/*/objectProductionPerson</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectors|fieldCollector</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>contentLanguages|contentLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentConcepts|contentConcept</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocOrganizationGroupList/*/assocOrganization</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>nonTextualInscriptionGroupList/*/inscriptionDescriptionInscriber</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>textualInscriptionGroupList/*/inscriptionContentLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measuredBy</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentPersons|contentPerson</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>objectProductionOrganizationGroupList/*/objectProductionOrganization</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocPersonGroupList/*/assocPerson</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectNameList/*/objectNameLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocEventOrganizations|assocEventOrganization</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ageQualifier</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectionPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocConceptGroupList/*/assocConcept</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectionSources|fieldCollectionSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>owners|owner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>titleGroupList/*/titleLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>titleGroupList/*/titleTranslationSubGroupList/*/titleTranslationLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>computedCurrentLocation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentActivities|contentActivity</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentEventNameGroupList/*/contentEventNameType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentOtherGroupList/*/contentOther</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentOtherGroupList/*/contentOtherType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contentPlaces|contentPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>nonTextualInscriptionGroupList/*/inscriptionDescriptionMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>materialGroupList/*/material</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>materialGroupList/*/materialComponent</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>materialGroupList/*/materialSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>styles|style</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>objectComponentGroupList/*/objectComponentName</types:value>
-            </types:item>
-            <!-- Object Production Information group -->
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>objectProductionPlaceGroupList/*/objectProductionPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>techniqueGroupList/*/technique</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>techniqueGroupList/*/techniqueType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>assocPlaceGroupList/*/assocPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>otherNumberList/*/numberType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectNameList/*/objectNameCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectNameList/*/objectNameLevel</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectNameList/*/objectNameSystem</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectNameList/*/objectNameType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>responsibleDepartments|responsibleDepartment</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>collection</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>titleGroupList/*/titleType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>recordStatus</types:value>
-            </types:item>
-            <!-- Object Description Information group -->
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ageUnit</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>contentObjectGroupList/*/contentObjectType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>contentPositions|contentPosition</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>contentScripts|contentScript</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/measuredPart</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/dimension</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measurementUnit</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measurementMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>forms|form</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>textualInscriptionGroupList/*/inscriptionContentPosition</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>textualInscriptionGroupList/*/inscriptionContentScript</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>textualInscriptionGroupList/*/inscriptionContentType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>nonTextualInscriptionGroupList/*/inscriptionDescriptionPosition</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>nonTextualInscriptionGroupList/*/inscriptionDescriptionType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectStatusList|objectStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>phase</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>sex</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>technicalAttributeGroupList/*/technicalAttribute</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>technicalAttributeGroupList/*/technicalAttributeMeasurement</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>technicalAttributeGroupList/*/technicalAttributeMeasurementUnit</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>objectComponentGroupList/*/objectComponentInformation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>assocActivityGroupList/*/assocActivity</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>assocCulturalContextGroupList/*/assocCulturalContext</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>assocObjectGroupList/*/assocObject</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>assocObjectGroupList/*/assocObjectType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ownershipAccess</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ownershipCategory</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>ownershipExchangeMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>usageGroupList/*/usage</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="3" control_group="Managed" versionable="true" auditable="false" label="collectionobjects_naturalhistory" updated="" order="3">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/collectionobject/domain/naturalhistory" schemaLocation="http://collectionspace.org/services/collectionobject/domain/naturalhistory http://collectionspace.org/services/collectionobject/domain/collectionobjects_naturalhistory.xsd" />
-          </service:content>
-          <!-- Include authRefs for fields in the added schema -->
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>taxonomicIdentGroupList/*/taxon</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>taxonomicIdentGroupList/*/identBy</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>taxonomicIdentGroupList/*/institution</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>associatedTaxaGroupList/*/taxon</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>    
-    
-    <tenant:serviceBindings id="Vocabularies" name="Vocabularies" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.vocabulary.nuxeo.VocabularyDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.vocabulary.nuxeo.VocabularyValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>vocabularies_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>vocabularies_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Vocabulary" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="vocabularies-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="vocabularies_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/vocabulary" schemaLocation="http://collectionspace.org/services/vocabulary http://services.collectionspace.org/vocabulary/vocabularies_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Movements" name="Movements" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.movement.nuxeo.MovementDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsVersioning>true</service:SupportsVersioning>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>movementReferenceNumber</service:element>
-              <service:xpath>movementReferenceNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>locationDate</service:element>
-              <service:xpath>locationDate</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>currentLocation</service:element>
-              <service:xpath>currentLocation</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.movement.nuxeo.MovementValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>currentLocation</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>movementReferenceNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>movements_common</service:table>
-            <service:col>locationdate</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Movement" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="movements-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="movements_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/movement" schemaLocation="http://collectionspace.org/services/movement http://services.collectionspace.org/movement/movements_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>normalLocation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>movementContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>inventoryContactList|inventoryContact</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>currentLocation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>currentLocationFitness</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>movementMethods|movementMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>reasonForMove</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>inventoryActionRequired</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>frequencyForInventory</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Vocabularyitems" name="Vocabularyitems" type="vocabulary" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.vocabulary.nuxeo.VocabularyItemDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:RefnameDisplayNameField>
-            <service:ListResultField>
-              <service:element>order</service:element>
-              <service:xpath>order</service:xpath>
-            </service:ListResultField>
-          </service:RefnameDisplayNameField>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>order</service:element>
-              <service:xpath>order</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.vocabulary.nuxeo.VocabularyItemValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>vocabularyitems_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-          <service:field>
-            <service:table>vocabularyitems_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-          <service:field>
-            <service:table>vocabularyitems_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>displayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Vocabularyitem" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="vocabularyitems-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="vocabularyitems_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/vocabulary" schemaLocation="http://collectionspace.org/services/vocabulary http://services.collectionspace.org/vocabulary/vocabularyitems_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Places" name="Places" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.place.nuxeo.PlaceDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.place.nuxeo.PlaceValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>places_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-          <service:field>
-            <service:table>places_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>placetermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>placeTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Placeitem" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="places-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="places_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/place" schemaLocation="http://collectionspace.org/services/place http://services.collectionspace.org/place/places_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>placeGeoRefGroupList/*/geoReferencedBy</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>placeOwnerGroupList/*/owner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeTermGroupList/*/termLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeTermGroupList/*/termType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeTermGroupList/*/termStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeTermGroupList/*/historicalStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>vCoordSys</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>vSpatialReferenceSystem</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>vUnitofMeasure</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeGeoRefGroupList/*/geodeticDatum</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeGeoRefGroupList/*/geoRefProtocol</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>placeGeoRefGroupList/*/geoRefVerificationStatus</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Placeauthorities" name="Placeauthorities" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.place.nuxeo.PlaceAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>placeauthorities_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>placeauthorities_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Placeauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="placeauthorities-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="placeauthorities_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/place" schemaLocation="http://collectionspace.org/services/place http://services.collectionspace.org/place/placeauthorities_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Taxon" name="Taxon" type="authority" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.taxonomy.nuxeo.TaxonDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:SupportsHierarchy>true</service:SupportsHierarchy>
-          <service:ListResultsFields>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.taxonomy.nuxeo.TaxonValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>taxon_common</service:table>
-            <service:col>inauthority</service:col>
-          </service:field>
-          <service:field>
-            <service:table>taxontermgroup</service:table>
-            <service:col>termdisplayname</service:col>
-          </service:field>
-          <service:field>
-            <service:table>taxon_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>taxonTermGroupList/[0]/termDisplayName</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>shortIdentifier</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Taxon" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="taxon-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="taxon_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/taxonomy" schemaLocation="http://collectionspace.org/services/taxonomy http://services.collectionspace.org/taxonomy/taxon_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>taxonAuthorGroupList/*/taxonAuthor</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>commonNameGroupList/*/commonNameLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonTermGroupList/*/termLanguage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonRank</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonCurrency</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonAuthorGroupList/*/taxonAuthorType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonTermGroupList/*/taxonomicStatus</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonTermGroupList/*/termSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonTermGroupList/*/termType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>taxonTermGroupList/*/termStatus</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Taxonomyauthority" name="Taxonomyauthority" type="utility" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.taxonomy.nuxeo.TaxonomyAuthorityDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>shortIdentifier</service:element>
-              <service:xpath>shortIdentifier</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>vocabType</service:element>
-              <service:xpath>vocabType</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>taxonomyauthority_common</service:table>
-            <service:col>shortidentifier</service:col>
-          </service:field>
-          <service:field>
-            <service:table>taxonomyauthority_common</service:table>
-            <service:col>displayname</service:col>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Taxonomyauthority" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="taxonomyauthority-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="taxonomyauthority_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/taxonomy" schemaLocation="http://collectionspace.org/services/taxonomy http://services.collectionspace.org/taxonomy/taxonomyauthority_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>    
-    <tenant:serviceBindings id="ObjectExit" name="ObjectExit" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.objectexit.nuxeo.ObjectExitDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>currentOwner</service:element>
-              <service:xpath>currentOwner</service:xpath>
-              <service:setter>setCurrentOwner</service:setter>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>exitNumber</service:element>
-              <service:xpath>exitNumber</service:xpath>
-              <service:setter>setExitNumber</service:setter>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.objectexit.nuxeo.ObjectExitValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>currentOwner</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>exitNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="ObjectExit" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="objectexit-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="objectexit_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/objectexit" schemaLocation="http://collectionspace.org/services/objectexit http://services.collectionspace.org/objectexit/objectexit_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>currentOwner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>depositor</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>exitMethods|exitMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>exitReason</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Intakes" name="Intakes" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.intake.nuxeo.IntakeDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>currentOwner</service:element>
-              <service:xpath>currentOwner</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>entryNumber</service:element>
-              <service:xpath>entryNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>depositor</service:element>
-              <service:xpath>depositor</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.intake.nuxeo.IntakeValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>currentOwner</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>entryNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Intake" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="intakes-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="intakes_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/intake" schemaLocation="http://collectionspace.org/services/intake http://services.collectionspace.org/intake/intakes_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>valuer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>currentLocationGroupList/*/currentLocationFitness</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>fieldCollectionMethods|fieldCollectionMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>conditionCheckMethods|conditionCheckMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>insurers|insurer</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectionSources|fieldCollectionSource</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>currentOwner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>entryMethods|entryMethod</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>normalLocation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>conditionCheckersOrAssessors|conditionCheckerOrAssessor</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectors|fieldCollector</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>currentLocationGroupList/*/currentLocation</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>conditionCheckReasons|conditionCheckReason</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>depositor</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>fieldCollectionPlace</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>entryReason</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Groups" name="Groups" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.group.nuxeo.GroupDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>title</service:element>
-              <service:xpath>title</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>owner</service:element>
-              <service:xpath>owner</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.group.nuxeo.GroupValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>owner</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>title</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Group" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="groups-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="groups_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/group" schemaLocation="http://collectionspace.org/services/group http://services.collectionspace.org/group/groups_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>owner</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>responsibleDepartment</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <tenant:serviceBindings id="Media" name="Media" type="procedure" version="1.1">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.media.nuxeo.MediaDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>title</service:element>
-              <service:xpath>title</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>identificationNumber</service:element>
-              <service:xpath>identificationNumber</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>source</service:element>
-              <service:xpath>source</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>filename</service:element>
-              <service:xpath>filename</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>blobCsid</service:element>
-              <service:xpath>blobCsid</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.media.nuxeo.MediaValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>title</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>identificationNumber</types:value>
-        </types:item>
-      </service:properties>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" id="1" name="Media" version="1.1">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="media-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="media_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/media" schemaLocation="http://collectionspace.org/services/media http://services.collectionspace.org/media/media_common.xsd" />
-          </service:content>
-          <service:properties>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>rightsHolder</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>creator</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>publisher</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>contributor</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measuredBy</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>languageList|language</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>coverage</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>typeList|type</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/dimension</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measurementUnit</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>measuredPartGroupList/*/dimensionSubGroupList/*/measurementMethod</types:value>
-            </types:item>
-          </service:properties>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <!-- begin idgenerator service meta-data -->
-    <tenant:serviceBindings id="idgenerators" name="idgenerators" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.RunSqlScripts</service:classname>
-        <service:params>
-          <service:property>
-            <service:key>sqlScriptName</service:key>
-            <service:value>create_id_generators_table.sql</service:value>
-          </service:property>
-          <service:property>
-            <service:key>sqlScriptName</service:key>
-            <service:value>load_id_generators.sql</service:value>
-          </service:property>
-        </service:params>
-      </service:initHandler>
-    </tenant:serviceBindings>
-    <!-- end idgenerator service meta-data -->
-    <!-- begin id service meta-data -->
-    <tenant:serviceBindings id="id" name="id" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!-- 
-                <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                    /idgenerators/*/ids
-                </service:uriPath>
-            -->
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-    </tenant:serviceBindings>
-    <!-- end id service meta-data -->
-    <!-- begin servicegroup service meta-data -->
-    <!-- Servicegroup is a task service that has no representation in the repo, 
-               but provides tools like keyword search across many types of services. 
-        -->
-    <tenant:serviceBindings id="servicegroups" name="servicegroups" type="utility" version="1.0">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.servicegroup.nuxeo.ServiceGroupDocumentModelHandler</service:documentHandler>
-    </tenant:serviceBindings>
-    <!-- end servicegroup service meta-data -->
-    <!-- begin blob service meta-data -->
-    <!-- This should likely be type="object" -->
-    <tenant:serviceBindings id="Blobs" name="Blobs" type="utility" version="1.0">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.blob.nuxeo.BlobDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>name</service:element>
-              <service:xpath>name</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>mimeType</service:element>
-              <service:xpath>mimeType</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>encoding</service:element>
-              <service:xpath>encoding</service:xpath>
-            </service:ListResultField>
-            <service:ListResultField>
-              <service:element>length</service:element>
-              <service:xpath>length</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.blob.nuxeo.BlobValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Blob" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="blob-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="blobs_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/blob" schemaLocation="http://collectionspace.org/services/blob http://services.collectionspace.org/blob/blobs_common.xsd" />
-            <!-- The Blob service has at least one authRef field and two or more termRef fields -->
-            <!-- in its multivalued dimensionGroup. -->
-            <!-- If these require enumeration here, please see authRef and termRef declarations -->
-            <!-- in Media for relevant entries. -->
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="3" control_group="Managed" versionable="true" auditable="false" label="image_metadata" updated="" order="3">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/image_metadata/" schemaLocation="http://collectionspace.org/image_metadata/ http://services.collectionspace.org/image_metadata.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="4" control_group="Managed" versionable="true" auditable="false" label="iptc" updated="" order="4">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/iptc/" schemaLocation="http://collectionspace.org/iptc/ http://services.collectionspace.org/iptc.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end blob service meta-data -->
-    <!-- begin intake service meta-data -->
-    
-    <tenant:serviceBindings id="Batch" name="Batch" type="utility" version="1.0">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.batch.nuxeo.BatchDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>name</service:element>
-              <service:xpath>name</service:xpath>
-              <service:setter>setName</service:setter>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.batch.nuxeo.BatchValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Batch" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="batch-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="batch_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/batch" schemaLocation="http://collectionspace.org/services/batch http://services.collectionspace.org/batch/batch_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end batch service meta-data -->
-    <!-- begin group service meta-data -->
-    
-    <tenant:serviceBindings id="Imports" name="Imports" type="utility" version="1.0">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.imports.nuxeo.ImportsDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>importsField</service:element>
-              <service:xpath>importsField</service:xpath>
-              <service:setter>setImportsField</service:setter>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Imports" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="imports-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="imports_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/imports" schemaLocation="http://collectionspace.org/services/imports http://services.collectionspace.org/imports/imports_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end imports service meta-data -->
-    <!-- begin media service meta-data -->
-    <tenant:serviceBindings id="Workflow" name="Workflow" type="utility" version="1.0">
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.common.workflow.service.nuxeo.WorkflowDocumentModelHandler</service:documentHandler>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.workflow.nuxeo.WorkflowValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Workflow" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="workflow-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="workflow_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/workflow" schemaLocation="http://collectionspace.org/services/workflow http://services.collectionspace.org/movement/workflow_common.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end Workflow service meta-data -->
-    <!-- begin report service meta-data -->
-    <tenant:serviceBindings id="Reports" name="Reports" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /reports/*/output/
-            </service:uriPath>-->
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.report.nuxeo.ReportDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>name</service:element>
-              <service:xpath>name</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.report.nuxeo.ReportValidatorHandler</service:validatorHandler>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.report.nuxeo.ReportPostInitHandler</service:classname>
-        <service:params>
-          <service:property>
-            <service:key>readerRoleName</service:key>
-            <service:value>reader</service:value>
-          </service:property>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Report" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="reports-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="reports_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/report" schemaLocation="http://collectionspace.org/services/report http://services.collectionspace.org/report/reports_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end report service meta-data -->
-    <!-- begin relation service meta-data -->
-    <tenant:serviceBindings id="Relations" name="Relations" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.relation.nuxeo.RelationDocumentModelHandler</service:documentHandler>
-      <!-- Configuration of list results fields for relation items is commented out for now, -->
-      <!-- pending resolution of how to specify nested elements in list results. -->
-      <!--
-            <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-                <service:params>
-                <service:ListResultsFields>
-                    <service:ListResultField>
-                    <service:element>subjectCsid</service:element>
-                    <service:xpath>subjectCsid</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>subjectRefName</service:element>
-                    <service:xpath>subjectRefName</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>relationshipType</service:element>
-                    <service:xpath>relationshipType</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>predicate</service:element>
-                    <service:xpath>predicate</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>predicateDisplayName</service:element>
-                    <service:xpath>predicateDisplayName</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>objectCsid</service:element>
-                    <service:xpath>objectCsid</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>objectRefName</service:element>
-                    <service:xpath>objectRefName</service:xpath>
-                    </service:ListResultField>
-                    <service:ListResultField>
-                    <service:element>relationshipType</service:element>
-                    <service:xpath>relationshipType</service:xpath>
-                    </service:ListResultField>
-                </service:ListResultsFields>
-                </service:params>
-            </service:DocHandlerParams>
-            -->
-      <!--
-                Relation list items can include two additional fields,
-                'subject' and 'object', each of which are parent elements of,
-                and hence containers for, as many as eight child fields.  See
-                services/jaxb/src/main/resources/relations_common.xsd
-            -->
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.relation.nuxeo.RelationValidatorHandler</service:validatorHandler>
-      <service:properties xmlns:service="http://collectionspace.org/services/config/service">
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNameProperty</types:key>
-          <types:value>subjectCsid</types:value>
-        </types:item>
-        <types:item xmlns:types="http://collectionspace.org/services/config/types">
-          <types:key>objectNumberProperty</types:key>
-          <types:value>predicateDisplayName</types:value>
-        </types:item>
-      </service:properties>
-      <service:initHandler xmlns:service="http://collectionspace.org/services/config/service">
-        <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
-        <service:params>
-          <service:field>
-            <service:table>relations_common</service:table>
-            <service:param>subjectcsid,objectcsid</service:param>
-          </service:field>
-        </service:params>
-      </service:initHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Relation" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="relations-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="relations_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/relation" schemaLocation="http://collectionspace.org/services/relation http://services.collectionspace.org/relation/relations_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-    <!-- end report service meta-data -->
-    <!-- begin vocabulary service meta-data -->
-    
-    <tenant:serviceBindings id="Dimensions" name="Dimensions" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <service:uriPath xmlns:service="http://collectionspace.org/services/config/service">/dimensions/workflow/</service:uriPath>
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.dimension.nuxeo.DimensionDocumentModelHandler</service:documentHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Dimension" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="dimensions-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="dimensions_common" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/dimension" schemaLocation="http://collectionspace.org/services/dimension http://services.collectionspace.org/dimension/dimensions_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end dimension service meta-data -->
-    <!-- begin contact service meta-data -->
-    <tenant:serviceBindings id="Contacts" name="Contacts" type="utility" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /personauthorities/*/items/*/contacts
-            </service:uriPath>
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /orgauthorities/*/items/*/contacts
-            </service:uriPath>
-            -->
-      <service:repositoryDomain xmlns:service="http://collectionspace.org/services/config/service">default-domain</service:repositoryDomain>
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.contact.nuxeo.ContactDocumentModelHandler</service:documentHandler>
-      <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
-        <service:params>
-          <service:ListResultsFields>
-            <service:ListResultField>
-              <service:element>displayName</service:element>
-              <service:xpath>displayName</service:xpath>
-            </service:ListResultField>
-          </service:ListResultsFields>
-        </service:params>
-      </service:DocHandlerParams>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Contact" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="contacts-system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="contacts_common" updated="" order="1">
-          <service:properties>
-            <!-- Fields containing authority term references -->
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>addressGroupList/*/addressMunicipality</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>authRef</types:key>
-              <types:value>addressGroupList/*/addressStateOrProvince</types:value>
-            </types:item>
-            <!-- Per CSPACE-5080: This field is configured as a term list, rather than being tied to Place authority as described in wiki schema -->
-            <!--<types:item xmlns:types="http://collectionspace.org/services/config/types">
-                            <types:key>authRef</types:key>
-                            <types:value>addressGroupList/*/addressCountry</types:value>
-                        </types:item> -->
-            <!-- Fields containing term list / controlled vocabulary references -->
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>emailGroupList/*/emailType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>telephoneNumberGroupList/*/telephoneNumberType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>faxNumberGroupList/*/faxNumberType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>webAddressGroupList/*/webAddressType</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>addressGroupList/*/addressCountry</types:value>
-            </types:item>
-            <types:item xmlns:types="http://collectionspace.org/services/config/types">
-              <types:key>termRef</types:key>
-              <types:value>addressGroupList/*/addressType</types:value>
-            </types:item>
-          </service:properties>
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/contact" schemaLocation="http://collectionspace.org/services/contact http://services.collectionspace.org/contact/contacts_common.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="2" control_group="Managed" versionable="true" auditable="false" label="collectionspace_core" updated="" order="2">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/collectionspace_core/" schemaLocation="http://collectionspace.org/collectionspace_core/ http://services.collectionspace.org/collectionspace_core.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end contact service meta-data -->
-    <!-- begin note service meta-data -->
-    
-    <tenant:serviceBindings id="authorization/roles" name="authorization/roles" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.RoleDocumentHandler</service:documentHandler>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.RoleValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Role" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="roles_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="roles" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/roles.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end role service meta-data -->
-    <!-- begin permission service meta-data -->
-    <tenant:serviceBindings id="authorization/permissions" name="authorization/permissions" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.PermissionDocumentHandler</service:documentHandler>
-      <service:validatorHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.PermissionValidatorHandler</service:validatorHandler>
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="Permission" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="permissions_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="permissions" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/permissions.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end permission service meta-data -->
-    <!-- begin permission-role service meta-data -->
-    <!-- the following service is same as authorization/roles/permroles service -->
-    <!-- except that it is available as a sub resource of the permission service -->
-    <tenant:serviceBindings id="authorization/permissions/permroles" name="authorization/permissions/permroles" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /authorization/permissions/*/permroles/
-            </service:uriPath>
-            -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.PermissionRoleDocumentHandler</service:documentHandler>
-      <!--
-            <service:validatorHandler xmlns:service='http://collectionspace.org/services/config/service'>
-                org.collectionspace.services.authorization.storage.PermissionRoleValidatorHandler
-            </service:validatorHandler>
-            -->
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="PermissionRole" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="permroles_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="permroles" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/permissions_roles.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end permission-role service meta-data -->
-    <!-- begin account-role service meta-data -->
-    <tenant:serviceBindings id="accounts/accountroles" name="accounts/accountroles" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /accounts/*/accountroles/
-            </service:uriPath>
-            -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.account.storage.AccountRoleDocumentHandler</service:documentHandler>
-      <!--
-            <service:validatorHandler xmlns:service='http://collectionspace.org/services/config/service'>
-                org.collectionspace.services.account.storage.AccountRoleDocumentHandler
-            </service:validatorHandler>
-            -->
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="AccountRole" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="accountroles_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="accountroles" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/accounts_roles.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end account-role service meta-data -->
-    <!-- begin role-permission service meta-data -->
-    <!-- the following service is same as authorization/permissions/permroles service -->
-    <!-- except that it is available as a sub resource of the role service -->
-    <tenant:serviceBindings id="authorization/roles/permroles" name="authorization/roles/permroles" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /authorization/roles/*/permroles/
-            </service:uriPath>
-            -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.authorization.storage.PermissionRoleDocumentHandler</service:documentHandler>
-      <!--
-            <service:validatorHandler xmlns:service='http://collectionspace.org/services/config/service'>
-                org.collectionspace.services.authorization.storage.PermissionRoleValidatorHandler
-            </service:validatorHandler>
-            -->
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="PermissionRole" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="permroles_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="permroles" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/permissions_roles.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    <!-- end role-permission service meta-data -->
-    <!-- begin role-account service meta-data -->
-    <!-- the following service is same as account/accountroles service -->
-    <!-- except that it is available as a sub resource of the role service -->
-    <tenant:serviceBindings id="authorization/roles/accountroles" name="authorization/roles/accountroles" type="security" version="1.0">
-      <!-- other URI paths through which this service could be accessed -->
-      <!--
-            <service:uriPath xmlns:service='http://collectionspace.org/services/config/service'>
-                /authorization/roles/*/accountroles/
-            </service:uriPath>
-            -->
-      <service:documentHandler xmlns:service="http://collectionspace.org/services/config/service">org.collectionspace.services.account.storage.AccountRoleDocumentHandler</service:documentHandler>
-      <!--
-            <service:validatorHandler xmlns:service='http://collectionspace.org/services/config/service'>
-                org.collectionspace.services.authorization.storage.PermissionRoleValidatorHandler
-            </service:validatorHandler>
-            -->
-      <service:object xmlns:service="http://collectionspace.org/services/config/service" name="AccountRole" version="1.0">
-        <service:part id="0" control_group="Managed" versionable="true" auditable="false" label="accountroles_system" updated="" order="0">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/config/system" schemaLocation="http://collectionspace.org/services/config/system http://collectionspace.org/services/config/system/system-response.xsd" />
-          </service:content>
-        </service:part>
-        <service:part id="1" control_group="Managed" versionable="true" auditable="false" label="accountroles" updated="" order="1">
-          <service:content contentType="application/xml">
-            <service:xmlContent namespaceURI="http://collectionspace.org/services/authorization" schemaLocation="http://collectionspace.org/services/authorization http://services.collectionspace.org/authorization/accounts_roles.xsd" />
-          </service:content>
-        </service:part>
-      </service:object>
-    </tenant:serviceBindings>
-    
-  </tenant:tenantBinding>
-</tenant:TenantBindingConfig>
-
index eb6d80565652a869d8dfd5de4750539bcd83e02b..cd4e31bbdfc04f193b6517059703f6dc7352588b 100644 (file)
@@ -95,17 +95,20 @@ public class ServiceConfigUtils {
                ServiceBindingType serviceBinding) throws Exception {
        DocumentHandler docHandler = null;
        
-        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-        Class<?> c = tccl.loadClass(getDocumentHandlerClass(tenantBinding, serviceBinding));
-        if (DocumentHandler.class.isAssignableFrom(c)) {
-            docHandler = (DocumentHandler) c.newInstance();
-            if (logger.isDebugEnabled()) {
-               logger.debug("Created an instance of the DocumentHandler for: " + getDocumentHandlerClass(tenantBinding, serviceBinding));
-            }
-        } else {
-            throw new IllegalArgumentException("Not of type "
-                    + DocumentHandler.class.getCanonicalName());
-        }
+       if (serviceBinding.isRequiresDocumentHandler() == true) {
+               ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+               Class<?> c = tccl.loadClass(getDocumentHandlerClass(tenantBinding, serviceBinding));
+               if (DocumentHandler.class.isAssignableFrom(c)) {
+                   docHandler = (DocumentHandler) c.newInstance();
+                   if (logger.isDebugEnabled()) {
+                       logger.debug("Created an instance of the DocumentHandler for: " + getDocumentHandlerClass(tenantBinding, serviceBinding));
+                   }
+               } else {
+                       String msg = String.format("Tenant:%s Service:%s - The declared document handler '%s' is not an instance of the '%s' interface.", 
+                                       tenantBinding.getDisplayName(), serviceBinding.getName(), serviceBinding.getDocumentHandler(), DocumentHandler.class.getCanonicalName());
+                   throw new IllegalArgumentException(msg);
+               }
+       }
 
         return docHandler;
     }
@@ -117,15 +120,20 @@ public class ServiceConfigUtils {
      */
     private static String getDocumentHandlerClass(TenantBindingType tenantBinding,
                ServiceBindingType serviceBinding) {
-        if (serviceBinding.getDocumentHandler() == null
-                || serviceBinding.getDocumentHandler().isEmpty()) {
-            String msg = "Missing documentHandler in service binding for service name \""
-                    + serviceBinding.getName() + "\" for tenant id=" + tenantBinding.getId()
-                    + " name=" + tenantBinding.getName();
-            logger.warn(msg);
-            throw new IllegalStateException(msg);
-        }
-        return serviceBinding.getDocumentHandler().trim();
+       String result = null;
+       
+       if (serviceBinding.isRequiresDocumentHandler() == true) {
+               if (serviceBinding.getDocumentHandler() == null || serviceBinding.getDocumentHandler().isEmpty()) {
+                   String msg = "Missing documentHandler in service binding for service name \""
+                           + serviceBinding.getName() + "\" for tenant id=" + tenantBinding.getId()
+                           + " name=" + tenantBinding.getName();
+                   throw new IllegalStateException(msg);
+               } else {
+                       result = serviceBinding.getDocumentHandler().trim();
+               }
+       }
+        
+        return result;
     }
 
     /**
index 75cc0501d0399f501ac9362887e52d9e81a023a4..7fbe3e91ba029a983e989b14c4c5d08a187fcd77 100644 (file)
@@ -595,28 +595,34 @@ public abstract class AbstractServiceContextImpl<IT, OT>
      */
     private DocumentHandler createDocumentHandlerInstance() throws Exception {
         docHandler = ServiceConfigUtils.createDocumentHandlerInstance(tenantBinding, serviceBinding);
+        
         //
-        // Create a default document filter
-        //
-        docHandler.setServiceContext(this);
-        DocumentFilter docFilter = docHandler.createDocumentFilter();
-        //
-        // If the context was created with query parameters,
-        // reflect the values of those parameters in the document filter
-        // to specify sort ordering, pagination, etc.
+        // The docHandler for a Service can be null, but usually is not.
         //
-        MultivaluedMap<String, String> queryParameters = this.getQueryParams();
-        if (queryParameters != null) {
-          docFilter.setSortOrder(queryParameters);
-          docFilter.setPagination(queryParameters);
-          String workflowWhereClause = buildWorkflowWhereClause(queryParameters);
-          if (workflowWhereClause != null) {
-                 docFilter.appendWhereClause(workflowWhereClause, IQueryManager.SEARCH_QUALIFIER_AND);                 
-          }            
-
+        if (docHandler != null) {
+               //
+               // Create a default document filter
+               //
+               docHandler.setServiceContext(this);
+               DocumentFilter docFilter = docHandler.createDocumentFilter();
+               //
+               // If the context was created with query parameters,
+               // reflect the values of those parameters in the document filter
+               // to specify sort ordering, pagination, etc.
+               //
+               MultivaluedMap<String, String> queryParameters = this.getQueryParams();
+               if (queryParameters != null) {
+                 docFilter.setSortOrder(queryParameters);
+                 docFilter.setPagination(queryParameters);
+                 String workflowWhereClause = buildWorkflowWhereClause(queryParameters);
+                 if (workflowWhereClause != null) {
+                         docFilter.appendWhereClause(workflowWhereClause, IQueryManager.SEARCH_QUALIFIER_AND);                 
+                 }            
+       
+               }
+               docHandler.setDocumentFilter(docFilter);
         }
-        docHandler.setDocumentFilter(docFilter);
-
+        
         return docHandler;
     }
 
index c996233d85bd506a19628f2395c3870887651a9d..7bd42c9bf0ba8faa5ebc4c25fc6dbb9448a62d70 100644 (file)
@@ -84,6 +84,7 @@ public class SecurityInterceptor implements PreProcessInterceptor, PostProcessIn
        /** The Constant logger. */
        private static final Logger logger = LoggerFactory.getLogger(SecurityInterceptor.class);
        private static final String ACCOUNT_PERMISSIONS = "accounts/*/accountperms";
+       private static final String STRUCTURED_DATE_REQUEST = "structureddate";
        private static final String PASSWORD_RESET = "accounts/requestpasswordreset";
        private static final String PROCESS_PASSWORD_RESET = "accounts/processpasswordreset";
        private static final String NUXEO_ADMIN = null;
@@ -126,11 +127,18 @@ public class SecurityInterceptor implements PreProcessInterceptor, PostProcessIn
     private boolean requiresAuthorization(String resName) {
        boolean result = true;
                //
-       // All active users are allowed to see the *their* (we enforce this) current list of permissions.  If this is not
+       // ACCOUNT_PERMISSIONS: All active users are allowed to see the *their* (we enforce this) current list of permissions.  If this is not
                // the request, then we'll do a full AuthZ check.
        //
-       if (resName.equalsIgnoreCase(ACCOUNT_PERMISSIONS) == true) {
-               result = false;
+       // STRUCTURED_DATE_REQUEST: All user can request the parsing of a structured date string.
+       //
+       switch (resName) {
+               case STRUCTURED_DATE_REQUEST:
+               case ACCOUNT_PERMISSIONS:
+                       result = false;
+                       break;
+               default:
+                       result = true;
        }
        
        return result;
index a35db35b5a1cf74808820cbe174c0e70c36586d1..33305060eeb382274346dc3ceaecb044d7d0e542 100644 (file)
@@ -35,7 +35,6 @@ import org.collectionspace.services.common.context.ServiceContext;
 import org.collectionspace.services.common.document.DocumentUtils;
 import org.collectionspace.services.config.service.ObjectPartType;
 
-import org.jboss.resteasy.plugins.providers.multipart.InputPart;
 import javax.ws.rs.core.MediaType;
 import org.nuxeo.ecm.core.api.DocumentModel;
 import org.slf4j.Logger;
@@ -43,7 +42,7 @@ import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 
 /**
- * RemoteDocumentModelHandler
+ * RemoteDocumentModelHandler - This class does not seem to be used, so it has been deprecated.
  *
  * @author pschmitz
  * $LastChangedRevision: $
@@ -51,6 +50,7 @@ import org.w3c.dom.Document;
  * @param <T> The {DocumentType}Common class
  * @param <TL> The {DocumentType}CommonList class
  */
+@Deprecated
 public abstract class RemoteSubItemDocumentModelHandlerImpl<T, TL> extends
                RemoteDocumentModelHandlerImpl<T, TL> {
 
index 9c18f810d77e55f0f18b3e791d14100f0421f8e1..dbe3103f68a2eb633399576d83efe46359a7ee36 100644 (file)
@@ -75,6 +75,7 @@
         <xs:attribute name="name" type="xs:string" use="required"/>
         <xs:attribute name="type" type="xs:string" use="optional"/>
         <xs:attribute name="version" type="types:VersionType" use="required"/>
+        <xs:attribute name="requiresDocumentHandler" type="xs:boolean" default="true"/>
         <xs:attribute name="supportsReplicating" type="xs:boolean" default="false"/>
         <xs:attribute name="remoteClientConfigName" type="xs:string"/>
         <xs:attribute name="requiresUniqueShortId" type="xs:boolean" default="false"/>
index 301d8636d249ec3c82c7913e47ebe23d81bc2c06..a4642e787ab66b1e111eb84a26254cd7bf568772 100644 (file)
@@ -32,6 +32,7 @@
             <artifactId>org.collectionspace.services.collectionobject.jaxb</artifactId>
             <version>${project.version}</version>
         </dependency>
+        
         <!-- External dependencies -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/services/structureddate/client/pom.xml b/services/structureddate/client/pom.xml
new file mode 100644 (file)
index 0000000..b913248
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.collectionspace.services</groupId>
+        <artifactId>org.collectionspace.services.structureddate</artifactId>
+        <version>5.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.collectionspace.services.structureddate.client</artifactId>
+    <name>services.structureddate.client</name>
+    
+    <dependencies>
+        <!-- keep slf4j dependencies on the top -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <scope>test</scope>
+        </dependency>
+        
+    <!-- CollectionSpace dependencies -->
+        
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.jaxb</artifactId>
+            <version>${project.version}</version>
+        </dependency>        
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.common</artifactId>
+            <optional>true</optional>
+        </dependency>        
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- External dependencies -->
+        
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxrs</artifactId>
+            <!-- filter out unwanted jars -->
+            <exclusions>
+                <exclusion>
+                    <groupId>tjws</groupId>
+                    <artifactId>webserver</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxb-provider</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <finalName>collectionspace-services-structureddate-client</finalName>
+    </build>
+</project>
+
diff --git a/services/structureddate/client/src/main/java/org/collectionspace/services/structureddate/StructuredDateClient.java b/services/structureddate/client/src/main/java/org/collectionspace/services/structureddate/StructuredDateClient.java
new file mode 100644 (file)
index 0000000..1274031
--- /dev/null
@@ -0,0 +1,14 @@
+package org.collectionspace.services.structureddate;
+
+/**
+ * Client class for Structureddate service.
+ * @author remillet
+ *
+ */
+public class StructuredDateClient {
+       public static final String SERVICE_NAME = "structureddates";
+       public static final String SERVICE_PATH_COMPONENT = SERVICE_NAME;       
+       public static final String SERVICE_PATH = "/" + SERVICE_PATH_COMPONENT;
+       public static final String SERVICE_PAYLOAD_NAME = SERVICE_NAME;
+       public static final String DATE_TO_PARSE_QP = "dateToParse";
+}
diff --git a/services/structureddate/client/src/test/resources/log4j.properties b/services/structureddate/client/src/test/resources/log4j.properties
new file mode 100644 (file)
index 0000000..148a3e8
--- /dev/null
@@ -0,0 +1,23 @@
+log4j.rootLogger=debug, stdout, R
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+# Pattern to output the caller's file name and line number.
+log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] [%c:%L] %m%n
+
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=target/test-client.log
+
+log4j.appender.R.MaxFileSize=100KB
+# Keep one backup file
+log4j.appender.R.MaxBackupIndex=1
+
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d %-5p [%t] [%c:%L] %m%n
+
+#packages
+log4j.logger.org.collectionspace=DEBUG
+log4j.logger.org.apache=INFO
+log4j.logger.httpclient=INFO
+log4j.logger.org.jboss.resteasy=INFO
diff --git a/services/structureddate/jaxb/pom.xml b/services/structureddate/jaxb/pom.xml
new file mode 100644 (file)
index 0000000..9506762
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <artifactId>org.collectionspace.services.structureddate</artifactId>
+        <groupId>org.collectionspace.services</groupId>
+        <version>5.0-SNAPSHOT</version>
+    </parent>
+    
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.collectionspace.services.structureddate.jaxb</artifactId>
+    <name>services.structureddate.jaxb</name>
+    
+    <dependencies>
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.jaxb</artifactId>
+            <version>${project.version}</version>
+        </dependency>        
+    </dependencies>
+    
+    <build>
+        <finalName>collectionspace-services-structureddate-jaxb</finalName>
+        <defaultGoal>install</defaultGoal>
+        <plugins>
+            <plugin>
+                <groupId>org.jvnet.jaxb2.maven2</groupId>
+                <artifactId>maven-jaxb2-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>
+
diff --git a/services/structureddate/jaxb/src/main/resources/structureddate-common.xsd b/services/structureddate/jaxb/src/main/resources/structureddate-common.xsd
new file mode 100644 (file)
index 0000000..68af2e6
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!--
+    StructuredDate schema (XSD)
+    
+    Entity  : StructuredDate
+    Part    : Common
+    Used for: JAXB binding between XML and Java objects
+
+-->
+
+<xs:schema 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema"
+  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
+  jaxb:version="1.0" elementFormDefault="unqualified"
+  xmlns:ns="http://collectionspace.org/services/structureddate"
+  xmlns="http://collectionspace.org/services/structureddate"
+  targetNamespace="http://collectionspace.org/services/structureddate"
+  version="0.1"
+>
+
+<!--
+    Avoid XmlRootElement nightmare:
+    See http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html
+-->
+
+    <xs:element name="structureddate_common">
+               <xs:complexType>
+                       <xs:sequence>
+                           <xs:element name="displayDate" type="xs:string"/>
+                           <xs:element name="note" type="xs:string"/>
+                           <xs:element name="association" type="xs:string"/>
+                           <xs:element name="period" type="xs:string"/>
+                           <xs:element name="earliestSingleDate" type="date_common"/>
+                           <xs:element name="latestDate" type="date_common"/>
+                           <xs:element name="earliestScalarDate" type="xs:string"/>
+                           <xs:element name="latestScalarDate" type="xs:string"/>
+                           <xs:element name="scalarValuesComputed" type="xs:boolean"/>
+                       </xs:sequence>
+               </xs:complexType>
+    </xs:element>
+    
+    <xs:complexType name="date_common">
+        <xs:sequence>
+            <xs:element name="year" type="xs:integer"/>
+            <xs:element name="month" type="xs:integer"/>
+            <xs:element name="day" type="xs:integer"/>
+            <xs:element name="era" type="xs:string"/>
+            <xs:element name="certainty" type="xs:string"/>
+            <xs:element name="qualifierType" type="xs:string"/>
+            <xs:element name="qualifierValue" type="xs:string"/>
+            <xs:element name="qualifierUnit" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+        
+</xs:schema>
index 965c6a09e924c11720ea75691e6def3db7d3fc9f..96a5d140a98fb2d30ae6fc57c46b355aff8b6a0e 100644 (file)
        <modelVersion>4.0.0</modelVersion>
        <artifactId>org.collectionspace.services.structureddate</artifactId>
        <name>services.structureddate</name>
-       <packaging>jar</packaging>
-       
-       <dependencies>
-               <dependency>
-                       <groupId>org.slf4j</groupId>
-                       <artifactId>slf4j-api</artifactId>
-                       <scope>provided</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.slf4j</groupId>
-                       <artifactId>slf4j-log4j12</artifactId>
-                       <scope>provided</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.testng</groupId>
-                       <artifactId>testng</artifactId>
-                       <scope>provided</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.yaml</groupId>
-                       <artifactId>snakeyaml</artifactId>
-                       <version>1.6</version>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>commons-beanutils</groupId>
-                       <artifactId>commons-beanutils-core</artifactId>
-                       <version>1.8.3</version>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>commons-lang</groupId>
-                       <artifactId>commons-lang</artifactId>
-                       <version>2.6</version>
-               </dependency>
-               <dependency>
-                       <groupId>joda-time</groupId>
-                       <artifactId>joda-time</artifactId>
-                       <version>2.3</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.antlr</groupId>
-                       <artifactId>antlr4-runtime</artifactId>
-                       <version>4.1</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.antlr</groupId>
-                       <artifactId>antlr4-maven-plugin</artifactId>
-                       <version>4.6</version>
-               </dependency>
-               <dependency>
-               <groupId>org.sonatype.m2e.extras</groupId>
-               <artifactId>org.sonatype.m2e.antlr</artifactId>
-               <version>0.13.0.20110622-1538</version>
-               </dependency>
-       </dependencies>
-       
-       <build>
-               <plugins>
-                       <plugin>
-                               <groupId>org.antlr</groupId>
-                               <artifactId>antlr4-maven-plugin</artifactId>
-                               <version>4.1</version>
-                               <executions>
-                                       <execution>
-                                               <goals>
-                                                       <goal>antlr4</goal>
-                                               </goals>
-                                       </execution>
-                               </executions>
-                       </plugin>
-               </plugins>
-               
-               <pluginManagement>
-                       <plugins>
-                               <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-                               <plugin>
-                                       <groupId>org.eclipse.m2e</groupId>
-                                       <artifactId>lifecycle-mapping</artifactId>
-                                       <version>1.0.0</version>
-                                       <configuration>
-                                               <lifecycleMappingMetadata>
-                                                       <pluginExecutions>
-                                                               <pluginExecution>
-                                                                       <pluginExecutionFilter>
-                                                                               <groupId>org.antlr</groupId>
-                                                                               <artifactId>
-                                                                                       antlr4-maven-plugin
-                                                                               </artifactId>
-                                                                               <versionRange>
-                                                                                       [4.1,)
-                                                                               </versionRange>
-                                                                               <goals>
-                                                                                       <goal>antlr4</goal>
-                                                                               </goals>
-                                                                       </pluginExecutionFilter>
-                                                                       <action>
-                                                                               <configurator>
-                                                                               <id>org.sonatype.m2e.antlr.antlrConfigurator</id>
-                                                                       </configurator>
-                                                                       </action>
-                                                               </pluginExecution>
-                                                       </pluginExecutions>
-                                               </lifecycleMappingMetadata>
-                                       </configuration>
-                               </plugin>
-                       </plugins>
-               </pluginManagement>
-       </build>
+       <packaging>pom</packaging>
+    
+    <modules>
+        <module>structureddate</module>
+        <module>client</module>
+        <module>jaxb</module>
+        <module>service</module>        
+    </modules>
+
 </project>
diff --git a/services/structureddate/service/pom.xml b/services/structureddate/service/pom.xml
new file mode 100644 (file)
index 0000000..656c520
--- /dev/null
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <parent>
+        <groupId>org.collectionspace.services</groupId>
+        <artifactId>org.collectionspace.services.structureddate</artifactId>        
+        <version>5.0-SNAPSHOT</version>
+    </parent>
+    
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.collectionspace.services.structureddate.service</artifactId>
+    <name>services.structureddate.service</name>
+    <packaging>jar</packaging>       
+
+    <dependencies>
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.structureddate.jaxb</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.structureddate.client</artifactId>
+            <version>${project.version}</version>
+        </dependency>        
+        <dependency>
+            <groupId>org.collectionspace.services</groupId>
+            <artifactId>org.collectionspace.services.structureddate.structureddate</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- External dependencies -->
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+        </dependency>
+        
+      <!-- javax -->
+
+        <dependency>
+            <groupId>javax.security</groupId>
+            <artifactId>jaas</artifactId>
+            <version>1.0.01</version>
+            <scope>provided</scope>
+        </dependency>
+        
+        <!-- jboss -->
+
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxrs</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>tjws</groupId>
+                    <artifactId>webserver</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxb-provider</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-multipart-provider</artifactId>
+        </dependency>
+        
+    </dependencies>
+    
+    <build>
+        <finalName>collectionspace-services-structureddate-service</finalName>
+    </build>
+</project>
+
diff --git a/services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructuredDateResource.java b/services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructuredDateResource.java
new file mode 100644 (file)
index 0000000..a19e658
--- /dev/null
@@ -0,0 +1,154 @@
+package org.collectionspace.services.structureddate;
+
+import java.math.BigInteger;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl;
+import org.collectionspace.services.common.CSWebApplicationException;
+import org.collectionspace.services.common.ServiceMessages;
+import org.collectionspace.services.common.api.Tools;
+import org.collectionspace.services.common.context.RemoteServiceContextFactory;
+import org.collectionspace.services.common.context.ServiceContext;
+import org.collectionspace.services.common.context.ServiceContextFactory;
+
+@Path(StructuredDateClient.SERVICE_PATH)
+@Produces({"application/xml"})
+@Consumes({"application/xml"})
+public class StructuredDateResource extends AbstractCollectionSpaceResourceImpl<StructureddateCommon, StructureddateCommon> {
+
+       @Override
+       public Class<?> getCommonPartClass() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getServiceName() {
+               return StructuredDateClient.SERVICE_NAME;
+       }
+
+       @Override
+       protected String getVersionString() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+       
+       //
+       // API Endpoints
+       //
+       
+    @GET
+    public StructureddateCommon get(@Context UriInfo ui) {
+       StructureddateCommon result = null;
+       
+       try {
+               ServiceContext<StructureddateCommon, StructureddateCommon> ctx = createServiceContext(getServiceName());
+               MultivaluedMap<String,String> queryParams = ui.getQueryParameters();
+               String dateToParse = queryParams.getFirst(StructuredDateClient.DATE_TO_PARSE_QP);
+               if (Tools.isEmpty(dateToParse) != true) {       
+                       StructuredDateInternal structuredDate = StructuredDateInternal.parse(dateToParse);
+                       result = toStructureddateCommon(ctx.getTenantName(), structuredDate);
+               } else {
+                       String msg = String.format("Use the '%s' query parameter to specify a date string you want parsed.",
+                                       StructuredDateClient.DATE_TO_PARSE_QP);
+                       Response response = 
+                               Response.status(Response.Status.BAD_REQUEST).entity(msg).type("text/plain").build();
+                       throw new CSWebApplicationException(response);
+               }
+       } catch(StructuredDateFormatException fe) {
+               Response response = Response.status(Response.Status.BAD_REQUEST).entity(fe.getMessage()).type("text/plain").build();
+            throw new CSWebApplicationException(response);
+       } catch (Exception e) {
+               throw bigReThrow(e, ServiceMessages.GET_FAILED); 
+       }
+       
+       return result;
+    }
+    
+    private StructureddateCommon toStructureddateCommon(String tenantDomain, StructuredDateInternal structuredDate) {
+       StructureddateCommon result = new StructureddateCommon();
+       
+       String association = structuredDate.getAssociation();
+       if (!Tools.isEmpty(association)) {
+               result.setAssociation(association);
+       }
+       
+       String displayDate = structuredDate.getDisplayDate();
+       if (!Tools.isEmpty(displayDate)) {
+               result.setDisplayDate(displayDate);
+       }       
+       
+       String earliestScalarDate = structuredDate.getEarliestScalarDate();
+       if (!Tools.isEmpty(earliestScalarDate)) {
+               result.setEarliestScalarDate(earliestScalarDate);
+       }       
+       
+       Date earliestSingleDate = structuredDate.getEarliestSingleDate();
+       if (earliestSingleDate != null) {
+               result.setEarliestSingleDate(toDateCommon(tenantDomain, earliestSingleDate));
+       }       
+       
+       result.setLatestDate(toDateCommon(tenantDomain, structuredDate.getLatestDate()));
+       Date latestDate = structuredDate.getLatestDate();
+       if (latestDate != null) {
+               result.setLatestDate(toDateCommon(tenantDomain, latestDate));
+       }       
+       
+       return result;
+    }
+
+    private DateCommon toDateCommon(String tenantDomain, org.collectionspace.services.structureddate.Date date) {
+       DateCommon result = null;
+       
+       if (date != null) {
+               result = new DateCommon();
+               
+               if (date.getCertainty() != null) {
+                       result.setCertainty(date.getCertainty().toString());
+               }
+               
+               if (date.getDay() != null) {
+                       result.setDay(BigInteger.valueOf(date.getDay()));
+               }
+               
+               if (date.getEra() != null) {
+                       result.setEra(date.getEra().toString(tenantDomain));
+               }
+               
+               if (date.getMonth() != null) {
+                       result.setMonth(BigInteger.valueOf(date.getMonth()));
+               }
+               
+               if (date.getQualifierType() != null) {
+                       result.setQualifierType(date.getQualifierType().toString());
+               }
+               
+               if (date.getQualifierUnit() != null) {
+                       result.setQualifierUnit(date.getQualifierUnit().toString());
+               }
+               
+               if (date.getQualifierValue() != null) {
+                       result.setQualifierValue(date.getQualifierValue().toString());
+               }
+               
+               if (date.getYear() != null) {
+                       result.setYear(BigInteger.valueOf(date.getYear()));
+               }
+       }
+       
+       return result;
+    }
+
+       @Override
+       public ServiceContextFactory<StructureddateCommon, StructureddateCommon> getServiceContextFactory() {
+        return (ServiceContextFactory<StructureddateCommon, StructureddateCommon>) RemoteServiceContextFactory.get();
+       }
+}
diff --git a/services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructureddateDocumentHandler.java b/services/structureddate/service/src/main/java/org/collectionspace/services/structureddate/StructureddateDocumentHandler.java
new file mode 100644 (file)
index 0000000..610874e
--- /dev/null
@@ -0,0 +1,130 @@
+package org.collectionspace.services.structureddate;
+
+import java.util.List;
+
+import org.collectionspace.services.common.api.RefName.RefNameInterface;
+import org.collectionspace.services.common.context.ServiceContext;
+import org.collectionspace.services.common.document.AbstractMultipartDocumentHandlerImpl;
+import org.collectionspace.services.common.document.DocumentException;
+import org.collectionspace.services.common.document.DocumentFilter;
+import org.collectionspace.services.common.document.DocumentWrapper;
+import org.collectionspace.services.lifecycle.Lifecycle;
+import org.collectionspace.services.lifecycle.TransitionDef;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+/*
+ * The StructedDate service uses non of these method.  It exists only because it is needed to create a proper ServiceContext instance.
+ */
+public class StructureddateDocumentHandler extends AbstractMultipartDocumentHandlerImpl<StructureddateCommon, List<StructureddateCommon>, StructureddateCommon, List<StructureddateCommon>> {
+
+       @Override
+       public Lifecycle getLifecycle() {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public Lifecycle getLifecycle(String serviceObjectName) {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void handleWorkflowTransition(ServiceContext ctx, DocumentWrapper<DocumentModel> wrapDoc,
+                       TransitionDef transitionDef) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void handleCreate(DocumentWrapper<StructureddateCommon> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void handleUpdate(DocumentWrapper<StructureddateCommon> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void handleGet(DocumentWrapper<StructureddateCommon> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void handleGetAll(DocumentWrapper<List<StructureddateCommon>> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void extractAllParts(DocumentWrapper<StructureddateCommon> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void fillAllParts(DocumentWrapper<StructureddateCommon> wrapDoc,
+                       org.collectionspace.services.common.document.DocumentHandler.Action action) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public StructureddateCommon extractCommonPart(DocumentWrapper<StructureddateCommon> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void fillCommonPart(StructureddateCommon obj, DocumentWrapper<StructureddateCommon> wrapDoc)
+                       throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public List<StructureddateCommon> extractCommonPartList(DocumentWrapper<List<StructureddateCommon>> wrapDoc)
+                       throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public List<StructureddateCommon> extractPagingInfo(List<StructureddateCommon> theCommonList,
+                       DocumentWrapper<List<StructureddateCommon>> wrapDoc) throws Exception {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public StructureddateCommon getCommonPart() {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void setCommonPart(StructureddateCommon obj) {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public List<StructureddateCommon> getCommonPartList() {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public void setCommonPartList(List<StructureddateCommon> obj) {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public String getQProperty(String prop) throws DocumentException {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       protected String getRefnameDisplayName(DocumentWrapper<StructureddateCommon> docWrapper) {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       protected RefNameInterface getRefName(DocumentWrapper<StructureddateCommon> docWrapper, String tenantName,
+                       String serviceName) {
+               throw new RuntimeException("Unimplemented method.");
+       }
+
+       @Override
+       public DocumentFilter createDocumentFilter() {
+               throw new RuntimeException("Unimplemented method.");
+       }
+}
diff --git a/services/structureddate/service/src/test/resources/log4j.xml b/services/structureddate/service/src/test/resources/log4j.xml
new file mode 100644 (file)
index 0000000..52121cb
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+       <appender name="console" class="org.apache.log4j.ConsoleAppender">
+               <param name="Target" value="System.out" />
+               <layout class="org.apache.log4j.TTCCLayout">
+                       <param name="DateFormat" value="ISO8601" />
+               </layout>
+       </appender>
+
+
+       <appender name="unit-tests"
+               class="org.apache.log4j.RollingFileAppender">
+               <param name="File" value="./target/unit-tests.log" />
+               <param name="MaxFileSize" value="10240KB" />
+               <param name="MaxBackupIndex" value="6" />
+               <layout class="org.apache.log4j.TTCCLayout">
+                       <param name="DateFormat" value="ISO8601" />
+               </layout>
+       </appender>
+
+       <logger name="org.apache.commons.httpclient" additivity="false">
+               <level value="warn" />
+               <appender-ref ref="console" />
+               <appender-ref ref="unit-tests" />
+       </logger>
+
+       <logger name="httpclient.wire" additivity="false">
+               <level value="info" />
+               <appender-ref ref="console" />
+               <appender-ref ref="unit-tests" />
+       </logger>
+
+       <root>
+               <priority value="debug" />
+               <appender-ref ref="console" />
+               <appender-ref ref="unit-tests" />
+       </root>
+
+</log4j:configuration>
+
+
+
+
diff --git a/services/structureddate/structureddate/pom.xml b/services/structureddate/structureddate/pom.xml
new file mode 100644 (file)
index 0000000..cd98f8c
--- /dev/null
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <parent>
+               <groupId>org.collectionspace.services</groupId>
+           <artifactId>org.collectionspace.services.structureddate</artifactId>
+           <version>5.0-SNAPSHOT</version>
+       </parent>
+       
+       <modelVersion>4.0.0</modelVersion>
+    <artifactId>org.collectionspace.services.structureddate.structureddate</artifactId>
+    <name>services.structureddate.structureddate</name>
+       <packaging>jar</packaging>
+       
+       <dependencies>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-api</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-log4j12</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.testng</groupId>
+                       <artifactId>testng</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.yaml</groupId>
+                       <artifactId>snakeyaml</artifactId>
+                       <version>1.6</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>commons-beanutils</groupId>
+                       <artifactId>commons-beanutils-core</artifactId>
+                       <version>1.8.3</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>commons-lang</groupId>
+                       <artifactId>commons-lang</artifactId>
+                       <version>2.6</version>
+               </dependency>
+               <dependency>
+                       <groupId>joda-time</groupId>
+                       <artifactId>joda-time</artifactId>
+                       <version>2.3</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.antlr</groupId>
+                       <artifactId>antlr4-runtime</artifactId>
+                       <version>4.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.antlr</groupId>
+                       <artifactId>antlr4-maven-plugin</artifactId>
+                       <version>4.6</version>
+               </dependency>
+               <dependency>
+               <groupId>org.sonatype.m2e.extras</groupId>
+               <artifactId>org.sonatype.m2e.antlr</artifactId>
+               <version>0.13.0.20110622-1538</version>
+               </dependency>
+       </dependencies>
+       
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.antlr</groupId>
+                               <artifactId>antlr4-maven-plugin</artifactId>
+                               <version>4.1</version>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>antlr4</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+               
+               <pluginManagement>
+                       <plugins>
+                               <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                               <plugin>
+                                       <groupId>org.eclipse.m2e</groupId>
+                                       <artifactId>lifecycle-mapping</artifactId>
+                                       <version>1.0.0</version>
+                                       <configuration>
+                                               <lifecycleMappingMetadata>
+                                                       <pluginExecutions>
+                                                               <pluginExecution>
+                                                                       <pluginExecutionFilter>
+                                                                               <groupId>org.antlr</groupId>
+                                                                               <artifactId>
+                                                                                       antlr4-maven-plugin
+                                                                               </artifactId>
+                                                                               <versionRange>
+                                                                                       [4.1,)
+                                                                               </versionRange>
+                                                                               <goals>
+                                                                                       <goal>antlr4</goal>
+                                                                               </goals>
+                                                                       </pluginExecutionFilter>
+                                                                       <action>
+                                                                               <configurator>
+                                                                               <id>org.sonatype.m2e.antlr.antlrConfigurator</id>
+                                                                       </configurator>
+                                                                       </action>
+                                                               </pluginExecution>
+                                                       </pluginExecutions>
+                                               </lifecycleMappingMetadata>
+                                       </configuration>
+                               </plugin>
+                       </plugins>
+               </pluginManagement>
+       </build>
+</project>
similarity index 97%
rename from services/structureddate/src/main/java/org/collectionspace/services/structureddate/ParseDates.java
rename to services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/ParseDates.java
index 930779567c73e15a908327c7be807b611caf3036..efa79651026ab2e03bcd16d9d76c4fd50bd76222 100644 (file)
@@ -67,7 +67,7 @@ public class ParseDates {
                String scalar = "";
                
                try {
-                       StructuredDate structuredDate = StructuredDate.parse(displayDate);
+                       StructuredDateInternal structuredDate = StructuredDateInternal.parse(displayDate);
                        Date earliestSingleDate = structuredDate.getEarliestSingleDate();
                        Date latestDate = structuredDate.getLatestDate();
                        
@@ -1,5 +1,5 @@
 package org.collectionspace.services.structureddate;
 
 public interface StructuredDateEvaluator {
-       public StructuredDate evaluate(String displayDate) throws StructuredDateFormatException;
+       public StructuredDateInternal evaluate(String displayDate) throws StructuredDateFormatException;
 }
@@ -7,7 +7,7 @@ import org.collectionspace.services.structureddate.antlr.ANTLRStructuredDateEval
 /**
  * A CollectionSpace structured date. 
  */
-public class StructuredDate {
+public class StructuredDateInternal {
        // The UI layer is interpreting scalarValuesComputed as follows:
        //  - If true, the UI should compute scalar values
        //  - If false (or null), the UI should not compute scalar values
@@ -27,7 +27,7 @@ public class StructuredDate {
        private String latestScalarDate;
        private Boolean scalarValuesComputed;
                
-       public StructuredDate() {
+       public StructuredDateInternal() {
                scalarValuesComputed = DEFAULT_SCALAR_VALUES_COMPUTED;
        }
 
@@ -70,7 +70,7 @@ public class StructuredDate {
                        return false;
                }
                
-               StructuredDate that = (StructuredDate) obj;
+               StructuredDateInternal that = (StructuredDateInternal) obj;
 
                return 
                        new EqualsBuilder()
@@ -157,7 +157,7 @@ public class StructuredDate {
                setLatestScalarDate(DateUtils.getLatestTimestamp(latestDate));
        }
        
-       public static StructuredDate parse(String displayDate) throws StructuredDateFormatException {
+       public static StructuredDateInternal parse(String displayDate) throws StructuredDateFormatException {
                StructuredDateEvaluator evaluator = new ANTLRStructuredDateEvaluator();
                
                return evaluator.evaluate(displayDate);
@@ -33,7 +33,7 @@ import org.collectionspace.services.structureddate.DeferredQuarterCenturyEndDate
 import org.collectionspace.services.structureddate.DeferredQuarterCenturyStartDate;
 import org.collectionspace.services.structureddate.Era;
 import org.collectionspace.services.structureddate.Part;
-import org.collectionspace.services.structureddate.StructuredDate;
+import org.collectionspace.services.structureddate.StructuredDateInternal;
 import org.collectionspace.services.structureddate.StructuredDateEvaluator;
 import org.collectionspace.services.structureddate.StructuredDateFormatException;
 import org.collectionspace.services.structureddate.antlr.StructuredDateParser.AllOrPartOfContext;
@@ -90,7 +90,7 @@ public class ANTLRStructuredDateEvaluator extends StructuredDateBaseListener imp
        /**
         * The result of the evaluation.
         */
-       protected StructuredDate result;
+       protected StructuredDateInternal result;
 
        /**
         * The operation stack. The parse listener methods that are implemented here
@@ -103,10 +103,10 @@ public class ANTLRStructuredDateEvaluator extends StructuredDateBaseListener imp
        }
 
        @Override
-       public StructuredDate evaluate(String displayDate) throws StructuredDateFormatException {
+       public StructuredDateInternal evaluate(String displayDate) throws StructuredDateFormatException {
                stack = new Stack<Object>();
 
-               result = new StructuredDate();
+               result = new StructuredDateInternal();
                result.setDisplayDate(displayDate);
 
                // Instantiate a parser from the lowercased display date, so that parsing will be
@@ -35,11 +35,11 @@ public class StructuredDateEvaluatorTest {
 
                        Map<String, Object> expectedStructuredDateFields = (Map<String, Object>) testCases.get(displayDate);
 
-                       StructuredDate expectedStructuredDate = createStructuredDateFromYamlSpec(displayDate, expectedStructuredDateFields);
-                       StructuredDate actualStructuredDate = null;
+                       StructuredDateInternal expectedStructuredDate = createStructuredDateFromYamlSpec(displayDate, expectedStructuredDateFields);
+                       StructuredDateInternal actualStructuredDate = null;
                        
                        try {
-                               actualStructuredDate = StructuredDate.parse(displayDate);
+                               actualStructuredDate = StructuredDateInternal.parse(displayDate);
                        }
                        catch(StructuredDateFormatException e) {
                                logger.debug(e.getMessage());
@@ -49,11 +49,11 @@ public class StructuredDateEvaluatorTest {
                }
        }
 
-       private StructuredDate createStructuredDateFromYamlSpec(String displayDate, Map<String, Object> structuredDateFields) {
-               StructuredDate structuredDate = null;
+       private StructuredDateInternal createStructuredDateFromYamlSpec(String displayDate, Map<String, Object> structuredDateFields) {
+               StructuredDateInternal structuredDate = null;
 
                if (structuredDateFields != null) {
-                       structuredDate = new StructuredDate();
+                       structuredDate = new StructuredDateInternal();
 
                        for (String propertyName : structuredDateFields.keySet()) {
                                Object value = structuredDateFields.get(propertyName);