You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/07/25 12:25:20 UTC

[05/16] cayenne git commit: CAY-2335: New XML loading/saving mechanics with support of plugable handlers - new XML loader for DataMap - new project version - updated test projects

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java
deleted file mode 100644
index a9c88b6..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.configuration;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.di.AdhocObjectFactory;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
-import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.resource.URLResource;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.net.URL;
-import java.util.Collection;
-import java.util.Iterator;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-public class XMLDataChannelDescriptorLoaderTest {
-
-    private Injector injector;
-
-    @Before
-    public void setUp() throws Exception {
-        Module testModule = new Module() {
-
-            public void configure(Binder binder) {
-                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
-                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
-                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
-                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
-            }
-        };
-
-        this.injector = DIBootstrap.createInjector(testModule);
-    }
-
-    @Test
-    public void testLoadEmpty() {
-
-        // create and initialize loader instance to test
-        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
-        injector.injectMembers(loader);
-
-        String testConfigName = "testConfig1";
-
-        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
-        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
-
-        assertNotNull(tree);
-        assertNotNull(tree.getRootNode());
-        assertEquals(testConfigName, tree.getRootNode().getName());
-    }
-
-    @Test
-    public void testLoad_MissingConfig() throws Exception {
-
-        // create and initialize loader instance to test
-        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
-        injector.injectMembers(loader);
-
-        try {
-            loader.load(new URLResource(new URL("file:///no_such_resource")));
-            fail("No exception was thrown on bad absent config name");
-        } catch (ConfigurationException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testLoadDataMap() {
-
-        // create and initialize loader instance to test
-        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
-        injector.injectMembers(loader);
-
-        String testConfigName = "testConfig2";
-        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
-
-        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
-
-        assertNotNull(tree);
-        assertNotNull(tree.getRootNode());
-
-        assertEquals(testConfigName, tree.getRootNode().getName());
-
-        Collection<DataMap> maps = tree.getRootNode().getDataMaps();
-        assertEquals(1, maps.size());
-        assertEquals("testConfigMap2", maps.iterator().next().getName());
-    }
-
-    @Test
-    public void testLoadDataEverything() {
-
-        // create and initialize loader instance to test
-        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
-        injector.injectMembers(loader);
-
-        String testConfigName = "testConfig3";
-        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
-
-        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
-
-        assertNotNull(tree);
-
-        DataChannelDescriptor descriptor = tree.getRootNode();
-        assertNotNull(descriptor);
-        assertEquals(testConfigName, descriptor.getName());
-
-        Collection<DataMap> maps = descriptor.getDataMaps();
-        assertEquals(2, maps.size());
-
-        Iterator<DataMap> mapsIt = maps.iterator();
-
-        DataMap map1 = mapsIt.next();
-        DataMap map2 = mapsIt.next();
-
-        assertEquals("testConfigMap3_1", map1.getName());
-        assertEquals("testConfigMap3_2", map2.getName());
-
-        Collection<DataNodeDescriptor> nodes = descriptor.getNodeDescriptors();
-        assertEquals(1, nodes.size());
-
-        DataNodeDescriptor node1 = nodes.iterator().next();
-        assertEquals("testConfigNode3", node1.getName());
-        assertNull(node1.getParameters());
-        assertNotNull(node1.getDataSourceDescriptor());
-        assertEquals(1, node1.getDataSourceDescriptor().getMinConnections());
-        assertEquals(1, node1.getDataSourceDescriptor().getMaxConnections());
-
-        assertEquals("org.example.test.Adapter", node1.getAdapterType());
-        assertEquals("org.example.test.DataSourceFactory", node1.getDataSourceFactoryType());
-        assertEquals("org.example.test.SchemaUpdateStartegy", node1.getSchemaUpdateStrategyType());
-        assertNotNull(node1.getDataMapNames());
-
-        assertEquals(1, node1.getDataMapNames().size());
-
-        assertEquals("testConfigMap3_2", node1.getDataMapNames().iterator().next());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/BaseHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/BaseHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/BaseHandlerTest.java
new file mode 100644
index 0000000..4cefbff
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/BaseHandlerTest.java
@@ -0,0 +1,76 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import java.io.InputStream;
+
+import org.apache.cayenne.util.Util;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @since 4.1
+ */
+public abstract class BaseHandlerTest {
+
+    protected void parse(String tag, HandlerFactory factory) throws Exception {
+        try(InputStream in = DbKeyGeneratorHandlerTest.class.getResource(getClass().getSimpleName() + ".xml").openStream()) {
+            XMLReader parser = Util.createXmlReader();
+            DefaultHandler handler = new TestRootHandler(parser, tag, factory);
+            parser.setContentHandler(handler);
+            parser.parse(new InputSource(in));
+        }
+    }
+
+    public interface HandlerFactory {
+        NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent);
+    }
+
+    public static class TestRootHandler extends NamespaceAwareNestedTagHandler {
+
+        private String rootTag;
+        private BaseHandlerTest.HandlerFactory factory;
+
+        public TestRootHandler(XMLReader parser, String rootTag, BaseHandlerTest.HandlerFactory factory) {
+            super(new LoaderContext(parser, new DefaultHandlerFactory()));
+            setTargetNamespace("");
+            this.rootTag = rootTag;
+            this.factory = factory;
+        }
+
+        @Override
+        protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
+            return false;
+        }
+
+        @Override
+        protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String qName, Attributes attributes) {
+            if(localName.equals(rootTag)) {
+                return factory.createHandler(this);
+            }
+            return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbEntityHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbEntityHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbEntityHandlerTest.java
new file mode 100644
index 0000000..1a7da41
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbEntityHandlerTest.java
@@ -0,0 +1,82 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import java.sql.Types;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @since 4.1
+ */
+public class DbEntityHandlerTest extends BaseHandlerTest {
+
+    @Test
+    public void testLoad() throws Exception {
+
+        final DataMap map = new DataMap();
+        assertTrue(map.getDbEntities().isEmpty());
+
+        parse("db-entity", new HandlerFactory() {
+            @Override
+            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
+                return new DbEntityHandler(parent, map);
+            }
+        });
+
+        assertEquals(1, map.getDbEntities().size());
+
+        DbEntity entity = map.getDbEntity("ARTGROUP");
+        assertNotNull(entity);
+        assertNull(entity.getPrimaryKeyGenerator());
+        assertEquals(3, entity.getAttributes().size());
+        assertEquals("catalog", entity.getCatalog());
+        assertEquals("schema", entity.getSchema());
+        assertEquals("name = \"test\"", entity.getQualifier().toString());
+
+        DbAttribute attribute = entity.getAttribute("GROUP_ID");
+        assertNotNull(attribute);
+        assertTrue(attribute.isMandatory());
+        assertTrue(attribute.isPrimaryKey());
+        assertTrue(attribute.isGenerated());
+        assertEquals(Types.INTEGER, attribute.getType());
+
+        attribute = entity.getAttribute("NAME");
+        assertNotNull(attribute);
+        assertTrue(attribute.isMandatory());
+        assertFalse(attribute.isPrimaryKey());
+        assertFalse(attribute.isGenerated());
+        assertEquals(100, attribute.getMaxLength());
+        assertEquals(Types.VARCHAR, attribute.getType());
+
+        attribute = entity.getAttribute("PARENT_GROUP_ID");
+        assertNotNull(attribute);
+        assertFalse(attribute.isMandatory());
+        assertFalse(attribute.isPrimaryKey());
+        assertFalse(attribute.isGenerated());
+        assertEquals(10, attribute.getScale());
+        assertEquals(Types.BIT, attribute.getType());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbKeyGeneratorHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbKeyGeneratorHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbKeyGeneratorHandlerTest.java
new file mode 100644
index 0000000..157f8d0
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbKeyGeneratorHandlerTest.java
@@ -0,0 +1,51 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbKeyGenerator;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @since 4.1
+ */
+public class DbKeyGeneratorHandlerTest extends BaseHandlerTest {
+
+    @Test
+    public void testParsing()throws Exception {
+        final DbEntity dbEntity = new DbEntity("TEST");
+
+        parse("db-key-generator", new HandlerFactory() {
+            @Override
+            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
+                return new DbKeyGeneratorHandler(parent, dbEntity);
+            }
+        });
+
+        assertNotNull(dbEntity.getPrimaryKeyGenerator());
+        assertEquals("gallery_seq", dbEntity.getPrimaryKeyGenerator().getGeneratorName());
+        assertEquals(20, (int)dbEntity.getPrimaryKeyGenerator().getKeyCacheSize());
+        assertEquals(DbKeyGenerator.ORACLE_TYPE, dbEntity.getPrimaryKeyGenerator().getGeneratorType());
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbRelationshipHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbRelationshipHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbRelationshipHandlerTest.java
new file mode 100644
index 0000000..4aba0cb
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/DbRelationshipHandlerTest.java
@@ -0,0 +1,58 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @since 4.1
+ */
+public class DbRelationshipHandlerTest extends BaseHandlerTest {
+
+    @Test
+    public void testParsing()throws Exception {
+        final DataMap map = new DataMap();
+        DbEntity entity = new DbEntity("ARTIST");
+        map.addDbEntity(entity);
+        assertEquals(0, entity.getRelationships().size());
+
+        parse("db-relationship", new HandlerFactory() {
+            @Override
+            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
+                return new DbRelationshipHandler(parent, map);
+            }
+        });
+
+        assertEquals(1, entity.getRelationships().size());
+        DbRelationship relationship = entity.getRelationship("artistPaintings");
+        assertNotNull(relationship);
+
+        assertEquals("PAINTING", relationship.getTargetEntityName());
+        assertTrue(relationship.isToDependentPK());
+        assertTrue(relationship.isToMany());
+        assertEquals("ID", relationship.getJoins().get(0).getSourceName());
+        assertEquals("ARTIST_ID", relationship.getJoins().get(0).getTargetName());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
new file mode 100644
index 0000000..963bb9a
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @since 4.1
+ */
+public class ObjEntityHandlerTest extends BaseHandlerTest {
+
+    @Test
+    public void testLoad() throws Exception {
+
+        final DataMap map = new DataMap();
+        assertEquals(0, map.getObjEntities().size());
+
+        parse("obj-entity", new HandlerFactory() {
+            @Override
+            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
+                return new ObjEntityHandler(parent, map);
+            }
+        });
+
+        assertEquals(1, map.getObjEntities().size());
+        ObjEntity entity = map.getObjEntity("ArtistCallback");
+        assertNotNull(entity);
+        assertTrue(entity.isAbstract());
+        assertTrue(entity.isReadOnly());
+        assertTrue(entity.isServerOnly());
+        assertFalse(entity.isClientAllowed());
+        assertEquals(3, entity.getAttributes().size());
+        assertEquals(8, entity.getCallbackMethods().size());
+        assertEquals(ObjEntity.LOCK_TYPE_OPTIMISTIC, entity.getDeclaredLockType());
+        assertEquals("org.apache.cayenne.testdo.testmap.ArtistCallback", entity.getClassName());
+        assertNull("super.class should be suppressed by super entity", entity.getSuperClassName());
+        assertEquals("Artist", entity.getSuperEntityName());
+        assertEquals("client.class", entity.getClientClassName());
+        assertNull("client.super.class should be suppressed by super entity", entity.getClientSuperClassName());
+        assertEquals("ARTIST_CT", entity.getDbEntityName());
+
+        ObjAttribute attribute = entity.getAttribute("artistName");
+        assertNotNull(attribute);
+        assertEquals("NAME", attribute.getDbAttributeName());
+        assertEquals("java.lang.String", attribute.getType());
+        assertTrue(attribute.isUsedForLocking());
+
+        attribute = entity.getAttribute("dateOfBirth");
+        assertNotNull(attribute);
+        assertNull(attribute.getDbAttributeName());
+        assertEquals("java.util.Date", attribute.getType());
+        assertFalse(attribute.isUsedForLocking());
+
+        attribute = entity.getAttribute("embeddable1");
+        assertNotNull(attribute);
+        assertNull(attribute.getDbAttributeName());
+        assertEquals("org.apache.cayenne.testdo.embeddable.Embeddable1", attribute.getType());
+        assertFalse(attribute.isUsedForLocking());
+
+        String override = entity.getDeclaredAttributeOverrides().get("name");
+        assertEquals("parent.child.name", override);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjRelationshipHandlerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjRelationshipHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjRelationshipHandlerTest.java
new file mode 100644
index 0000000..2765955
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjRelationshipHandlerTest.java
@@ -0,0 +1,61 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.configuration.xml;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DeleteRule;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @since 4.1
+ */
+public class ObjRelationshipHandlerTest extends BaseHandlerTest {
+
+    @Test
+    public void testLoad() throws Exception {
+
+        final DataMap map = new DataMap();
+        ObjEntity entity = new ObjEntity("ArtGroup");
+        map.addObjEntity(entity);
+        assertEquals(0, entity.getRelationships().size());
+
+
+        parse("obj-relationship", new HandlerFactory() {
+            @Override
+            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
+                return new ObjRelationshipHandler(parent, map);
+            }
+        });
+
+        assertEquals(1, entity.getRelationships().size());
+        ObjRelationship relationship = entity.getRelationship("artistArray");
+        assertNotNull(relationship);
+
+        assertEquals(DeleteRule.CASCADE, relationship.getDeleteRule());
+        assertEquals("java.util.Map", relationship.getCollectionType());
+        assertEquals("artistName", relationship.getMapKey());
+        assertEquals("Artist", relationship.getTargetEntityName());
+        assertTrue(relationship.isUsedForLocking());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoaderTest.java
new file mode 100644
index 0000000..fab4129
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoaderTest.java
@@ -0,0 +1,171 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.configuration.xml;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.ConfigurationTree;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
+import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.resource.URLResource;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.URL;
+import java.util.Collection;
+import java.util.Iterator;
+
+import static org.junit.Assert.*;
+
+public class XMLDataChannelDescriptorLoaderTest {
+
+    private Injector injector;
+
+    @Before
+    public void setUp() throws Exception {
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+                binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
+                binder.bind(DataChannelMetaData.class).to(NoopDataChannelMetaData.class);
+
+            }
+        };
+
+        this.injector = DIBootstrap.createInjector(testModule);
+    }
+
+    @Test
+    public void testLoadEmpty() {
+
+        // create and initialize loader instance to test
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+
+        String testConfigName = "testConfig1";
+
+        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
+        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
+
+        assertNotNull(tree);
+        assertNotNull(tree.getRootNode());
+        assertEquals(testConfigName, tree.getRootNode().getName());
+    }
+
+    @Test
+    public void testLoad_MissingConfig() throws Exception {
+
+        // create and initialize loader instance to test
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+
+        try {
+            loader.load(new URLResource(new URL("file:///no_such_resource")));
+            fail("No exception was thrown on bad absent config name");
+        } catch (ConfigurationException e) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testLoadDataMap() {
+
+        // create and initialize loader instance to test
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+
+        String testConfigName = "testConfig2";
+        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
+
+        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
+
+        assertNotNull(tree);
+        assertNotNull(tree.getRootNode());
+
+        assertEquals(testConfigName, tree.getRootNode().getName());
+
+        Collection<DataMap> maps = tree.getRootNode().getDataMaps();
+        assertEquals(1, maps.size());
+        assertEquals("testConfigMap2", maps.iterator().next().getName());
+    }
+
+    @Test
+    public void testLoadDataEverything() {
+
+        // create and initialize loader instance to test
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+
+        String testConfigName = "testConfig3";
+        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
+
+        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
+
+        assertNotNull(tree);
+
+        DataChannelDescriptor descriptor = tree.getRootNode();
+        assertNotNull(descriptor);
+        assertEquals(testConfigName, descriptor.getName());
+
+        Collection<DataMap> maps = descriptor.getDataMaps();
+        assertEquals(2, maps.size());
+
+        Iterator<DataMap> mapsIt = maps.iterator();
+
+        DataMap map1 = mapsIt.next();
+        DataMap map2 = mapsIt.next();
+
+        assertEquals("testConfigMap3_1", map1.getName());
+        assertEquals("testConfigMap3_2", map2.getName());
+
+        Collection<DataNodeDescriptor> nodes = descriptor.getNodeDescriptors();
+        assertEquals(1, nodes.size());
+
+        DataNodeDescriptor node1 = nodes.iterator().next();
+        assertEquals("testConfigNode3", node1.getName());
+        assertNull(node1.getParameters());
+        assertNotNull(node1.getDataSourceDescriptor());
+        assertEquals(1, node1.getDataSourceDescriptor().getMinConnections());
+        assertEquals(1, node1.getDataSourceDescriptor().getMaxConnections());
+
+        assertEquals("org.example.test.Adapter", node1.getAdapterType());
+        assertEquals("org.example.test.DataSourceFactory", node1.getDataSourceFactoryType());
+        assertEquals("org.example.test.SchemaUpdateStartegy", node1.getSchemaUpdateStrategyType());
+        assertNotNull(node1.getDataMapNames());
+
+        assertEquals(1, node1.getDataMapNames().size());
+
+        assertEquals("testConfigMap3_2", node1.getDataMapNames().iterator().next());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
new file mode 100644
index 0000000..e416774
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
@@ -0,0 +1,158 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.configuration.xml;
+
+import java.net.URL;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
+import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.SQLTemplateDescriptor;
+import org.apache.cayenne.resource.URLResource;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class XMLDataMapLoaderTest {
+
+    private Injector injector;
+
+    private DataMapLoader loader;
+
+    @Before
+    public void setUp() throws Exception {
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+                binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
+                binder.bind(DataChannelMetaData.class).to(NoopDataChannelMetaData.class);
+            }
+        };
+
+        injector = DIBootstrap.createInjector(testModule);
+        loader = injector.getInstance(DataMapLoader.class);
+    }
+
+    @Test(expected = CayenneRuntimeException.class)
+    public void loadMissingConfig() throws Exception {
+        loader.load(new URLResource(new URL("file:/no_such_file_for_map_xml")));
+    }
+
+    @Test
+    public void loadEmptyConfig() throws Exception {
+        URL url = getClass().getResource("testConfigMap2.map.xml");
+        DataMap map = loader.load(new URLResource(url));
+
+        assertNotNull(map);
+        assertEquals("testConfigMap2", map.getName());
+        assertTrue(map.getDbEntities().isEmpty());
+        assertTrue(map.getObjEntities().isEmpty());
+        assertTrue(map.getProcedures().isEmpty());
+        assertTrue(map.getQueryDescriptors().isEmpty());
+        assertTrue(map.getEmbeddables().isEmpty());
+        assertNull(map.getDefaultCatalog());
+        assertNull(map.getDefaultSchema());
+        assertNull(map.getDefaultPackage());
+        assertFalse(map.isClientSupported());
+    }
+
+    @Test
+    public void loadFullDataMap() {
+        URL url = getClass().getResource("testConfigMap4.map.xml");
+        DataMap map = loader.load(new URLResource(url));
+
+        assertNotNull(map);
+        assertEquals("testConfigMap4", map.getName());
+
+        // check general state
+        assertEquals(12, map.getDbEntities().size());
+        assertEquals(17, map.getObjEntities().size());
+        assertEquals(4, map.getProcedures().size());
+        assertEquals(14, map.getQueryDescriptors().size());
+        assertEquals(1, map.getEmbeddables().size());
+        assertEquals("TEST_CATALOG", map.getDefaultCatalog());
+        assertNull(map.getDefaultSchema());
+        assertEquals("org.apache.cayenne.testdo.testmap", map.getDefaultPackage());
+        assertTrue(map.isClientSupported());
+
+        // check some loaded content
+        assertEquals("org.apache.cayenne.testdo.testmap.Artist",
+                map.getObjEntity("Artist").getClassName());
+        assertEquals(5,
+                map.getObjEntity("CompoundPainting").getAttributes().size());
+        assertEquals(3,
+                map.getObjEntity("Artist").getRelationships().size());
+        assertEquals(7,
+                map.getObjEntity("ArtistCallback").getCallbackMethods().size());
+
+        assertEquals("name = \"test\"",
+                map.getDbEntity("ARTGROUP").getQualifier().toString());
+        assertEquals(4,
+                map.getDbEntity("EXHIBIT").getAttributes().size());
+        assertEquals(3,
+                map.getDbEntity("PAINTING").getRelationships().size());
+        assertEquals("gallery_seq",
+                map.getDbEntity("GALLERY").getPrimaryKeyGenerator().getGeneratorName());
+
+        DbAttribute pk1 = map.getDbEntity("EXHIBIT").getAttribute("EXHIBIT_ID");
+        assertFalse(pk1.isGenerated());
+        assertTrue(pk1.isPrimaryKey());
+
+        DbAttribute pk2 = map.getDbEntity("GENERATED_COLUMN").getAttribute("GENERATED_COLUMN");
+        assertTrue(pk2.isGenerated());
+        assertTrue(pk2.isPrimaryKey());
+
+        assertEquals(true,
+                map.getProcedure("cayenne_tst_out_proc").isReturningValue());
+        assertEquals(1,
+                map.getProcedure("cayenne_tst_out_proc").getCallOutParameters().size());
+        assertEquals(2,
+                map.getProcedure("cayenne_tst_out_proc").getCallParameters().size());
+
+        assertEquals("true",
+                map.getQueryDescriptor("EjbqlQueryTest")
+                        .getProperty("cayenne.GenericSelectQuery.fetchingDataRows"));
+
+        SQLTemplateDescriptor descriptor = (SQLTemplateDescriptor)map.getQueryDescriptor("NonSelectingQuery");
+        assertEquals("INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE) " +
+                        "VALUES (512, 'No Painting Like This', 12.5)",
+                descriptor.getAdapterSql().get("org.apache.cayenne.dba.db2.DB2Adapter"));
+
+        assertEquals("TEST",
+                map.getEmbeddable("org.apache.cayenne.testdo.Embeddable")
+                        .getAttribute("test").getDbAttributeName());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
index 87be992..cf81326 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
@@ -19,16 +19,21 @@
 
 package org.apache.cayenne.map;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.EmptyConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
+import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
 import org.junit.Test;
-import org.xml.sax.InputSource;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
+import java.net.URL;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -40,6 +45,8 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * DataMap unit tests.
@@ -187,7 +194,7 @@ public class DataMapTest {
         try {
             map.addObjEntity(e2);
             fail("Should not be able to add more than one entity with the same name");
-        } catch (Exception e) {
+        } catch (Exception ignored) {
         }
     }
 
@@ -403,10 +410,10 @@ public class DataMapTest {
         assertNotNull(proceduresCollection);
         assertEquals(len, proceduresCollection.size());
 
-        for (int i = 0; i < len; i++) {
-            Procedure proc = map.getProcedure(expectedNames[i]);
+        for (String expectedName : expectedNames) {
+            Procedure proc = map.getProcedure(expectedName);
             assertNotNull(proc);
-            assertEquals(expectedNames[i], proc.getName());
+            assertEquals(expectedName, proc.getName());
         }
     }
 
@@ -416,32 +423,38 @@ public class DataMapTest {
         map.setQuotingSQLIdentifiers(true);
         StringWriter w = new StringWriter();
         XMLEncoder encoder = new XMLEncoder(new PrintWriter(w));
-        map.encodeAsXML(encoder);
+        map.encodeAsXML(encoder, new EmptyConfigurationNodeVisitor());
 
         assertTrue(map.quotingSQLIdentifiers);
 
-        MapLoader loader = new MapLoader();
+        XMLDataMapLoader loader = new XMLDataMapLoader();
         try {
+            URL url = mock(URL.class);
             InputStream is = new ByteArrayInputStream(w.getBuffer().toString().getBytes("UTF-8"));
-            DataMap newMap = loader.loadDataMap(new InputSource(is));
+            when(url.openStream()).thenReturn(is);
+
+            DataMap newMap = loader.load(new URLResource(url));
             assertTrue(newMap.quotingSQLIdentifiers);
 
-        } catch (UnsupportedEncodingException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
 
         map.setQuotingSQLIdentifiers(false);
         StringWriter w2 = new StringWriter();
         XMLEncoder encoder2 = new XMLEncoder(new PrintWriter(w2));
-        map.encodeAsXML(encoder2);
+        map.encodeAsXML(encoder2, new EmptyConfigurationNodeVisitor());
 
         assertFalse(map.quotingSQLIdentifiers);
         try {
-            InputStream is = new ByteArrayInputStream(w2.getBuffer().toString().getBytes("UTF-8"));
-            DataMap newMap = loader.loadDataMap(new InputSource(is));
+            URL url = mock(URL.class);
+            InputStream is = new ByteArrayInputStream(w.getBuffer().toString().getBytes("UTF-8"));
+            when(url.openStream()).thenReturn(is);
+
+            DataMap newMap = loader.load(new URLResource(url));
             assertFalse(newMap.quotingSQLIdentifiers);
 
-        } catch (UnsupportedEncodingException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
deleted file mode 100644
index 41529da..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MapLoaderLoadTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.map;
-
-import org.apache.cayenne.query.*;
-import org.apache.cayenne.test.file.FileUtil;
-import org.apache.cayenne.testdo.embeddable.Embeddable1;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.util.XMLEncoder;
-import org.junit.Test;
-import org.xml.sax.InputSource;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintWriter;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class MapLoaderLoadTest {
-
-    private InputSource getMapXml(String mapName) {
-        return new InputSource(getClass().getClassLoader().getResourceAsStream(mapName));
-    }
-
-    @Test
-    public void testLoadEmbeddableMap() throws Exception {
-        MapLoader mapLoader = new MapLoader();
-        DataMap map = mapLoader.loadDataMap(getMapXml("embeddable.map.xml"));
-        assertNotNull(map);
-
-        assertEquals(1, map.getEmbeddables().size());
-        Embeddable e = map.getEmbeddable(Embeddable1.class.getName());
-        assertNotNull(e);
-        assertEquals(Embeddable1.class.getName(), e.getClassName());
-
-        assertEquals(2, e.getAttributes().size());
-        EmbeddableAttribute ea1 = e.getAttribute("embedded10");
-        assertNotNull(ea1);
-        assertEquals("embedded10", ea1.getName());
-        assertEquals("java.lang.String", ea1.getType());
-        assertEquals("EMBEDDED10", ea1.getDbAttributeName());
-
-        EmbeddableAttribute ea2 = e.getAttribute("embedded20");
-        assertNotNull(ea2);
-        assertEquals("embedded20", ea2.getName());
-        assertEquals("java.lang.String", ea2.getType());
-        assertEquals("EMBEDDED20", ea2.getDbAttributeName());
-
-        ObjEntity oe = map.getObjEntity("EmbedEntity1");
-        assertNotNull(oe);
-        assertEquals(3, oe.getDeclaredAttributes().size());
-
-        EmbeddedAttribute oea1 = (EmbeddedAttribute) oe.getAttribute("embedded1");
-        assertNotNull(oea1);
-        assertEquals(Embeddable1.class.getName(), oea1.getType());
-        assertEquals(0, oea1.getAttributeOverrides().size());
-
-        EmbeddedAttribute oea2 = (EmbeddedAttribute) oe.getAttribute("embedded2");
-        assertNotNull(oea2);
-        assertEquals(Embeddable1.class.getName(), oea2.getType());
-        assertEquals(2, oea2.getAttributeOverrides().size());
-    }
-
-    @Test
-    public void testLoadTestMap() throws Exception {
-        MapLoader mapLoader = new MapLoader();
-        DataMap map = mapLoader.loadDataMap(getMapXml("testmap.map.xml"));
-        assertNotNull(map);
-
-        // test procedures
-        Procedure procedure = map.getProcedure("cayenne_tst_upd_proc");
-        assertNotNull(procedure);
-        List<ProcedureParameter> params = procedure.getCallParameters();
-        assertNotNull(params);
-        assertEquals(1, params.size());
-        ProcedureParameter param = params.get(0);
-        assertNotNull(param);
-        assertEquals("paintingPrice", param.getName());
-        assertEquals(ProcedureParameter.IN_PARAMETER, param.getDirection());
-
-        // test super class name
-        // We expect the artist entity to have a super class name... test map should be
-        // set up in that way.
-        // No other assertions can be made (the actual super class may change)
-        ObjEntity ent = map.getObjEntity("Painting");
-        assertNotNull(ent.getSuperClassName());
-
-        //text exclude... parameters
-        ObjEntity artistCallbackTestEntity = map.getObjEntity("ArtistCallback");
-        assertTrue(artistCallbackTestEntity.isExcludingDefaultListeners());
-        assertTrue(artistCallbackTestEntity.isExcludingSuperclassListeners());
-
-        checkLoadedQueries(map);
-    }
-
-    @Test
-    public void testEncodeAsXML() throws FileNotFoundException {
-        // load map
-        MapLoader mapLoader = new MapLoader();
-        DataMap map = mapLoader.loadDataMap(getMapXml("testmap.map.xml"));
-        assertNotNull(map);
-
-        // encode map
-        File file = new File(FileUtil.baseTestDirectory(), "testmap_generated.map.xml");
-        PrintWriter pw = new PrintWriter(new FileOutputStream(file));
-        map.encodeAsXML(new XMLEncoder(pw));
-        pw.close();
-    }
-
-    private void checkLoadedQueries(DataMap map) throws Exception {
-        SelectQueryDescriptor queryWithQualifier = (SelectQueryDescriptor) map.getQueryDescriptor("QueryWithQualifier");
-        assertNotNull(queryWithQualifier);
-        assertTrue(queryWithQualifier.getRoot() instanceof ObjEntity);
-        assertEquals("Artist", ((Entity) queryWithQualifier.getRoot()).getName());
-        assertNotNull(queryWithQualifier.getQualifier());
-
-        SelectQueryDescriptor queryWithOrdering = (SelectQueryDescriptor) map.getQueryDescriptor("QueryWithOrdering");
-        assertNotNull(queryWithOrdering);
-        assertTrue(queryWithOrdering.getRoot() instanceof ObjEntity);
-        assertEquals("Artist", ((Entity) queryWithOrdering.getRoot()).getName());
-        assertEquals(2, queryWithOrdering.getOrderings().size());
-
-        Ordering artistNameOrdering = queryWithOrdering.getOrderings().get(0);
-        assertEquals(Artist.ARTIST_NAME.getName(), artistNameOrdering.getSortSpecString());
-        assertFalse(artistNameOrdering.isAscending());
-        assertTrue(artistNameOrdering.isCaseInsensitive());
-
-        Ordering dobOrdering = queryWithOrdering.getOrderings().get(1);
-        assertEquals(Artist.DATE_OF_BIRTH.getName(), dobOrdering.getSortSpecString());
-        assertTrue(dobOrdering.isAscending());
-        assertFalse(dobOrdering.isCaseInsensitive());
-
-        SelectQueryDescriptor queryWithPrefetch = (SelectQueryDescriptor) map.getQueryDescriptor("QueryWithPrefetch");
-        assertNotNull(queryWithPrefetch);
-        assertTrue(queryWithPrefetch.getRoot() instanceof ObjEntity);
-        assertEquals("Gallery", ((Entity) queryWithPrefetch.getRoot()).getName());
-        assertNotNull(queryWithPrefetch.getPrefetches());
-        assertEquals(1, queryWithPrefetch.getPrefetches().size());
-        assertTrue(queryWithPrefetch.getPrefetches().contains(Gallery.PAINTING_ARRAY.getName()));
-
-        QueryDescriptor nonSelectingQuery = map.getQueryDescriptor("NonSelectingQuery");
-        assertNotNull(nonSelectingQuery);
-        assertEquals("NonSelectingQuery", nonSelectingQuery.getName());
-        assertEquals("UPPER", nonSelectingQuery.getProperties().get("cayenne.SQLTemplate.columnNameCapitalization"));
-        
-        EJBQLQueryDescriptor ejbqlQueryTest = (EJBQLQueryDescriptor) map.getQueryDescriptor("EjbqlQueryTest");
-        assertNotNull(ejbqlQueryTest);
-        assertEquals("EjbqlQueryTest", ejbqlQueryTest.getName());
-        assertNotNull(ejbqlQueryTest.getEjbql());
-        assertEquals("SHARED_CACHE", ejbqlQueryTest.getProperties().get("cayenne.GenericSelectQuery.cacheStrategy"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
index 22ce347..238b58b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.map;
 
-import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -35,7 +35,7 @@ public class MockAttribute extends Attribute {
     }
 
     @Override
-    public void encodeAsXML(XMLEncoder encoder) {
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/MockEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockEntity.java
index 26840aa..cfbb739 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockEntity.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.map;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.util.XMLEncoder;
@@ -56,7 +57,8 @@ public class MockEntity extends Entity {
         return null;
     }
 
-    public void encodeAsXML(XMLEncoder encoder) {
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
index 2150bcf..2b89a34 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.map;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.util.XMLEncoder;
 
 public class MockRelationship extends Relationship {
@@ -36,7 +37,8 @@ public class MockRelationship extends Relationship {
         return null;
     }
 
-    public void encodeAsXML(XMLEncoder encoder) {
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
index bc8f7a5..29bfa35 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
@@ -20,7 +20,11 @@
 package org.apache.cayenne.map;
 
 import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.EmptyConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.ExpressionException;
@@ -89,7 +93,7 @@ public class ObjRelationshipIT extends ServerCase {
         r.setCollectionType("java.util.Map");
         r.setMapKey("bla");
 
-        r.encodeAsXML(encoder);
+        r.encodeAsXML(encoder, new EmptyConfigurationNodeVisitor());
         out.close();
 
         String lineBreak = System.getProperty("line.separator");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/map/QueryDescriptorLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/QueryDescriptorLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/QueryDescriptorLoaderTest.java
index 4ca4843..757acc3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/QueryDescriptorLoaderTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/QueryDescriptorLoaderTest.java
@@ -47,7 +47,7 @@ public class QueryDescriptorLoaderTest {
         DbEntity entity = new DbEntity("DB1");
         map.addDbEntity(entity);
 
-        builder.setRoot(map, MapLoader.DB_ENTITY_ROOT, "DB1");
+        builder.setRoot(map, QueryDescriptor.DB_ENTITY_ROOT, "DB1");
         assertSame(entity, builder.getRoot());
     }
 
@@ -57,7 +57,7 @@ public class QueryDescriptorLoaderTest {
         ObjEntity entity = new ObjEntity("OBJ1");
         map.addObjEntity(entity);
 
-        builder.setRoot(map, MapLoader.OBJ_ENTITY_ROOT, "OBJ1");
+        builder.setRoot(map, QueryDescriptor.OBJ_ENTITY_ROOT, "OBJ1");
         assertSame(entity, builder.getRoot());
     }
 
@@ -65,7 +65,7 @@ public class QueryDescriptorLoaderTest {
     public void testSetRootDataMap() throws Exception {
         DataMap map = new DataMap("map");
 
-        builder.setRoot(map, MapLoader.DATA_MAP_ROOT, null);
+        builder.setRoot(map, QueryDescriptor.DATA_MAP_ROOT, null);
         assertSame(map, builder.getRoot());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
index b1b2495..dbf4bde 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
@@ -20,11 +20,13 @@ package org.apache.cayenne.query;
 
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.configuration.EmptyConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.ejbql.EJBQLException;
 import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.map.EJBQLQueryDescriptor;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
@@ -307,28 +309,16 @@ public class EJBQLQueryIT extends ServerCase {
         XMLEncoder e = new XMLEncoder(new PrintWriter(w));
 
         String separator = System.getProperty("line.separator");
+        String s = "<query name=\"" + name + "\" type=\"EJBQLQuery\">" + separator +
+                "<ejbql><![CDATA[" + ejbql + "]]></ejbql>" + separator +
+                "</query>" + separator;
 
-        StringBuffer s = new StringBuffer("<query name=\"");
-        s.append(name);
-        s.append("\" factory=\"");
-        s.append("org.apache.cayenne.map.EjbqlBuilder");
-        s.append("\">");
-        s.append(separator);
+        EJBQLQueryDescriptor descriptor = new EJBQLQueryDescriptor();
+        descriptor.setEjbql(ejbql);
+        descriptor.setName(name);
+        descriptor.encodeAsXML(e, new EmptyConfigurationNodeVisitor());
 
-        EJBQLQuery query = new EJBQLQuery(ejbql);
-
-        if (query.getEjbqlStatement() != null) {
-            s.append("<ejbql><![CDATA[");
-            s.append(query.getEjbqlStatement());
-            s.append("]]></ejbql>");
-        }
-        s.append(separator);
-        s.append("</query>");
-        s.append(separator);
-        query.setName(name);
-        query.encodeAsXML(e);
-
-        assertEquals(w.getBuffer().toString(), s.toString());
+        assertEquals(w.getBuffer().toString(), s);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/DBCleaner.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/DBCleaner.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/DBCleaner.java
index af12a3d..04f8629 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/DBCleaner.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/DBCleaner.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.unit.di.server;
 
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
+import org.apache.cayenne.configuration.xml.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DataMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java
index 69c4400..a8d6ad0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java
@@ -28,6 +28,8 @@ import org.apache.cayenne.access.translator.batch.DefaultBatchTranslatorFactory;
 import org.apache.cayenne.access.translator.select.DefaultSelectTranslatorFactory;
 import org.apache.cayenne.ashwood.AshwoodEntitySorter;
 import org.apache.cayenne.cache.MapQueryCache;
+import org.apache.cayenne.configuration.xml.DefaultHandlerFactory;
+import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.event.DefaultEventManager;
@@ -35,15 +37,14 @@ import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.MapLoader;
 import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.testdo.extended_type.StringET1ExtendedType;
 import org.apache.cayenne.unit.UnitDbAdapter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.xml.sax.InputSource;
 
-import java.io.InputStream;
+import java.net.URL;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -113,10 +114,11 @@ public class SchemaBuilder {
 		DataMap[] maps = new DataMap[MAPS_REQUIRING_SCHEMA_SETUP.length];
 
 		for (int i = 0; i < maps.length; i++) {
-			InputStream stream = getClass().getClassLoader().getResourceAsStream(MAPS_REQUIRING_SCHEMA_SETUP[i]);
-			InputSource in = new InputSource(stream);
-			in.setSystemId(MAPS_REQUIRING_SCHEMA_SETUP[i]);
-			maps[i] = new MapLoader().loadDataMap(in);
+			URL mapURL = getClass().getClassLoader().getResource(MAPS_REQUIRING_SCHEMA_SETUP[i]);
+			XMLDataMapLoader loader = new XMLDataMapLoader();
+			loader.setHandlerFactory(new DefaultHandlerFactory());
+			maps[i] = loader.load(new URLResource(mapURL));
+
 		}
 
 		this.domain = new DataDomain("temp");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java
index ae4e01b..3386c1b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java
@@ -52,10 +52,14 @@ import org.apache.cayenne.configuration.DefaultObjectStoreFactory;
 import org.apache.cayenne.configuration.DefaultRuntimeProperties;
 import org.apache.cayenne.configuration.ObjectStoreFactory;
 import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.DefaultHandlerFactory;
+import org.apache.cayenne.configuration.xml.HandlerFactory;
+import org.apache.cayenne.configuration.xml.NoopDataChannelMetaData;
+import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
@@ -198,6 +202,8 @@ public class ServerCaseModule implements Module {
         binder.bind(ObjectStoreFactory.class).to(DefaultObjectStoreFactory.class);
         binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
         binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+        binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
+        binder.bind(DataChannelMetaData.class).to(NoopDataChannelMetaData.class);
 
         // test-scoped objects
         binder.bind(EntityResolver.class).toProvider(ServerCaseEntityResolverProvider.class).in(testScope);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/array-type.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/array-type.map.xml b/cayenne-server/src/test/resources/array-type.map.xml
index 8cc8f27..d5165eb 100644
--- a/cayenne-server/src/test/resources/array-type.map.xml
+++ b/cayenne-server/src/test/resources/array-type.map.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
-          project-version="9">
-    <property name="defaultPackage" value="org.apache.cayenne.testdo.array_type"/>
-    <property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
-    <property name="clientSupported" value="true"/>
-    <property name="defaultClientPackage" value="test.client"/>
-    <property name="defaultClientSuperclass" value="org.apache.cayenne.PersistentObject"/>
-    <db-entity name="ARRAY_TEST">
-        <db-attribute name="DOUBLE_ARRAY" type="VARBINARY" length="1024"/>
-        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-    </db-entity>
-    <obj-entity name="ArrayTestEntity" className="org.apache.cayenne.testdo.array_type.ArrayTestEntity" dbEntityName="ARRAY_TEST">
-        <obj-attribute name="doubleArray" type="java.lang.Double[]" db-attribute-path="DOUBLE_ARRAY"/>
-    </obj-entity>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+	 project-version="10">
+	<property name="defaultPackage" value="org.apache.cayenne.testdo.array_type"/>
+	<property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
+	<property name="clientSupported" value="true"/>
+	<property name="defaultClientPackage" value="test.client"/>
+	<property name="defaultClientSuperclass" value="org.apache.cayenne.PersistentObject"/>
+	<db-entity name="ARRAY_TEST">
+		<db-attribute name="DOUBLE_ARRAY" type="VARBINARY" length="1024"/>
+		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+	</db-entity>
+	<obj-entity name="ArrayTestEntity" className="org.apache.cayenne.testdo.array_type.ArrayTestEntity" dbEntityName="ARRAY_TEST">
+		<obj-attribute name="doubleArray" type="java.lang.Double[]" db-attribute-path="DOUBLE_ARRAY"/>
+	</obj-entity>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/binary-pk.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/binary-pk.map.xml b/cayenne-server/src/test/resources/binary-pk.map.xml
index cd53ff2..775b10f 100644
--- a/cayenne-server/src/test/resources/binary-pk.map.xml
+++ b/cayenne-server/src/test/resources/binary-pk.map.xml
@@ -1,34 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
-          project-version="9">
-    <property name="defaultPackage" value="org.apache.cayenne.testdo.binary_pk"/>
-    <property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
-    <property name="clientSupported" value="true"/>
-    <property name="defaultClientPackage" value="test.client"/>
-    <property name="defaultClientSuperclass" value="org.apache.cayenne.PersistentObject"/>
-    <db-entity name="BINARY_PK_TEST1">
-        <db-attribute name="BIN_ID" type="VARBINARY" isPrimaryKey="true" isMandatory="true" length="32"/>
-        <db-attribute name="NAME" type="VARCHAR" length="10"/>
-    </db-entity>
-    <db-entity name="BINARY_PK_TEST2">
-        <db-attribute name="DETAIL_NAME" type="VARCHAR" length="10"/>
-        <db-attribute name="FK_ID" type="VARBINARY" length="32"/>
-        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-    </db-entity>
-    <obj-entity name="BinaryPKTest1" className="org.apache.cayenne.testdo.binary_pk.BinaryPKTest1" dbEntityName="BINARY_PK_TEST1">
-        <obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-    </obj-entity>
-    <obj-entity name="BinaryPKTest2" className="org.apache.cayenne.testdo.binary_pk.BinaryPKTest2" dbEntityName="BINARY_PK_TEST2">
-        <obj-attribute name="detailName" type="java.lang.String" db-attribute-path="DETAIL_NAME"/>
-    </obj-entity>
-    <db-relationship name="binaryPKDetails" source="BINARY_PK_TEST1" target="BINARY_PK_TEST2" toMany="true">
-        <db-attribute-pair source="BIN_ID" target="FK_ID"/>
-    </db-relationship>
-    <db-relationship name="toBinaryPKMaster" source="BINARY_PK_TEST2" target="BINARY_PK_TEST1" toMany="false">
-        <db-attribute-pair source="FK_ID" target="BIN_ID"/>
-    </db-relationship>
-    <obj-relationship name="binaryPKDetails" source="BinaryPKTest1" target="BinaryPKTest2" db-relationship-path="binaryPKDetails"/>
-    <obj-relationship name="toBinaryPKMaster" source="BinaryPKTest2" target="BinaryPKTest1" db-relationship-path="toBinaryPKMaster"/>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+	 project-version="10">
+	<property name="defaultPackage" value="org.apache.cayenne.testdo.binary_pk"/>
+	<property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
+	<property name="clientSupported" value="true"/>
+	<property name="defaultClientPackage" value="test.client"/>
+	<property name="defaultClientSuperclass" value="org.apache.cayenne.PersistentObject"/>
+	<db-entity name="BINARY_PK_TEST1">
+		<db-attribute name="BIN_ID" type="VARBINARY" isPrimaryKey="true" isMandatory="true" length="32"/>
+		<db-attribute name="NAME" type="VARCHAR" length="10"/>
+	</db-entity>
+	<db-entity name="BINARY_PK_TEST2">
+		<db-attribute name="DETAIL_NAME" type="VARCHAR" length="10"/>
+		<db-attribute name="FK_ID" type="VARBINARY" length="32"/>
+		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+	</db-entity>
+	<obj-entity name="BinaryPKTest1" className="org.apache.cayenne.testdo.binary_pk.BinaryPKTest1" dbEntityName="BINARY_PK_TEST1">
+		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
+	</obj-entity>
+	<obj-entity name="BinaryPKTest2" className="org.apache.cayenne.testdo.binary_pk.BinaryPKTest2" dbEntityName="BINARY_PK_TEST2">
+		<obj-attribute name="detailName" type="java.lang.String" db-attribute-path="DETAIL_NAME"/>
+	</obj-entity>
+	<db-relationship name="binaryPKDetails" source="BINARY_PK_TEST1" target="BINARY_PK_TEST2" toMany="true">
+		<db-attribute-pair source="BIN_ID" target="FK_ID"/>
+	</db-relationship>
+	<db-relationship name="toBinaryPKMaster" source="BINARY_PK_TEST2" target="BINARY_PK_TEST1">
+		<db-attribute-pair source="FK_ID" target="BIN_ID"/>
+	</db-relationship>
+	<obj-relationship name="binaryPKDetails" source="BinaryPKTest1" target="BinaryPKTest2" db-relationship-path="binaryPKDetails"/>
+	<obj-relationship name="toBinaryPKMaster" source="BinaryPKTest2" target="BinaryPKTest1" db-relationship-path="toBinaryPKMaster"/>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cay-2032.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cay-2032.map.xml b/cayenne-server/src/test/resources/cay-2032.map.xml
index 9a3b380..00b3875 100644
--- a/cayenne-server/src/test/resources/cay-2032.map.xml
+++ b/cayenne-server/src/test/resources/cay-2032.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
 	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
-	 project-version="9">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+	 project-version="10">
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.cay_2032"/>
 	<db-entity name="TEAM">
 		<db-attribute name="team_id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
@@ -15,8 +15,7 @@
 		<db-attribute name="team_id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 		<db-attribute name="user_id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 	</db-entity>
-	<obj-entity name="Team" className="org.apache.cayenne.testdo.cay_2032.Team" dbEntityName="TEAM">
-	</obj-entity>
+	<obj-entity name="Team" className="org.apache.cayenne.testdo.cay_2032.Team" dbEntityName="TEAM"/>
 	<obj-entity name="User" className="org.apache.cayenne.testdo.cay_2032.User" dbEntityName="USERS">
 		<obj-attribute name="name" type="byte[]" db-attribute-path="name"/>
 	</obj-entity>
@@ -26,10 +25,10 @@
 	<db-relationship name="userHasTeam" source="USERS" target="USER_HAS_TEAM" toMany="true">
 		<db-attribute-pair source="user_id" target="user_id"/>
 	</db-relationship>
-	<db-relationship name="team" source="USER_HAS_TEAM" target="TEAM" toMany="false">
+	<db-relationship name="team" source="USER_HAS_TEAM" target="TEAM">
 		<db-attribute-pair source="team_id" target="team_id"/>
 	</db-relationship>
-	<db-relationship name="user" source="USER_HAS_TEAM" target="USERS" toMany="false">
+	<db-relationship name="user" source="USER_HAS_TEAM" target="USERS">
 		<db-attribute-pair source="user_id" target="user_id"/>
 	</db-relationship>
 	<obj-relationship name="teamUsers" source="Team" target="User" deleteRule="Deny" db-relationship-path="userHasTeam.user"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cay743/cayenne-domain.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cay743/cayenne-domain.xml b/cayenne-server/src/test/resources/cay743/cayenne-domain.xml
index 5909898..b69e50c 100644
--- a/cayenne-server/src/test/resources/cay743/cayenne-domain.xml
+++ b/cayenne-server/src/test/resources/cay743/cayenne-domain.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
+<domain project-version="10">
 	<map name="map1"/>
 	<map name="map2"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cay743/map1.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cay743/map1.map.xml b/cayenne-server/src/test/resources/cay743/map1.map.xml
index d13c6d5..07a0754 100644
--- a/cayenne-server/src/test/resources/cay743/map1.map.xml
+++ b/cayenne-server/src/test/resources/cay743/map1.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
 	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
-	 project-version="9">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+	 project-version="10">
 	<obj-entity name="Entity11">
 	</obj-entity>
 	<obj-entity name="Entity12" superEntityName="Entity22">

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cay743/map2.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cay743/map2.map.xml b/cayenne-server/src/test/resources/cay743/map2.map.xml
index 43b5d19..aab2c64 100644
--- a/cayenne-server/src/test/resources/cay743/map2.map.xml
+++ b/cayenne-server/src/test/resources/cay743/map2.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
 	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
-	 project-version="9">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+	 project-version="10">
 	<obj-entity name="Entity21" superEntityName="Entity11">
 	</obj-entity>
 	<obj-entity name="Entity22">

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-array-type.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-array-type.xml b/cayenne-server/src/test/resources/cayenne-array-type.xml
index fdf8c4e..424431b 100644
--- a/cayenne-server/src/test/resources/cayenne-array-type.xml
+++ b/cayenne-server/src/test/resources/cayenne-array-type.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="array-type"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="array-type"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-binary-pk.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-binary-pk.xml b/cayenne-server/src/test/resources/cayenne-binary-pk.xml
index d6d21b2..ff071fa 100644
--- a/cayenne-server/src/test/resources/cayenne-binary-pk.xml
+++ b/cayenne-server/src/test/resources/cayenne-binary-pk.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="binary-pk"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="binary-pk"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-cay-2032.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-cay-2032.xml b/cayenne-server/src/test/resources/cayenne-cay-2032.xml
index f9427a7..5b19286 100644
--- a/cayenne-server/src/test/resources/cayenne-cay-2032.xml
+++ b/cayenne-server/src/test/resources/cayenne-cay-2032.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
 	<map name="cay-2032"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-compound.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-compound.xml b/cayenne-server/src/test/resources/cayenne-compound.xml
index b82d21f..1445b53 100644
--- a/cayenne-server/src/test/resources/cayenne-compound.xml
+++ b/cayenne-server/src/test/resources/cayenne-compound.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="compound"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="compound"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-date-time.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-date-time.xml b/cayenne-server/src/test/resources/cayenne-date-time.xml
index 3fda070..9e67951 100644
--- a/cayenne-server/src/test/resources/cayenne-date-time.xml
+++ b/cayenne-server/src/test/resources/cayenne-date-time.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="date-time"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="date-time"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-delete-rules.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-delete-rules.xml b/cayenne-server/src/test/resources/cayenne-delete-rules.xml
index 606e583..7dd2bb4 100644
--- a/cayenne-server/src/test/resources/cayenne-delete-rules.xml
+++ b/cayenne-server/src/test/resources/cayenne-delete-rules.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="delete-rules"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="delete-rules"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-embeddable.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-embeddable.xml b/cayenne-server/src/test/resources/cayenne-embeddable.xml
index 8aa7459..aedacf3 100644
--- a/cayenne-server/src/test/resources/cayenne-embeddable.xml
+++ b/cayenne-server/src/test/resources/cayenne-embeddable.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="embeddable"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="embeddable"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c58b6f40/cayenne-server/src/test/resources/cayenne-empty.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-empty.xml b/cayenne-server/src/test/resources/cayenne-empty.xml
index 3ee43c4..b0b7614 100644
--- a/cayenne-server/src/test/resources/cayenne-empty.xml
+++ b/cayenne-server/src/test/resources/cayenne-empty.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="9">
-    <map name="empty"/>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 project-version="10">
+	<map name="empty"/>
 </domain>