You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by ta...@apache.org on 2016/03/19 21:21:04 UTC

[2/2] deltaspike git commit: DELTASPIKE-1095 Move persistence/orm.xml mapping + parsing from DATA impl to JPA api/spi

DELTASPIKE-1095 Move  persistence/orm.xml mapping + parsing from DATA impl to JPA api/spi

Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/6480a0e5
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/6480a0e5
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/6480a0e5

Branch: refs/heads/master
Commit: 6480a0e5466567f487f36d73de697c6310f69149
Parents: f30b389
Author: Thomas Andraschko <ta...@apache.org>
Authored: Sat Mar 19 21:20:52 2016 +0100
Committer: Thomas Andraschko <ta...@apache.org>
Committed: Sat Mar 19 21:20:52 2016 +0100

----------------------------------------------------------------------
 .../core/util/AggregatedClassLoader.java        |  95 ++++++++
 .../data/impl/RepositoryExtension.java          |   4 +-
 .../meta/extractor/TypeMetadataExtractor.java   |   8 +-
 .../data/impl/meta/unit/Descriptor.java         |  47 ----
 .../meta/unit/DescriptorHierarchyBuilder.java   |  88 -------
 .../data/impl/meta/unit/DescriptorReader.java   | 115 ---------
 .../data/impl/meta/unit/EntityDescriptor.java   |  81 -------
 .../impl/meta/unit/EntityDescriptorReader.java  | 223 ------------------
 .../meta/unit/MappedSuperclassDescriptor.java   |  67 ------
 .../data/impl/meta/unit/PersistenceUnit.java    |  72 ------
 .../impl/meta/unit/PersistenceUnitReader.java   | 130 ----------
 .../data/impl/meta/unit/PersistenceUnits.java   | 150 ------------
 .../meta/unit/PersistentClassDescriptor.java    | 140 -----------
 .../data/impl/meta/verifier/EntityVerifier.java |   6 +-
 .../deltaspike/data/impl/util/EntityUtils.java  |  21 +-
 .../impl/util/cl/AggregatedClassLoader.java     |  93 --------
 .../unit/DescriptorHierarchyBuilderTest.java    |  26 +-
 .../impl/meta/unit/PersistenceUnitsTest.java    |  44 ++--
 .../xml/AbstractEntityDescriptor.java           | 108 +++++++++
 .../xml/AbstractEntityHierarchyBuilder.java     |  81 +++++++
 .../jpa/spi/descriptor/xml/Descriptor.java      |  46 ++++
 .../spi/descriptor/xml/DescriptorReader.java    | 114 +++++++++
 .../spi/descriptor/xml/EntityDescriptor.java    |  63 +++++
 .../xml/EntityMappingsDescriptor.java           |  66 ++++++
 .../xml/EntityMappingsDescriptorParser.java     | 235 +++++++++++++++++++
 .../xml/MappedSuperclassDescriptor.java         |  48 ++++
 .../xml/PersistenceUnitDescriptor.java          |  80 +++++++
 .../xml/PersistenceUnitDescriptorParser.java    | 136 +++++++++++
 .../xml/PersistenceUnitDescriptorProvider.java  | 191 +++++++++++++++
 .../xml/EntityMappingsDescriptorParserTest.java | 114 +++++++++
 .../test/jpa/spi/descriptor/xml/MappedId.java   |  36 +++
 .../test/jpa/spi/descriptor/xml/MappedOne.java  |  56 +++++
 .../spi/descriptor/xml/MappedSuperclass.java    |  36 +++
 .../jpa/spi/descriptor/xml/MappedThree.java     |  36 +++
 .../test/jpa/spi/descriptor/xml/MappedTwo.java  |  59 +++++
 .../PersistenceUnitDescriptorParserTest.java    |  71 ++++++
 .../PersistenceUnitDescriptorProviderTest.java  |  43 ++++
 .../test/jpa/spi/descriptor/xml/TeeId.java      | 103 ++++++++
 .../src/test/resources/META-INF/persistence.xml |  38 +++
 .../src/test/resources/META-INF/test-orm.xml    |  58 +++++
 40 files changed, 1978 insertions(+), 1250 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AggregatedClassLoader.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AggregatedClassLoader.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AggregatedClassLoader.java
new file mode 100644
index 0000000..84f9106
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AggregatedClassLoader.java
@@ -0,0 +1,95 @@
+/*
+ * 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.deltaspike.core.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+public class AggregatedClassLoader extends ClassLoader
+{
+
+    private final List<ClassLoader> classLoaders;
+
+    public AggregatedClassLoader(List<ClassLoader> classLoaders)
+    {
+        super();
+        this.classLoaders = classLoaders;
+    }
+
+    public static AggregatedClassLoader newInstance()
+    {
+        return new AggregatedClassLoader(Arrays.asList(
+                AggregatedClassLoader.class.getClassLoader(),
+                Thread.currentThread().getContextClassLoader(),
+                ClassLoader.getSystemClassLoader()));
+    }
+
+    @Override
+    public URL getResource(String name)
+    {
+        for (ClassLoader loader : classLoaders)
+        {
+            URL url = loader.getResource(name);
+            if (url != null)
+            {
+                return url;
+            }
+        }
+        return super.getResource(name);
+    }
+
+    @Override
+    public Enumeration<URL> getResources(String name) throws IOException
+    {
+        final Set<URL> result = new LinkedHashSet<URL>();
+        
+        for (ClassLoader loader : classLoaders)
+        {
+            Enumeration<URL> urls = loader.getResources(name);
+            while (urls.hasMoreElements())
+            {
+                result.add(urls.nextElement());
+            }
+        }
+        
+        return new Enumeration<URL>()
+        {
+            private final Iterator<URL> iterator = result.iterator();
+
+            @Override
+            public URL nextElement()
+            {
+                return iterator.next();
+            }
+
+            @Override
+            public boolean hasMoreElements()
+            {
+                return iterator.hasNext();
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java
index f33545d..28714a7 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java
@@ -39,7 +39,7 @@ import org.apache.deltaspike.data.api.AbstractEntityRepository;
 import org.apache.deltaspike.data.api.AbstractFullEntityRepository;
 import org.apache.deltaspike.data.api.Repository;
 import org.apache.deltaspike.data.impl.meta.RepositoryComponents;
-import org.apache.deltaspike.data.impl.meta.unit.PersistenceUnits;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.PersistenceUnitDescriptorProvider;
 
 /**
  * The main extension class for Repositories, based on PartialBeans. Handles following events:<br/>
@@ -77,7 +77,7 @@ public class RepositoryExtension implements Extension, Deactivatable
         {
             return;
         }
-        PersistenceUnits.instance().init();
+        PersistenceUnitDescriptorProvider.getInstance().init();
     }
 
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractor.java
index f02a621..043ab88 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractor.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractor.java
@@ -71,11 +71,17 @@ public class TypeMetadataExtractor implements MetadataExtractor
         {
             return null;
         }
+        
         ParameterizedType parametrizedType = (ParameterizedType) type;
         Type[] genericTypes = parametrizedType.getActualTypeArguments();
+        
         RepositoryEntity result = null;
-        for (Type genericType : genericTypes)
+        
+        // don't use a foreach here, we must be sure that the we first get the entity type
+        for (int i = 0; i < genericTypes.length; i++)
         {
+            Type genericType = genericTypes[i];
+            
             if (genericType instanceof Class && EntityUtils.isEntityClass((Class<?>) genericType))
             {
                 result = new RepositoryEntity((Class<?>) genericType);

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/Descriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/Descriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/Descriptor.java
deleted file mode 100644
index 8350f36..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/Descriptor.java
+++ /dev/null
@@ -1,47 +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.deltaspike.data.impl.meta.unit;
-
-import java.net.URL;
-
-import org.w3c.dom.Document;
-
-class Descriptor
-{
-
-    private final Document document;
-    private final URL url;
-
-    public Descriptor(Document document, URL url)
-    {
-        this.document = document;
-        this.url = url;
-    }
-
-    public Document getDocument()
-    {
-        return document;
-    }
-
-    public URL getUrl()
-    {
-        return url;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilder.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilder.java
deleted file mode 100644
index e57099c..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilder.java
+++ /dev/null
@@ -1,88 +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.deltaspike.data.impl.meta.unit;
-
-import java.util.List;
-
-public final class DescriptorHierarchyBuilder
-{
-
-    private final List<EntityDescriptor> entities;
-    private final List<MappedSuperclassDescriptor> superClasses;
-
-    private DescriptorHierarchyBuilder(List<EntityDescriptor> entities,
-            List<MappedSuperclassDescriptor> superClasses)
-    {
-        this.entities = entities;
-        this.superClasses = superClasses;
-    }
-
-    public static DescriptorHierarchyBuilder newInstance(List<EntityDescriptor> entities,
-            List<MappedSuperclassDescriptor> superClasses)
-    {
-        return new DescriptorHierarchyBuilder(entities, superClasses);
-    }
-
-    public void buildHierarchy()
-    {
-        for (EntityDescriptor descriptor : entities)
-        {
-            buildHierarchy(descriptor);
-        }
-    }
-
-    private void buildHierarchy(PersistentClassDescriptor descriptor)
-    {
-        Class<?> superClass = descriptor.getEntityClass().getSuperclass();
-        while (superClass != null)
-        {
-            PersistentClassDescriptor superDescriptor = findPersistentClassDescriptor(superClass);
-            if (superDescriptor != null)
-            {
-                if (descriptor.getParent() == null)
-                {
-                    buildHierarchy(superDescriptor);
-                }
-                descriptor.setParent(superDescriptor);
-                return;
-            }
-            superClass = superClass.getSuperclass();
-        }
-    }
-
-    private PersistentClassDescriptor findPersistentClassDescriptor(Class<?> superClass)
-    {
-        for (MappedSuperclassDescriptor descriptor : superClasses)
-        {
-            if (descriptor.getEntityClass().equals(superClass))
-            {
-                return descriptor;
-            }
-        }
-        for (EntityDescriptor descriptor : entities)
-        {
-            if (descriptor.getEntityClass().equals(superClass))
-            {
-                return descriptor;
-            }
-        }
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorReader.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorReader.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorReader.java
deleted file mode 100644
index 300b904..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorReader.java
+++ /dev/null
@@ -1,115 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.deltaspike.data.impl.util.cl.AggregatedClassLoader;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-abstract class DescriptorReader
-{
-    private static final Logger log = Logger.getLogger(DescriptorReader.class.getName());
-
-    private final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-
-    List<Descriptor> readAllFromClassPath(String resource) throws IOException
-    {
-        List<Descriptor> result = new LinkedList<Descriptor>();
-        Enumeration<URL> urls = classLoader().getResources(resource);
-        while (urls.hasMoreElements())
-        {
-            URL u = urls.nextElement();
-            try
-            {
-                result.add(readFromUrl(u));
-            }
-            catch (Exception e)
-            {
-                log.log(Level.WARNING, "Could not load " + resource + " from " + u, e);
-            }
-        }
-        return Collections.unmodifiableList(result);
-    }
-
-    Descriptor readFromClassPath(String resource) throws IOException
-    {
-        return readFromUrl(classLoader().getResource(resource));
-    }
-
-    Descriptor readFromUrl(URL url) throws IOException
-    {
-        InputStream stream = url.openStream();
-        try
-        {
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            return new Descriptor(builder.parse(new InputSource(stream)), url);
-        }
-        catch (SAXException e)
-        {
-            throw new RuntimeException("Failed reading XML document", e);
-        }
-        catch (ParserConfigurationException e)
-        {
-            throw new RuntimeException("Failed reading XML document", e);
-        }
-        finally
-        {
-            stream.close();
-        }
-    }
-
-    Descriptor read(String baseUrl, String resource) throws IOException
-    {
-        try
-        {
-            URL url = new URL(baseUrl + resource);
-            return readFromUrl(url);
-        }
-        catch (Exception e)
-        {
-            return readFromClassPath(resource);
-        }
-    }
-
-    String extractBaseUrl(URL fileUrl, String resource)
-    {
-        String file = fileUrl.toString();
-        return file.substring(0, file.length() - resource.length());
-    }
-
-    ClassLoader classLoader()
-    {
-        return AggregatedClassLoader.newInstance();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java
deleted file mode 100644
index 6469baa..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java
+++ /dev/null
@@ -1,81 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.Serializable;
-
-import static org.apache.deltaspike.core.util.StringUtils.isEmpty;
-
-class EntityDescriptor extends PersistentClassDescriptor
-{
-
-    protected final String tableName;
-
-    EntityDescriptor(String name, String packageName, String className, String idClass, String id,
-                     String version, String tableName)
-    {
-        super(name, packageName, className, idClass, id, version);
-        this.tableName = tableName;
-    }
-
-    public boolean is(Class<?> entityClass)
-    {
-        return this.entityClass.equals(entityClass);
-    }
-
-    @Override
-    public Class<? extends Serializable> getIdClass()
-    {
-        if (idClass == null && getParent() != null)
-        {
-            return getParent().getIdClass();
-        }
-        return super.getIdClass();
-    }
-
-    @Override
-    public String getId()
-    {
-        if (isEmpty(id) && getParent() != null)
-        {
-            return getParent().getId();
-        }
-        return super.getId();
-    }
-
-    public String getTableName()
-    {
-        return tableName;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuilder builder = new StringBuilder();
-        builder.append("EntityDescriptor ")
-                .append("[entityClass=").append(className(entityClass))
-                .append(", name=").append(name)
-                .append(", idClass=").append(className(idClass))
-                .append(", id=").append(id)
-                .append(", superClass=").append(getParent())
-                .append(", tableName=").append(tableName)
-                .append("]");
-        return builder.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java
deleted file mode 100644
index 0b85e70..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java
+++ /dev/null
@@ -1,223 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-public class EntityDescriptorReader extends DescriptorReader
-{
-
-    public MappingFile readAll(String baseUrl, String resource) throws IOException
-    {
-        return readFromDocument(read(baseUrl, resource).getDocument());
-    }
-
-    public MappingFile readDefaultOrm(String baseUrl) throws IOException
-    {
-        try
-        {
-            Descriptor desc = read(baseUrl, PersistenceUnit.DEFAULT_ORM_PATH);
-            return readFromDocument(desc.getDocument());
-        }
-        catch (Exception e)
-        {
-            return new MappingFile(Collections.<EntityDescriptor>emptyList(),
-                    Collections.<MappedSuperclassDescriptor>emptyList());
-        }
-    }
-
-    public MappingFile readFromDocument(Document doc)
-    {
-        EntityBuilder<EntityDescriptor> entityDescriptorBuilder = new EntityBuilder<EntityDescriptor>()
-        {
-            @Override
-            protected EntityDescriptor instance(String name, String packageName, String className,
-                                      String idClass, String id, String version, String tableName)
-            {
-                return new EntityDescriptor(name, packageName, className, idClass, id, version, tableName);
-            }
-
-            @Override
-            protected String tagName()
-            {
-                return "entity";
-            }
-        };
-        
-        MappedSuperClassBuilder<MappedSuperclassDescriptor> superClassBuilder = 
-            new MappedSuperClassBuilder<MappedSuperclassDescriptor>()
-            {
-                @Override
-                protected MappedSuperclassDescriptor instance(String name, String packageName, String className,
-                                                    String idClass, String id, String version)
-                {
-                    return new MappedSuperclassDescriptor(name, packageName, className, idClass, id, version);
-                }
-
-                @Override
-                protected String tagName()
-                {
-                    return "mapped-superclass";
-                }
-            };
-        return new MappingFile(entityDescriptorBuilder.build(doc), superClassBuilder.build(doc));
-    }
-
-    private String extractNodeAttribute(Element element, String childName, String attribute)
-    {
-        NodeList list = element.getElementsByTagName(childName);
-        if (list.getLength() == 0)
-        {
-            return null;
-        }
-        return extractAttribute(list.item(0), attribute);
-    }
-
-    private String extractAttribute(Node item, String name)
-    {
-        Node node = item.getAttributes().getNamedItem(name);
-        if (node != null)
-        {
-            return node.getTextContent();
-        }
-        return null;
-    }
-
-    private String extractNodeContent(Element element, String name)
-    {
-        NodeList list = element.getElementsByTagName(name);
-        if (list.getLength() == 0)
-        {
-            return null;
-        }
-        return list.item(0).getTextContent();
-    }
-
-    public static class MappingFile
-    {
-        private final List<EntityDescriptor> entities;
-        private final List<MappedSuperclassDescriptor> superClasses;
-
-        public MappingFile(List<EntityDescriptor> entities, List<MappedSuperclassDescriptor> superClasses)
-        {
-            this.entities = entities;
-            this.superClasses = superClasses;
-        }
-
-        public List<EntityDescriptor> getEntities()
-        {
-            return entities;
-        }
-
-        public List<MappedSuperclassDescriptor> getSuperClasses()
-        {
-            return superClasses;
-        }
-    }
-
-
-    private abstract class PersistenceBuilder<T extends PersistentClassDescriptor>
-    {
-        protected List<T> result;
-        protected String packageName;
-        protected String name;
-        protected String className;
-        protected String idClass;
-        protected String id;
-        protected String version;
-        protected String embeddedId;
-
-        public List<T> build(Document doc)
-        {
-            this.result = new LinkedList<T>();
-            this.packageName = extractNodeContent(doc.getDocumentElement(), "package");
-            NodeList mappings = doc.getElementsByTagName(tagName());
-            for (int i = 0; i < mappings.getLength(); i++)
-            {
-                this.name = extractAttribute(mappings.item(i), "name");
-                this.className = extractAttribute(mappings.item(i), "class");
-                this.idClass = extractNodeAttribute((Element) mappings.item(i), "id-class", "class");
-                this.id = extractNodeAttribute((Element) mappings.item(i), "id", "name");
-                this.version = extractNodeAttribute((Element) mappings.item(i), "version", "name");
-                this.embeddedId = extractNodeAttribute((Element) mappings.item(i), "embedded-id", "name");
-                addFields((Element) mappings.item(i));
-                addInResult();
-            }
-            return this.result;
-        }
-
-        protected abstract String tagName();
-
-        protected abstract void addInResult();
-
-        protected abstract void addFields(Element element);
-    }
-
-    private abstract class MappedSuperClassBuilder<T extends PersistentClassDescriptor> extends PersistenceBuilder<T>
-    {
-        protected abstract T instance(String name, String packageName, String className, String idClass, String id,
-                                      String version);
-
-        protected abstract String tagName();
-
-        @Override
-        protected void addInResult()
-        {
-            result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId, version));
-        }
-
-        @Override
-        protected void addFields(Element element)
-        {
-            // do nothing;
-        }
-    }
-
-    private abstract class EntityBuilder<T extends PersistentClassDescriptor> extends PersistenceBuilder<T>
-    {
-
-        protected String tableName;
-
-        protected abstract T instance(String name, String packageName, String className, String idClass, String id,
-                                      String version, String tableName);
-
-        protected abstract String tagName();
-
-        @Override
-        protected void addInResult()
-        {
-            result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId,
-                version, tableName));
-        }
-
-        @Override
-        protected void addFields(Element element)
-        {
-            this.tableName = extractNodeAttribute(element, "table", "name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java
deleted file mode 100644
index 58d752b..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java
+++ /dev/null
@@ -1,67 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.Serializable;
-import org.apache.deltaspike.core.util.StringUtils;
-
-class MappedSuperclassDescriptor extends PersistentClassDescriptor
-{
-
-    MappedSuperclassDescriptor(String name, String packageName, String className, String idClass, String id,
-                               String version)
-    {
-        super(name, packageName, className, idClass, id, version);
-    }
-
-    @Override
-    public Class<? extends Serializable> getIdClass()
-    {
-        if (idClass == null && getParent() != null)
-        {
-            return getParent().getIdClass();
-        }
-        return super.getIdClass();
-    }
-
-    @Override
-    public String getId()
-    {
-        if (StringUtils.isEmpty(id) && getParent() != null)
-        {
-            return getParent().getId();
-        }
-        return super.getId();
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuilder builder = new StringBuilder();
-        builder.append("MappedSuperclassDescriptor ")
-                .append("[entityClass=").append(className(entityClass))
-                .append(", name=").append(name)
-                .append(", idClass=").append(className(idClass))
-                .append(", id=").append(id)
-                .append(", parent=").append(getParent())
-                .append("]");
-        return builder.toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnit.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnit.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnit.java
deleted file mode 100644
index e238385..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnit.java
+++ /dev/null
@@ -1,72 +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.deltaspike.data.impl.meta.unit;
-
-import java.util.List;
-import java.util.Map;
-
-public class PersistenceUnit
-{
-
-    public static final String RESOURCE_PATH = "META-INF/persistence.xml";
-    public static final String DEFAULT_ORM_PATH = "META-INF/orm.xml";
-
-    private final String unitName;
-    private final List<EntityDescriptor> entities;
-    private final Map<String, String> properties;
-
-    PersistenceUnit(String unitName, List<EntityDescriptor> entities, Map<String, String> properties)
-    {
-        this.unitName = unitName;
-        this.entities = entities;
-        this.properties = properties;
-    }
-
-    public EntityDescriptor find(Class<?> entityClass)
-    {
-        for (EntityDescriptor entity : entities)
-        {
-            if (entity.is(entityClass))
-            {
-                return entity;
-            }
-        }
-        return null;
-    }
-
-    public String getUnitName()
-    {
-        return unitName;
-    }
-    
-    public Map<String, String> getProperties()
-    {
-        return properties;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuilder builder = new StringBuilder();
-        builder.append("PersistenceUnit [unitName=").append(unitName)
-                .append(", entities=").append(entities).append("]");
-        return builder.toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitReader.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitReader.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitReader.java
deleted file mode 100644
index ed30e32..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitReader.java
+++ /dev/null
@@ -1,130 +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.deltaspike.data.impl.meta.unit;
-
-import org.apache.deltaspike.data.impl.meta.unit.EntityDescriptorReader.MappingFile;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-public class PersistenceUnitReader extends DescriptorReader
-{
-
-    public List<PersistenceUnit> readAll() throws IOException
-    {
-        List<PersistenceUnit> result = new LinkedList<PersistenceUnit>();
-        List<Descriptor> persistenceXmls = readAllFromClassPath(PersistenceUnit.RESOURCE_PATH);
-        for (Descriptor desc : persistenceXmls)
-        {
-            result.addAll(lookupUnits(desc));
-        }
-        return Collections.unmodifiableList(result);
-    }
-
-    private List<PersistenceUnit> lookupUnits(Descriptor descriptor)
-    {
-        List<PersistenceUnit> result = new LinkedList<PersistenceUnit>();
-        NodeList list = descriptor.getDocument().getDocumentElement().getElementsByTagName("persistence-unit");
-        for (int i = 0; i < list.getLength(); i++)
-        {
-            Node node = list.item(i);
-            String unitName = extractUnitName(node);
-            String baseUrl = extractBaseUrl(descriptor.getUrl(), PersistenceUnit.RESOURCE_PATH);
-            List<EntityDescriptor> entities = extractMappings((Element) node, baseUrl, unitName);
-            Map<String, String> properties = extractProperties((Element) node);
-            result.add(new PersistenceUnit(unitName, entities, properties));
-        }
-        return result;
-    }
-
-    private List<EntityDescriptor> extractMappings(Element element, String baseUrl, String unitName)
-    {
-        try
-        {
-            EntityDescriptorReader reader = new EntityDescriptorReader();
-            List<EntityDescriptor> entities = new LinkedList<EntityDescriptor>();
-            List<MappedSuperclassDescriptor> superClasses = new LinkedList<MappedSuperclassDescriptor>();
-            NodeList list = element.getElementsByTagName("mapping-file");
-            readMappingFiles(baseUrl, unitName, reader, entities, superClasses, list);
-            MappingFile mappings = reader.readDefaultOrm(baseUrl);
-            entities.addAll(mappings.getEntities());
-            superClasses.addAll(mappings.getSuperClasses());
-            DescriptorHierarchyBuilder.newInstance(entities, superClasses).buildHierarchy();
-            return entities;
-        }
-        catch (Exception e)
-        {
-            throw new RuntimeException("Failed initializing mapping files", e);
-        }
-    }
-
-    private void readMappingFiles(String baseUrl, String unitName, EntityDescriptorReader reader,
-                                  List<EntityDescriptor> entities, List<MappedSuperclassDescriptor> superClasses,
-                                  NodeList list)
-    {
-        for (int i = 0; i < list.getLength(); i++)
-        {
-            String resource = list.item(i).getTextContent();
-            try
-            {
-                MappingFile mappings = reader.readAll(baseUrl, resource);
-                entities.addAll(mappings.getEntities());
-                superClasses.addAll(mappings.getSuperClasses());
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException("[PersistenceUnit: " + unitName + "] " +
-                        "Unable to resolve named mapping-file [" + resource + "]");
-            }
-        }
-    }
-
-    private String extractUnitName(Node node)
-    {
-        return node.getAttributes().getNamedItem("name").getTextContent();
-    }
-
-    private Map<String, String> extractProperties(Element element)
-    {
-        Map<String, String> propertiesMap = new HashMap<String, String>();
-
-        Node propertiesNode = element.getElementsByTagName("properties").item(0);
-        if (propertiesNode != null)
-        {
-            NodeList propertyNodes = propertiesNode.getChildNodes();
-            for (int i = 0; i < propertyNodes.getLength(); i++)
-            {
-                if ("property".equals(propertyNodes.item(i).getNodeName()))
-                {
-                    Element propertyNode = (Element) propertyNodes.item(i);
-                    propertiesMap.put(propertyNode.getAttribute("name"), propertyNode.getAttribute("value"));
-                }
-            }
-        }
-
-        return Collections.unmodifiableMap(propertiesMap);
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java
deleted file mode 100644
index 9bbb0e7..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java
+++ /dev/null
@@ -1,150 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
-
-public final class PersistenceUnits
-{
-
-    private static PersistenceUnits instance = new PersistenceUnits();
-
-    private List<PersistenceUnit> persistenceUnits = Collections.emptyList();
-
-    private PersistenceUnits()
-    {
-    }
-
-    public static PersistenceUnits instance()
-    {
-        return instance;
-    }
-
-    public void init()
-    {
-        persistenceUnits = readPersistenceXmls();
-    }
-
-    public PersistenceUnit get(String name)
-    {
-        for (PersistenceUnit unit : persistenceUnits)
-        {
-            if (name.equalsIgnoreCase(unit.getUnitName()))
-            {
-                return unit;
-            }
-        }
-        return null;
-    }
-
-    public boolean isEntity(Class<?> entityClass)
-    {
-        return find(entityClass) != null;
-    }
-
-    public String primaryKeyField(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null)
-        {
-            return entity.getId();
-        }
-        return null;
-    }
-
-    public String versionField(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null)
-        {
-            return entity.getVersion();
-        }
-        return null;
-    }
-
-    public Class<?> primaryKeyIdClass(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null && entity.getIdClass() != null)
-        {
-            return entity.getIdClass();
-        }
-        return null;
-    }
-
-    public String entityName(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null)
-        {
-            return entity.getName();
-        }
-        return null;
-    }
-
-    public RepositoryEntity lookupMetadata(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null)
-        {
-            return new RepositoryEntity(entityClass, entity.getIdClass());
-        }
-        return null;
-    }
-
-    private List<PersistenceUnit> readPersistenceXmls()
-    {
-        try
-        {
-            PersistenceUnitReader reader = new PersistenceUnitReader();
-            return reader.readAll();
-        }
-        catch (IOException e)
-        {
-            throw new RuntimeException("Failed to read persistence unit info", e);
-        }
-    }
-
-    private EntityDescriptor find(Class<?> entityClass)
-    {
-        for (PersistenceUnit unit : persistenceUnits)
-        {
-            EntityDescriptor entity = unit.find(entityClass);
-            if (entity != null)
-            {
-                return entity;
-            }
-        }
-        return null;
-    }
-
-    public String entityTableName(Class<?> entityClass)
-    {
-        EntityDescriptor entity = find(entityClass);
-        if (entity != null)
-        {
-            return entity.getTableName();
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java
deleted file mode 100644
index 6c45b4f..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java
+++ /dev/null
@@ -1,140 +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.deltaspike.data.impl.meta.unit;
-
-import java.io.Serializable;
-
-import org.apache.deltaspike.data.impl.property.query.NamedPropertyCriteria;
-import org.apache.deltaspike.data.impl.property.query.PropertyQueries;
-import org.apache.deltaspike.data.impl.property.query.PropertyQuery;
-
-abstract class PersistentClassDescriptor
-{
-
-    protected final String name;
-    protected final Class<?> entityClass;
-    protected final Class<? extends Serializable> idClass;
-    protected final String id;
-    protected final String version;
-    private PersistentClassDescriptor parent;
-
-    PersistentClassDescriptor(String name, String packageName, String className, String idClass, String id,
-                              String version)
-    {
-        Class<?> clazz = entityClass(className, packageName);
-        this.name = name;
-        this.entityClass = clazz;
-        this.idClass = idClass(clazz, idClass, packageName, id);
-        this.id = id;
-        this.version = version;
-    }
-
-    public Class<? extends Serializable> getIdClass()
-    {
-        return idClass;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public String getVersion()
-    {
-        return version;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    public Class<?> getEntityClass()
-    {
-        return entityClass;
-    }
-
-    String className(Class<?> clazz)
-    {
-        return clazz == null ? null : clazz.getSimpleName();
-    }
-
-    private Class<?> entityClass(String entityClass, String packageName)
-    {
-        try
-        {
-            String clazzName = buildClassName(entityClass, packageName);
-            return Class.forName(clazzName);
-        }
-        catch (ClassNotFoundException e)
-        {
-            throw new IllegalArgumentException("Can't create class " + buildClassName(entityClass, packageName), e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private Class<? extends Serializable> idClass(Class<?> entity, String idClass, String packageName, String id)
-    {
-        try
-        {
-            return (Class<? extends Serializable>) (idClass != null ? Class
-                    .forName(buildClassName(idClass, packageName)) : lookupIdClass(entity, id));
-        }
-        catch (ClassNotFoundException e)
-        {
-            throw new IllegalArgumentException("Failed to get ID class", e);
-        }
-    }
-
-    private Class<?> lookupIdClass(Class<?> entity, String id)
-    {
-        if (entity == null || id == null)
-        {
-            return null;
-        }
-        PropertyQuery<Serializable> query = PropertyQueries.<Serializable> createQuery(entity)
-                .addCriteria(new NamedPropertyCriteria(id));
-        return query.getFirstResult().getJavaClass();
-    }
-
-    private String buildClassName(String clazzName, String packageName)
-    {
-        if (clazzName == null && packageName == null)
-        {
-            return null;
-        }
-        return (packageName != null && !isClassNameQualified(clazzName)) ? packageName + "." + clazzName : clazzName;
-    }
-
-    private boolean isClassNameQualified(String name)
-    {
-        return name.contains(".");
-    }
-
-    public PersistentClassDescriptor getParent()
-    {
-        return parent;
-    }
-
-    public void setParent(PersistentClassDescriptor parent)
-    {
-        this.parent = parent;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifier.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifier.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifier.java
index e37d1a8..ada5776 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifier.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifier.java
@@ -19,8 +19,7 @@
 package org.apache.deltaspike.data.impl.meta.verifier;
 
 import javax.persistence.Entity;
-
-import org.apache.deltaspike.data.impl.meta.unit.PersistenceUnits;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.PersistenceUnitDescriptorProvider;
 
 public class EntityVerifier implements Verifier<Class<?>>
 {
@@ -28,7 +27,8 @@ public class EntityVerifier implements Verifier<Class<?>>
     @Override
     public boolean verify(Class<?> entity)
     {
-        return entity.isAnnotationPresent(Entity.class) || PersistenceUnits.instance().isEntity(entity);
+        return entity.isAnnotationPresent(Entity.class)
+                || PersistenceUnitDescriptorProvider.getInstance().isEntity(entity);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java
index ec38e34..736452f 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java
@@ -32,7 +32,6 @@ import javax.persistence.Version;
 import javax.persistence.metamodel.EntityType;
 import org.apache.deltaspike.core.util.StringUtils;
 
-import org.apache.deltaspike.data.impl.meta.unit.PersistenceUnits;
 import org.apache.deltaspike.data.impl.meta.verifier.EntityVerifier;
 import org.apache.deltaspike.data.impl.property.Property;
 import org.apache.deltaspike.data.impl.property.query.AnnotatedPropertyCriteria;
@@ -40,6 +39,7 @@ import org.apache.deltaspike.data.impl.property.query.NamedPropertyCriteria;
 import org.apache.deltaspike.data.impl.property.query.PropertyCriteria;
 import org.apache.deltaspike.data.impl.property.query.PropertyQueries;
 import org.apache.deltaspike.data.impl.property.query.PropertyQuery;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.PersistenceUnitDescriptorProvider;
 
 public final class EntityUtils
 {
@@ -56,7 +56,7 @@ public final class EntityUtils
             return entityClass.getAnnotation(IdClass.class).value(); // Serializablity isn't required, could cause
                                                                      // problems
         }
-        Class clazz = PersistenceUnits.instance().primaryKeyIdClass(entityClass);
+        Class clazz = PersistenceUnitDescriptorProvider.getInstance().primaryKeyIdClass(entityClass);
         if (clazz != null)
         {
             return clazz;
@@ -85,14 +85,14 @@ public final class EntityUtils
         }
         else
         {
-            result = PersistenceUnits.instance().entityName(entityClass);
+            result = PersistenceUnitDescriptorProvider.getInstance().entityName(entityClass);
         }
         return (result != null && !"".equals(result)) ? result : entityClass.getSimpleName();
     }
 
     public static String tableName(Class<?> entityClass, EntityManager entityManager)
     {
-        String tableName = PersistenceUnits.instance().entityTableName(entityClass);
+        String tableName = PersistenceUnitDescriptorProvider.getInstance().entityTableName(entityClass);
         if (StringUtils.isEmpty(tableName))
         {
             EntityType<?> entityType = entityManager.getMetamodel().entity(entityClass);
@@ -109,7 +109,7 @@ public final class EntityUtils
 
     public static Property<Serializable> primaryKeyProperty(Class<?> entityClass)
     {
-        for (PropertyCriteria c : criteriaList(entityClass))
+        for (PropertyCriteria c : primaryKeyPropertyCriteriaList(entityClass))
         {
             PropertyQuery<Serializable> query = PropertyQueries.<Serializable> createQuery(entityClass)
                     .addCriteria(c);
@@ -121,15 +121,18 @@ public final class EntityUtils
         throw new IllegalStateException("Class " + entityClass + " has no id defined");
     }
 
-    private static List<PropertyCriteria> criteriaList(Class<?> entityClass)
+    private static List<PropertyCriteria> primaryKeyPropertyCriteriaList(Class<?> entityClass)
     {
         List<PropertyCriteria> criteria = new LinkedList<PropertyCriteria>();
         criteria.add(new AnnotatedPropertyCriteria(Id.class));
         criteria.add(new AnnotatedPropertyCriteria(EmbeddedId.class));
-        String fromMappingFiles = PersistenceUnits.instance().primaryKeyField(entityClass);
+        String[] fromMappingFiles = PersistenceUnitDescriptorProvider.getInstance().primaryKeyFields(entityClass);
         if (fromMappingFiles != null)
         {
-            criteria.add(new NamedPropertyCriteria(fromMappingFiles));
+            for (String id : fromMappingFiles)
+            {
+                criteria.add(new NamedPropertyCriteria(id));
+            }
         }
         return criteria;
     }
@@ -139,7 +142,7 @@ public final class EntityUtils
         List<PropertyCriteria> criteriaList = new LinkedList<PropertyCriteria>();
         criteriaList.add(new AnnotatedPropertyCriteria(Version.class));
 
-        String fromMappingFiles = PersistenceUnits.instance().versionField(entityClass);
+        String fromMappingFiles = PersistenceUnitDescriptorProvider.getInstance().versionField(entityClass);
         if (fromMappingFiles != null)
         {
             criteriaList.add(new NamedPropertyCriteria(fromMappingFiles));

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/cl/AggregatedClassLoader.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/cl/AggregatedClassLoader.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/cl/AggregatedClassLoader.java
deleted file mode 100644
index 65864c9..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/cl/AggregatedClassLoader.java
+++ /dev/null
@@ -1,93 +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.deltaspike.data.impl.util.cl;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-public class AggregatedClassLoader extends ClassLoader
-{
-
-    private final List<ClassLoader> classLoaders;
-
-    public AggregatedClassLoader(List<ClassLoader> classLoaders)
-    {
-        super();
-        this.classLoaders = classLoaders;
-    }
-
-    public static AggregatedClassLoader newInstance()
-    {
-        return new AggregatedClassLoader(Arrays.asList(
-                AggregatedClassLoader.class.getClassLoader(),
-                Thread.currentThread().getContextClassLoader(),
-                ClassLoader.getSystemClassLoader()));
-    }
-
-    @Override
-    public URL getResource(String name)
-    {
-        for (ClassLoader loader : classLoaders)
-        {
-            URL url = loader.getResource(name);
-            if (url != null)
-            {
-                return url;
-            }
-        }
-        return super.getResource(name);
-    }
-
-    @Override
-    public Enumeration<URL> getResources(String name) throws IOException
-    {
-        final Set<URL> result = new LinkedHashSet<URL>();
-        for (ClassLoader loader : classLoaders)
-        {
-            Enumeration<URL> urls = loader.getResources(name);
-            while (urls.hasMoreElements())
-            {
-                result.add(urls.nextElement());
-            }
-        }
-        return new Enumeration<URL>()
-        {
-            private final Iterator<URL> iterator = result.iterator();
-
-            @Override
-            public URL nextElement()
-            {
-                return iterator.next();
-            }
-
-            @Override
-            public boolean hasMoreElements()
-            {
-                return iterator.hasNext();
-            }
-        };
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
index 4cf9a43..d050589 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
@@ -23,10 +23,10 @@ import static org.junit.Assert.assertNull;
 
 import java.util.LinkedList;
 import java.util.List;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.AbstractEntityHierarchyBuilder;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.EntityDescriptor;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.MappedSuperclassDescriptor;
 
-import org.apache.deltaspike.data.impl.meta.unit.DescriptorHierarchyBuilder;
-import org.apache.deltaspike.data.impl.meta.unit.EntityDescriptor;
-import org.apache.deltaspike.data.impl.meta.unit.MappedSuperclassDescriptor;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,23 +39,21 @@ public class DescriptorHierarchyBuilderTest
     @Before
     public void before()
     {
-        entities.add(new EntityDescriptor("test", null, EntityLevel3.class.getName(), null, null, null, null));
-        entities.add(new EntityDescriptor("test", null, EntityLevel5.class.getName(), null, null, null, null));
-
-        superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel1.class.getName(), null, "id", null));
-        superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel4.class.getName(), null, null, null));
-        superClasses.add(new MappedSuperclassDescriptor("test", null, MappedUnrelated.class.getName(), null, null, null));
-        superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel2.class.getName(), null, null, null));
+        entities.add(new EntityDescriptor(null, null, "test", EntityLevel3.class, null, null, null));
+        entities.add(new EntityDescriptor(null, null, "test", EntityLevel5.class, null, null, null));
+
+        superClasses.add(new MappedSuperclassDescriptor(new String[] { "id" }, null, "test", MappedLevel1.class,
+            null, null));
+        superClasses.add(new MappedSuperclassDescriptor(null, null, "test", MappedLevel4.class, null, null));
+        superClasses.add(new MappedSuperclassDescriptor(null, null, "test", MappedUnrelated.class, null, null));
+        superClasses.add(new MappedSuperclassDescriptor(null, null, "test", MappedLevel2.class, null, null));
     }
 
     @Test
     public void should_build_hierarchy()
     {
-        // given
-        DescriptorHierarchyBuilder builder = DescriptorHierarchyBuilder.newInstance(entities, superClasses);
-
         // when
-        builder.buildHierarchy();
+        AbstractEntityHierarchyBuilder.buildHierarchy(entities, superClasses);
 
         // then
         assertEquals(entities.size(), 2);

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
index b9bfb88..33fe4bd 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
@@ -20,10 +20,12 @@ package org.apache.deltaspike.data.impl.meta.unit;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
+import org.apache.deltaspike.data.impl.util.EntityUtils;
 import org.apache.deltaspike.data.test.domain.Parent;
 import org.apache.deltaspike.data.test.domain.TeeId;
 import org.apache.deltaspike.data.test.domain.mapped.MappedOne;
@@ -31,6 +33,8 @@ import org.apache.deltaspike.data.test.domain.mapped.MappedThree;
 import org.apache.deltaspike.data.test.domain.mapped.MappedTwo;
 import org.apache.deltaspike.data.test.service.MappedOneRepository;
 import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.EntityDescriptor;
+import org.apache.deltaspike.jpa.spi.descriptor.xml.PersistenceUnitDescriptorProvider;
 import org.apache.deltaspike.test.category.WebProfileCategory;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
@@ -43,8 +47,7 @@ import org.junit.runner.RunWith;
 @RunWith(Arquillian.class)
 @Category(WebProfileCategory.class)
 public class PersistenceUnitsTest
-{
-
+{    
     @Deployment
     public static Archive<?> deployment()
     {
@@ -66,10 +69,10 @@ public class PersistenceUnitsTest
         // given
 
         // when
-        boolean positive1 = PersistenceUnits.instance().isEntity(MappedOne.class);
-        boolean positive2 = PersistenceUnits.instance().isEntity(MappedTwo.class);
-        boolean positive3 = PersistenceUnits.instance().isEntity(MappedThree.class);
-        boolean negative = PersistenceUnits.instance().isEntity(Long.class);
+        boolean positive1 = PersistenceUnitDescriptorProvider.getInstance().isEntity(MappedOne.class);
+        boolean positive2 = PersistenceUnitDescriptorProvider.getInstance().isEntity(MappedTwo.class);
+        boolean positive3 = PersistenceUnitDescriptorProvider.getInstance().isEntity(MappedThree.class);
+        boolean negative = PersistenceUnitDescriptorProvider.getInstance().isEntity(Long.class);
 
         // then
         assertTrue(positive1);
@@ -84,12 +87,14 @@ public class PersistenceUnitsTest
         // given
 
         // when
-        String idField1 = PersistenceUnits.instance().primaryKeyField(MappedOne.class);
-        String idField2 = PersistenceUnits.instance().primaryKeyField(MappedThree.class);
+        String[] idField1 = PersistenceUnitDescriptorProvider.getInstance().primaryKeyFields(MappedOne.class);
+        String[] idField2 = PersistenceUnitDescriptorProvider.getInstance().primaryKeyFields(MappedThree.class);
 
         // then
-        assertEquals("id", idField1);
-        assertEquals("id", idField2);
+        assertEquals(1, idField1.length);
+        assertEquals("id", idField1[0]);
+        assertEquals(1, idField2.length);
+        assertEquals("id", idField2[0]);
     }
 
     @Test
@@ -98,7 +103,7 @@ public class PersistenceUnitsTest
         // given
 
         // when
-        String name = PersistenceUnits.instance().entityName(MappedOne.class);
+        String name = PersistenceUnitDescriptorProvider.getInstance().entityName(MappedOne.class);
 
         // then
         assertEquals("Mapped_One", name);
@@ -110,7 +115,7 @@ public class PersistenceUnitsTest
         // given
 
         // when
-        Class<?> idClass = PersistenceUnits.instance().primaryKeyIdClass(MappedTwo.class);
+        Class<?> idClass = PersistenceUnitDescriptorProvider.getInstance().primaryKeyIdClass(MappedTwo.class);
 
         // then
         assertEquals(TeeId.class, idClass);
@@ -122,9 +127,9 @@ public class PersistenceUnitsTest
         // given
 
         // when
-        RepositoryEntity entity1 = PersistenceUnits.instance().lookupMetadata(MappedOne.class);
-        RepositoryEntity entity2 = PersistenceUnits.instance().lookupMetadata(MappedTwo.class);
-        RepositoryEntity entity3 = PersistenceUnits.instance().lookupMetadata(MappedThree.class);
+        RepositoryEntity entity1 = lookupMetadata(MappedOne.class);
+        RepositoryEntity entity2 = lookupMetadata(MappedTwo.class);
+        RepositoryEntity entity3 = lookupMetadata(MappedThree.class);
 
         // then
         assertNotNull(entity1);
@@ -134,4 +139,13 @@ public class PersistenceUnitsTest
         assertEquals(Long.class, entity3.getPrimaryKeyClass());
     }
 
+    protected RepositoryEntity lookupMetadata(Class<?> entityClass)
+    {
+        EntityDescriptor entity = PersistenceUnitDescriptorProvider.getInstance().find(entityClass);
+        if (entity != null)
+        {
+            return new RepositoryEntity(entityClass, EntityUtils.primaryKeyClass(entityClass));
+        }
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityDescriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityDescriptor.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityDescriptor.java
new file mode 100644
index 0000000..776943d
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityDescriptor.java
@@ -0,0 +1,108 @@
+/*
+ * 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.deltaspike.jpa.spi.descriptor.xml;
+
+import java.io.Serializable;
+
+public abstract class AbstractEntityDescriptor
+{
+    private String id[];
+    private String version;
+    private String name;
+    private Class<?> entityClass;
+    private Class<? extends Serializable> idClass;
+
+    private AbstractEntityDescriptor parent;
+
+    public AbstractEntityDescriptor()
+    {
+        
+    }
+    
+    public AbstractEntityDescriptor(String[] id, String version, String name, Class<?> entityClass,
+            Class<? extends Serializable> idClass, AbstractEntityDescriptor parent)
+    {
+        this.id = id;
+        this.version = version;
+        this.name = name;
+        this.entityClass = entityClass;
+        this.idClass = idClass;
+        this.parent = parent;
+    }
+
+    public String[] getId()
+    {
+        return id;
+    }
+
+    public void setId(String[] id)
+    {
+        this.id = id;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public Class<?> getEntityClass()
+    {
+        return entityClass;
+    }
+
+    public void setEntityClass(Class<?> entityClass)
+    {
+        this.entityClass = entityClass;
+    }
+
+    public Class<? extends Serializable> getIdClass()
+    {
+        return idClass;
+    }
+
+    public void setIdClass(Class<? extends Serializable> idClass)
+    {
+        this.idClass = idClass;
+    }
+
+    public AbstractEntityDescriptor getParent()
+    {
+        return parent;
+    }
+
+    public void setParent(AbstractEntityDescriptor parent)
+    {
+        this.parent = parent;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityHierarchyBuilder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityHierarchyBuilder.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityHierarchyBuilder.java
new file mode 100644
index 0000000..3ad255e
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/AbstractEntityHierarchyBuilder.java
@@ -0,0 +1,81 @@
+/*
+ * 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.deltaspike.jpa.spi.descriptor.xml;
+
+import java.util.List;
+
+public final class AbstractEntityHierarchyBuilder
+{
+    private AbstractEntityHierarchyBuilder()
+    {
+    }
+
+    public static void buildHierarchy(List<EntityDescriptor> entities, List<MappedSuperclassDescriptor> superClasses)
+    {
+        for (EntityDescriptor descriptor : entities)
+        {
+            buildHierarchy(descriptor, entities, superClasses);
+        }
+    }
+
+    protected static void buildHierarchy(AbstractEntityDescriptor descriptor,
+            List<EntityDescriptor> entities, List<MappedSuperclassDescriptor> superClasses)
+    {
+        Class<?> superClass = descriptor.getEntityClass().getSuperclass();
+        while (superClass != null)
+        {
+            AbstractEntityDescriptor superDescriptor =
+                    findPersistentClassDescriptor(superClass, entities, superClasses);
+            if (superDescriptor != null)
+            {
+                if (descriptor.getParent() == null)
+                {
+                    buildHierarchy(superDescriptor, entities, superClasses);
+                }
+
+                descriptor.setParent(superDescriptor);
+                return;
+            }
+
+            superClass = superClass.getSuperclass();
+        }
+    }
+
+    protected static AbstractEntityDescriptor findPersistentClassDescriptor(Class<?> superClass,
+            List<EntityDescriptor> entities, List<MappedSuperclassDescriptor> superClasses)
+    {
+        for (MappedSuperclassDescriptor descriptor : superClasses)
+        {
+            if (descriptor.getEntityClass().equals(superClass))
+            {
+                return descriptor;
+            }
+        }
+
+        for (EntityDescriptor descriptor : entities)
+        {
+            if (descriptor.getEntityClass().equals(superClass))
+            {
+                return descriptor;
+            }
+        }
+
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/Descriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/Descriptor.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/Descriptor.java
new file mode 100644
index 0000000..177adfe
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/Descriptor.java
@@ -0,0 +1,46 @@
+/*
+ * 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.deltaspike.jpa.spi.descriptor.xml;
+
+import java.net.URL;
+
+import org.w3c.dom.Document;
+
+public class Descriptor
+{
+    private final Document document;
+    private final URL url;
+
+    public Descriptor(Document document, URL url)
+    {
+        this.document = document;
+        this.url = url;
+    }
+
+    public Document getDocument()
+    {
+        return document;
+    }
+
+    public URL getUrl()
+    {
+        return url;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/DescriptorReader.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/DescriptorReader.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/DescriptorReader.java
new file mode 100644
index 0000000..68d89ac
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/DescriptorReader.java
@@ -0,0 +1,114 @@
+/*
+ * 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.deltaspike.jpa.spi.descriptor.xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.apache.deltaspike.core.util.AggregatedClassLoader;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+abstract class DescriptorReader
+{
+    private static final Logger LOG = Logger.getLogger(DescriptorReader.class.getName());
+
+    private final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+    protected List<Descriptor> readAllFromClassPath(String resource) throws IOException
+    {
+        List<Descriptor> result = new LinkedList<Descriptor>();
+        Enumeration<URL> urls = classLoader().getResources(resource);
+        while (urls.hasMoreElements())
+        {
+            URL u = urls.nextElement();
+            try
+            {
+                result.add(readFromUrl(u));
+            }
+            catch (Exception e)
+            {
+                LOG.log(Level.WARNING, "Could not load " + resource + " from " + u, e);
+            }
+        }
+        return Collections.unmodifiableList(result);
+    }
+
+    protected Descriptor readFromClassPath(String resource) throws IOException
+    {
+        return readFromUrl(classLoader().getResource(resource));
+    }
+
+    protected Descriptor readFromUrl(URL url) throws IOException
+    {
+        InputStream stream = url.openStream();
+        try
+        {
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            return new Descriptor(builder.parse(new InputSource(stream)), url);
+        }
+        catch (SAXException e)
+        {
+            throw new RuntimeException("Failed reading XML document", e);
+        }
+        catch (ParserConfigurationException e)
+        {
+            throw new RuntimeException("Failed reading XML document", e);
+        }
+        finally
+        {
+            stream.close();
+        }
+    }
+
+    protected Descriptor read(String baseUrl, String resource) throws IOException
+    {
+        try
+        {
+            URL url = new URL(baseUrl + resource);
+            return readFromUrl(url);
+        }
+        catch (Exception e)
+        {
+            return readFromClassPath(resource);
+        }
+    }
+
+    protected String extractBaseUrl(URL fileUrl, String resource)
+    {
+        String file = fileUrl.toString();
+        return file.substring(0, file.length() - resource.length());
+    }
+
+    protected ClassLoader classLoader()
+    {
+        return AggregatedClassLoader.newInstance();
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6480a0e5/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/EntityDescriptor.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/EntityDescriptor.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/EntityDescriptor.java
new file mode 100644
index 0000000..f8bf884
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/spi/descriptor/xml/EntityDescriptor.java
@@ -0,0 +1,63 @@
+/*
+ * 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.deltaspike.jpa.spi.descriptor.xml;
+
+import java.io.Serializable;
+
+public class EntityDescriptor extends AbstractEntityDescriptor
+{
+    private String tableName;
+
+    public EntityDescriptor()
+    {
+    }
+
+    public EntityDescriptor(String[] id, String version, String name, Class<?> entityClass,
+            Class<? extends Serializable> idClass, AbstractEntityDescriptor parent,
+            String tableName)
+    {
+        super(id, version, name, entityClass, idClass, parent);
+        this.tableName = tableName;
+    }
+    
+    public String getTableName()
+    {
+        return tableName;
+    }
+
+    public void setTableName(String tableName)
+    {
+        this.tableName = tableName;
+    }
+    
+    @Override
+    public String toString()
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.append("EntityDescriptor ")
+                .append("[entityClass=").append(getEntityClass().getName())
+                .append(", name=").append(getName())
+                .append(", idClass=").append(getIdClass().getName())
+                .append(", id=").append(getId())
+                .append(", superClass=").append(getParent())
+                .append(", tableName=").append(tableName)
+                .append("]");
+        return builder.toString();
+    }
+}