You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by th...@apache.org on 2014/05/26 16:45:11 UTC

[1/2] git commit: DELTASPIKE-606 Improve simplified DTO mapping

Repository: deltaspike
Updated Branches:
  refs/heads/master 900d57084 -> 3175cb266


DELTASPIKE-606 Improve simplified DTO mapping


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

Branch: refs/heads/master
Commit: 3175cb2669b47df33702676184e240834ee99d61
Parents: b0233a2
Author: Thomas Hug <Th...@ctp.com>
Authored: Mon May 26 07:15:29 2014 -0700
Committer: Thomas Hug <Th...@ctp.com>
Committed: Mon May 26 07:41:58 2014 -0700

----------------------------------------------------------------------
 .../api/mapping/SimpleQueryInOutMapperBase.java | 65 +++++++++++++++++++-
 .../mapping/SimpleQueryInOutMapperBaseTest.java | 26 ++++++--
 .../impl/handler/CdiQueryInvocationContext.java |  2 +-
 .../data/impl/handler/QueryHandler.java         |  2 +-
 .../deltaspike/data/impl/util/QueryUtils.java   | 18 ------
 .../data/impl/audit/TimestampsProviderTest.java |  4 +-
 .../data/impl/mapping/MappedRepositoryTest.java | 49 ++++++++++++++-
 .../deltaspike/data/test/domain/Simple.java     |  2 +-
 .../test/service/SimpleMappedDtoRepository.java | 32 ++++++++++
 .../data/test/service/SimpleMapper.java         |  4 +-
 .../test/service/SimpleQueryInOutMapper.java    | 53 ++++++++++++++++
 .../data/test/util/TestDeployments.java         |  4 +-
 12 files changed, 224 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBase.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBase.java b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBase.java
index a065755..ce8be8e 100644
--- a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBase.java
+++ b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBase.java
@@ -18,13 +18,47 @@
  */
 package org.apache.deltaspike.data.api.mapping;
 
+import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
+import org.apache.deltaspike.data.spi.QueryInvocationContext;
+
+/**
+ * A base mapper to map from Dto to Entity and vice versa. This should be sufficient
+ * for most mapping cases and simplify the implementation of a mapper.
+ *
+ * @param <Entity>      The Entity type.
+ * @param <Dto>         The Dto type.
+ */
 public abstract class SimpleQueryInOutMapperBase<Entity, Dto> implements QueryInOutMapper<Entity>
 {
+    @Inject
+    private QueryInvocationContext context;
+
+    /**
+     * Return the primary key of the Entity corresponding to the Dto. If this is a new
+     * Entity, return {@code null}.
+     * @param dto       The Dto to map to an Entity.
+     * @return          The Entity primary key, or {@code null} for a new Entity.
+     */
+    protected abstract Object getPrimaryKey(Dto dto);
+
     protected abstract Dto toDto(Entity entity);
-    protected abstract Entity toEntity(Dto dto);
+
+    /**
+     * Map a Dto to an Entity. In case the Dto contains a valid primary key,
+     * the Entity will be retrieved first and used as method parameter. Otherwise
+     * Entity is a unmanaged new instance.
+     *
+     * @param entity    Either a managed Entity looked up by the primary key,
+     *                  or a new Entity instance.
+     * @param dto       The Dto to map.
+     * @return          Mapped Entity.
+     */
+    protected abstract Entity toEntity(Entity entity, Dto dto);
 
     @Override
     public Object mapResult(final Entity result)
@@ -64,6 +98,33 @@ public abstract class SimpleQueryInOutMapperBase<Entity, Dto> implements QueryIn
     @Override
     public Object mapParameter(final Object parameter)
     {
-        return toEntity((Dto) parameter);
+        Dto dto = (Dto) parameter;
+        Object primaryKey = getPrimaryKey(dto);
+        if (primaryKey != null)
+        {
+            Entity entity = findEntity(primaryKey);
+            return toEntity(entity, dto);
+        }
+        return toEntity(newEntity(), dto);
+    }
+
+    protected Entity newEntity()
+    {
+        try
+        {
+            Class<?> entityClass = context.getEntityClass();
+            Constructor<?> constructor = entityClass.getDeclaredConstructor();
+            constructor.setAccessible(true);
+            return (Entity) constructor.newInstance();
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException("Failed instantiating new Entity", e);
+        }
+    }
+
+    protected Entity findEntity(Object primaryKey)
+    {
+        return (Entity) context.getEntityManager().find(context.getEntityClass(), primaryKey);
     }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/api/src/test/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBaseTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/test/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBaseTest.java b/deltaspike/modules/data/api/src/test/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBaseTest.java
index 2bc4349..583f3a0 100644
--- a/deltaspike/modules/data/api/src/test/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBaseTest.java
+++ b/deltaspike/modules/data/api/src/test/java/org/apache/deltaspike/data/api/mapping/SimpleQueryInOutMapperBaseTest.java
@@ -18,18 +18,19 @@
  */
 package org.apache.deltaspike.data.api.mapping;
 
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
 public class SimpleQueryInOutMapperBaseTest
 {
+
     @Test
     public void checkDefault() {
         final SimpleQueryInOutMapperBase<String, Integer> mapper = new SimpleQueryInOutMapperBase<String, Integer>()
@@ -40,7 +41,19 @@ public class SimpleQueryInOutMapperBaseTest
             }
 
             @Override
-            protected String toEntity(Integer b) {
+            protected String toEntity(String entity, Integer b) {
+                return entity;
+            }
+
+            @Override
+            protected Object getPrimaryKey(Integer dto)
+            {
+                return null;
+            }
+
+            @Override
+            protected String newEntity()
+            {
                 return "ok";
             }
         };
@@ -63,4 +76,5 @@ public class SimpleQueryInOutMapperBaseTest
         // but at least we test what is expected!
         assertEquals("ok", mapper.mapParameter(2));
     }
+
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java
index d553114..5b6b892 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java
@@ -63,7 +63,7 @@ public class CdiQueryInvocationContext implements QueryInvocationContext
         this.cleanup = new LinkedList<Destroyable>();
     }
 
-    public void init()
+    public void initMapper()
     {
         if (hasQueryInOutMapper())
         {

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
index b2da59d..6b6ddb5 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
@@ -103,8 +103,8 @@ public class QueryHandler implements Serializable, InvocationHandler
     {
         CdiQueryInvocationContext queryContext = new CdiQueryInvocationContext(proxy, method, args, repoMethod,
                 entityManagerLookup.lookupFor(repo));
-        queryContext.init();
         context.set(queryContext);
+        queryContext.initMapper();
         return queryContext;
     }
 

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/QueryUtils.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/QueryUtils.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/QueryUtils.java
index adea94d..306ab5b 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/QueryUtils.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/QueryUtils.java
@@ -18,7 +18,6 @@
  */
 package org.apache.deltaspike.data.impl.util;
 
-import java.lang.reflect.Method;
 import java.text.MessageFormat;
 import java.util.Collection;
 
@@ -83,21 +82,4 @@ public final class QueryUtils
         return value != null ? value : (fallback != null ? fallback : "");
     }
 
-    public static boolean contains(Class<?> clazz, Method method)
-    {
-        return extract(clazz, method) != null;
-    }
-
-    public static Method extract(Class<?> clazz, Method method)
-    {
-        try
-        {
-            String name = method.getName();
-            return clazz.getMethod(name, method.getParameterTypes());
-        }
-        catch (NoSuchMethodException e)
-        {
-            return null;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
index baf4f0b..e8c87f7 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
@@ -23,8 +23,6 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import org.apache.deltaspike.data.api.audit.CreatedOn;
-import org.apache.deltaspike.data.impl.audit.AuditPropertyException;
-import org.apache.deltaspike.data.impl.audit.TimestampsProvider;
 import org.apache.deltaspike.data.test.domain.AuditedEntity;
 import org.apache.deltaspike.data.test.domain.Simple;
 import org.junit.Test;
@@ -68,7 +66,7 @@ public class TimestampsProviderTest
     public void should_not_fail_on_non_audited_entity()
     {
         // given
-        Simple entity = new Simple();
+        Simple entity = new Simple("should_not_fail_on_non_audited_entity");
 
         // when
         TimestampsProvider provider = new TimestampsProvider();

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/mapping/MappedRepositoryTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/mapping/MappedRepositoryTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/mapping/MappedRepositoryTest.java
index ff9db51..e539446 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/mapping/MappedRepositoryTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/mapping/MappedRepositoryTest.java
@@ -36,8 +36,11 @@ import org.apache.deltaspike.data.test.domain.Simple;
 import org.apache.deltaspike.data.test.domain.Simple_;
 import org.apache.deltaspike.data.test.domain.dto.BooleanWrapper;
 import org.apache.deltaspike.data.test.domain.dto.SimpleDto;
+import org.apache.deltaspike.data.test.domain.dto.SimpleId;
+import org.apache.deltaspike.data.test.service.SimpleMappedDtoRepository;
 import org.apache.deltaspike.data.test.service.SimpleMappedRepository;
 import org.apache.deltaspike.data.test.service.SimpleMapper;
+import org.apache.deltaspike.data.test.service.SimpleQueryInOutMapper;
 import org.apache.deltaspike.data.test.service.WrappedMapper;
 import org.apache.deltaspike.test.category.WebProfileCategory;
 import org.jboss.arquillian.container.test.api.Deployment;
@@ -56,8 +59,10 @@ public class MappedRepositoryTest extends TransactionalTestCase
                 initDeployment()
                     .addClasses(
                             SimpleMappedRepository.class,
+                            SimpleMappedDtoRepository.class,
                             SimpleMapper.class,
-                            WrappedMapper.class)
+                            WrappedMapper.class,
+                            SimpleQueryInOutMapper.class)
                     .addPackages(false,
                             Simple.class.getPackage(),
                             SimpleDto.class.getPackage()));
@@ -66,6 +71,9 @@ public class MappedRepositoryTest extends TransactionalTestCase
     @Inject
     private SimpleMappedRepository repository;
 
+    @Inject
+    private SimpleMappedDtoRepository dtoRepository;
+
     @Produces
     @PersistenceContext
     private EntityManager entityManager;
@@ -156,6 +164,45 @@ public class MappedRepositoryTest extends TransactionalTestCase
         assertTrue(result.size() > 0);
     }
 
+    @Test
+    public void should_save_new_entity_with_simplemapper()
+    {
+        // given
+        SimpleDto dto = new SimpleDto();
+        dto.setName("should_save_new_entity_with_simplemapper");
+        dto.setEnabled(Boolean.TRUE);
+
+        // when
+        SimpleDto result = dtoRepository.save(dto);
+
+        // then
+        assertNotNull(result);
+        assertNotNull(result.getId());
+    }
+
+    @Test
+    public void should_update_existing_entity_with_simplemapper()
+    {
+        // given
+        final String name = "should_update_existing_entity_with_simplemapper";
+        Simple simple = new Simple(name);
+        simple.setEnabled(Boolean.TRUE);
+        entityManager.persist(simple);
+
+        SimpleDto dto = new SimpleDto();
+        dto.setName(name + "_updated");
+        dto.setEnabled(Boolean.TRUE);
+        dto.setId(new SimpleId(simple.getId()));
+
+        // when
+        dtoRepository.save(dto);
+        Simple lookup = entityManager.find(Simple.class, simple.getId());
+
+        // then
+        assertNotNull(lookup);
+        assertEquals(name + "_updated", lookup.getName());
+    }
+
     @Override
     protected EntityManager getEntityManager()
     {

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/domain/Simple.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/domain/Simple.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/domain/Simple.java
index 4f38f4d..5fadc99 100755
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/domain/Simple.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/domain/Simple.java
@@ -58,7 +58,7 @@ public class Simple
     private Date temporal;
     private EmbeddedSimple embedded;
 
-    public Simple()
+    protected Simple()
     {
     }
 

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMappedDtoRepository.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMappedDtoRepository.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMappedDtoRepository.java
new file mode 100644
index 0000000..06f22a8
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMappedDtoRepository.java
@@ -0,0 +1,32 @@
+/*
+ * 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.test.service;
+
+import org.apache.deltaspike.data.api.EntityRepository;
+import org.apache.deltaspike.data.api.Repository;
+import org.apache.deltaspike.data.api.mapping.MappingConfig;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.domain.dto.SimpleDto;
+import org.apache.deltaspike.data.test.domain.dto.SimpleId;
+
+@Repository(forEntity = Simple.class)
+@MappingConfig(SimpleQueryInOutMapper.class)
+public interface SimpleMappedDtoRepository extends EntityRepository<SimpleDto, SimpleId>
+{
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMapper.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMapper.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMapper.java
index 51baaee..6a62fea 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMapper.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleMapper.java
@@ -63,11 +63,9 @@ public class SimpleMapper implements QueryInOutMapper<Simple>
         if (parameter instanceof SimpleDto)
         {
             SimpleDto dto = (SimpleDto) parameter;
-            Simple simple = new Simple();
+            Simple simple = new Simple(dto.getName());
             simple.setId(dto.getId() != null ? dto.getId().getId() : null);
             simple.setEnabled(dto.getEnabled());
-            simple.setName(dto.getName());
-            System.out.println("Converted " + simple);
             return simple;
         }
         return ((SimpleId) parameter).getId();

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleQueryInOutMapper.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleQueryInOutMapper.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleQueryInOutMapper.java
new file mode 100644
index 0000000..b92e801
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleQueryInOutMapper.java
@@ -0,0 +1,53 @@
+/*
+ * 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.test.service;
+
+import org.apache.deltaspike.data.api.mapping.SimpleQueryInOutMapperBase;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.domain.dto.SimpleDto;
+import org.apache.deltaspike.data.test.domain.dto.SimpleId;
+
+public class SimpleQueryInOutMapper extends SimpleQueryInOutMapperBase<Simple, SimpleDto>
+{
+
+    @Override
+    protected Object getPrimaryKey(SimpleDto dto)
+    {
+        return dto.getId() != null ? dto.getId().getId() : null;
+    }
+
+    @Override
+    protected SimpleDto toDto(Simple entity)
+    {
+        SimpleDto dto = new SimpleDto();
+        dto.setId(new SimpleId(entity.getId()));
+        dto.setEnabled(entity.getEnabled());
+        dto.setName(entity.getName());
+        return dto;
+    }
+
+    @Override
+    protected Simple toEntity(Simple entity, SimpleDto dto)
+    {
+        entity.setName(dto.getName());
+        entity.setEnabled(dto.getEnabled());
+        return entity;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3175cb26/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
index 68a65c1..a9dc8f1 100755
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
@@ -43,6 +43,7 @@ import org.apache.deltaspike.data.api.criteria.CriteriaSupport;
 import org.apache.deltaspike.data.api.criteria.QuerySelection;
 import org.apache.deltaspike.data.api.mapping.MappingConfig;
 import org.apache.deltaspike.data.api.mapping.QueryInOutMapper;
+import org.apache.deltaspike.data.api.mapping.SimpleQueryInOutMapperBase;
 import org.apache.deltaspike.data.impl.RepositoryDefinitionException;
 import org.apache.deltaspike.data.impl.RepositoryExtension;
 import org.apache.deltaspike.data.impl.audit.AuditEntityListener;
@@ -161,7 +162,8 @@ public abstract class TestDeployments
                 .addClasses(Criteria.class, QuerySelection.class, CriteriaSupport.class)
                 .addClasses(CreatedOn.class, CurrentUser.class, ModifiedBy.class, ModifiedOn.class)
                 .addClasses(MappingConfig.class, QueryInOutMapper.class)
-                .addClasses(DelegateQueryHandler.class, QueryInvocationContext.class, RequiresTransaction.class);
+                .addClasses(DelegateQueryHandler.class, QueryInvocationContext.class, RequiresTransaction.class)
+                .addClasses(SimpleQueryInOutMapperBase.class);
     }
 
     public static WebArchive addDependencies(WebArchive archive)


[2/2] git commit: DELTASPIKE-607 EntityManagerDelegate interface for EM method access.

Posted by th...@apache.org.
DELTASPIKE-607 EntityManagerDelegate interface for EM method access.


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

Branch: refs/heads/master
Commit: b0233a20c2d220ff8734e765f5aa2f6dd46fd2cf
Parents: 900d570
Author: Thomas Hug <Th...@ctp.com>
Authored: Mon May 26 04:42:42 2014 -0700
Committer: Thomas Hug <Th...@ctp.com>
Committed: Mon May 26 07:41:58 2014 -0700

----------------------------------------------------------------------
 .../data/api/EntityManagerDelegate.java         | 179 +++++++++++++++
 .../handler/EntityManagerDelegateHandler.java   | 216 +++++++++++++++++++
 .../EntityManagerDelegateHandlerTest.java       |  63 ++++++
 .../handler/EntityRepositoryHandlerTest.java    |  64 +++---
 .../data/test/TransactionalTestCase.java        |   9 +
 .../service/ExtendedRepositoryInterface.java    |   3 +-
 .../deltaspike/data/test/util/TestData.java     |  48 +++++
 .../data/test/util/TestDeployments.java         |   5 +-
 8 files changed, 545 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerDelegate.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerDelegate.java b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerDelegate.java
new file mode 100644
index 0000000..e98a322
--- /dev/null
+++ b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerDelegate.java
@@ -0,0 +1,179 @@
+/*
+ * 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.api;
+
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.metamodel.Metamodel;
+
+
+/**
+ * Expose {@link javax.persistence.EntityManager} methods not present on repository base interfaces.
+ * Calls the corresponding method on the repository EntityManager.
+ *
+ * @param <E> The Entity type.
+ */
+public interface EntityManagerDelegate<E>
+{
+    /**
+     * See {@link javax.persistence.EntityManager#persist(Object)}.
+     */
+    void persist(E entity);
+
+    /**
+     * See {@link javax.persistence.EntityManager#merge(Object)}.
+     */
+    E merge(E entity);
+
+    /**
+     * See {@link javax.persistence.EntityManager#find(Class, Object, java.util.Map)}.
+     */
+    E find(Object primaryKey, Map<String, Object> properties);
+
+    /**
+     * See {@link javax.persistence.EntityManager#find(Class, Object, LockModeType)}.
+     */
+    E find(Object primaryKey, LockModeType lockMode);
+
+    /**
+     * See {@link javax.persistence.EntityManager#find(Class, Object, LockModeType, Map)}.
+     */
+    E find(Object primaryKey, LockModeType lockMode, Map<String, Object> properties);
+
+    /**
+     * See {@link javax.persistence.EntityManager#getReference(Class, Object)}.
+     */
+    E getReference(Object primaryKey);
+
+    /**
+     * See {@link javax.persistence.EntityManager#setFlushMode(FlushModeType)}.
+     */
+    void setFlushMode(FlushModeType flushMode);
+
+    /**
+     * See {@link javax.persistence.EntityManager#getFlushMode()}.
+     */
+    FlushModeType getFlushMode();
+
+    /**
+     * See {@link javax.persistence.EntityManager#lock(Object, LockModeType)}.
+     */
+    void lock(Object entity, LockModeType lockMode);
+
+    /**
+     * See {@link javax.persistence.EntityManager#lock(Object, LockModeType, Map)}.
+     */
+    void lock(Object entity, LockModeType lockMode, Map<String, Object> properties);
+
+    /**
+     * See {@link javax.persistence.EntityManager#refresh(Object, Map)}.
+     */
+    void refresh(E entity, Map<String, Object> properties);
+
+    /**
+     * See {@link javax.persistence.EntityManager#refresh(Object, LockModeType)}.
+     */
+    void refresh(E entity, LockModeType lockMode);
+
+    /**
+     * See {@link javax.persistence.EntityManager#refresh(Object, LockModeType, Map)}.
+     */
+    void refresh(E entity, LockModeType lockMode, Map<String, Object> properties);
+
+    /**
+     * See {@link javax.persistence.EntityManager#clear()}.
+     */
+    void clear();
+
+    /**
+     * See {@link javax.persistence.EntityManager#detach(Object)}.
+     */
+    void detach(E entity);
+
+    /**
+     * See {@link javax.persistence.EntityManager#contains(Object)}.
+     */
+    boolean contains(E entity);
+
+    /**
+     * See {@link javax.persistence.EntityManager#getLockMode(Object)}.
+     */
+    LockModeType getLockMode(E entity);
+
+    /**
+     * See {@link javax.persistence.EntityManager#setProperty(String, Object)}.
+     */
+    void setProperty(String propertyName, Object value);
+
+    /**
+     * See {@link javax.persistence.EntityManager#getProperties()}.
+     */
+    Map<String, Object> getProperties();
+
+    /**
+     * See {@link javax.persistence.EntityManager#joinTransaction()}.
+     */
+    void joinTransaction();
+
+    /**
+     * See {@link javax.persistence.EntityManager#unwrap(Class)}.
+     */
+    <T> T unwrap(Class<T> cls);
+
+    /**
+     * See {@link javax.persistence.EntityManager#getDelegate()}.
+     */
+    Object getDelegate();
+
+    /**
+     * See {@link javax.persistence.EntityManager#close()}.
+     */
+    void close();
+
+    /**
+     * See {@link javax.persistence.EntityManager#isOpen()}.
+     */
+    boolean isOpen();
+
+    /**
+     * See {@link javax.persistence.EntityManager#getTransaction()}.
+     */
+    EntityTransaction getTransaction();
+
+    /**
+     * See {@link javax.persistence.EntityManager#getEntityManagerFactory()}.
+     */
+    EntityManagerFactory getEntityManagerFactory();
+
+    /**
+     * See {@link javax.persistence.EntityManager#getCriteriaBuilder()}.
+     */
+    CriteriaBuilder getCriteriaBuilder();
+
+    /**
+     * See {@link javax.persistence.EntityManager#getMetamodel()}.
+     */
+    Metamodel getMetamodel();
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandler.java
new file mode 100644
index 0000000..902645b
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandler.java
@@ -0,0 +1,216 @@
+/*
+ * 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.handler;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.metamodel.Metamodel;
+
+import org.apache.deltaspike.data.api.EntityManagerDelegate;
+import org.apache.deltaspike.data.spi.DelegateQueryHandler;
+import org.apache.deltaspike.data.spi.QueryInvocationContext;
+
+@SuppressWarnings("unchecked")
+public class EntityManagerDelegateHandler<E> implements EntityManagerDelegate<E>, DelegateQueryHandler
+{
+
+    @Inject
+    private QueryInvocationContext context;
+
+    @Override
+    public void persist(E entity)
+    {
+        entityManager().persist(entity);
+    }
+
+    @Override
+    public E merge(E entity)
+    {
+        return entityManager().merge(entity);
+    }
+
+    @Override
+    public E find(Object primaryKey, Map<String, Object> properties)
+    {
+        return (E) entityManager().find(context.getEntityClass(), primaryKey, properties);
+    }
+
+    @Override
+    public E find(Object primaryKey, LockModeType lockMode)
+    {
+        return (E) entityManager().find(context.getEntityClass(), primaryKey, lockMode);
+    }
+
+    @Override
+    public E find(Object primaryKey, LockModeType lockMode, Map<String, Object> properties)
+    {
+        return (E) entityManager().find(context.getEntityClass(), primaryKey, lockMode, properties);
+    }
+
+    @Override
+    public E getReference(Object primaryKey)
+    {
+        return (E) entityManager().getReference(context.getEntityClass(), primaryKey);
+    }
+
+    @Override
+    public void setFlushMode(FlushModeType flushMode)
+    {
+        entityManager().setFlushMode(flushMode);
+    }
+
+    @Override
+    public FlushModeType getFlushMode()
+    {
+        return entityManager().getFlushMode();
+    }
+
+    @Override
+    public void lock(Object entity, LockModeType lockMode)
+    {
+        entityManager().lock(entity, lockMode);
+    }
+
+    @Override
+    public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties)
+    {
+        entityManager().lock(entity, lockMode, properties);
+    }
+
+    @Override
+    public void refresh(E entity, Map<String, Object> properties)
+    {
+        entityManager().refresh(entity, properties);
+    }
+
+    @Override
+    public void refresh(E entity, LockModeType lockMode)
+    {
+        entityManager().refresh(entity, lockMode);
+    }
+
+    @Override
+    public void refresh(E entity, LockModeType lockMode, Map<String, Object> properties)
+    {
+        entityManager().refresh(entity, lockMode, properties);
+    }
+
+    @Override
+    public void clear()
+    {
+        entityManager().clear();
+    }
+
+    @Override
+    public void detach(E entity)
+    {
+        entityManager().detach(entity);
+    }
+
+    @Override
+    public boolean contains(E entity)
+    {
+        return entityManager().contains(entity);
+    }
+
+    @Override
+    public LockModeType getLockMode(E entity)
+    {
+        return entityManager().getLockMode(entity);
+    }
+
+    @Override
+    public void setProperty(String propertyName, Object value)
+    {
+        entityManager().setProperty(propertyName, value);
+    }
+
+    @Override
+    public Map<String, Object> getProperties()
+    {
+        return entityManager().getProperties();
+    }
+
+    @Override
+    public void joinTransaction()
+    {
+        entityManager().joinTransaction();
+    }
+
+    @Override
+    public <T> T unwrap(Class<T> cls)
+    {
+        return entityManager().unwrap(cls);
+    }
+
+    @Override
+    public Object getDelegate()
+    {
+        return entityManager().getDelegate();
+    }
+
+    @Override
+    public void close()
+    {
+        entityManager().close();
+    }
+
+    @Override
+    public boolean isOpen()
+    {
+        return entityManager().isOpen();
+    }
+
+    @Override
+    public EntityTransaction getTransaction()
+    {
+        return entityManager().getTransaction();
+    }
+
+    @Override
+    public EntityManagerFactory getEntityManagerFactory()
+    {
+        return entityManager().getEntityManagerFactory();
+    }
+
+    @Override
+    public CriteriaBuilder getCriteriaBuilder()
+    {
+        return entityManager().getCriteriaBuilder();
+    }
+
+    @Override
+    public Metamodel getMetamodel()
+    {
+        return entityManager().getMetamodel();
+    }
+
+    private EntityManager entityManager()
+    {
+        return context.getEntityManager();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandlerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandlerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandlerTest.java
new file mode 100644
index 0000000..cc91b8e
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerDelegateHandlerTest.java
@@ -0,0 +1,63 @@
+package org.apache.deltaspike.data.impl.handler;
+
+import static org.apache.deltaspike.data.test.util.TestDeployments.finalizeDeployment;
+import static org.apache.deltaspike.data.test.util.TestDeployments.initDeployment;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.ExtendedRepositoryInterface;
+import org.apache.deltaspike.test.category.WebProfileCategory;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category(WebProfileCategory.class)
+public class EntityManagerDelegateHandlerTest extends TransactionalTestCase
+{
+    @Deployment
+    public static Archive<?> deployment()
+    {
+        return finalizeDeployment(EntityRepositoryHandlerTest.class,
+                initDeployment()
+                    .addClasses(ExtendedRepositoryInterface.class)
+                    .addPackage(Simple.class.getPackage()));
+    }
+
+    @Inject
+    private ExtendedRepositoryInterface repository;
+
+    @Produces
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Test
+    public void should_delete_detached_entity() {
+        // given
+        Simple simple = testData.createSimple("should_merge_entity");
+        Long id = simple.getId();
+
+        // when
+        repository.detach(simple);
+        repository.remove(repository.merge(simple));
+
+        // then
+        assertNotNull(id);
+        Simple search = repository.findBy(id);
+        assertNull(search);
+    }
+
+    @Override
+    protected EntityManager getEntityManager()
+    {
+        return entityManager;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
index 5f5d2a2..e0944b8 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
@@ -80,7 +80,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_merge() throws Exception
     {
         // given
-        Simple simple = createSimple("testMerge");
+        Simple simple = testData.createSimple("testMerge");
         Long id = simple.getId();
 
         // when
@@ -115,7 +115,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     {
         // given
         final String name = "testRefresh";
-        Simple simple = createSimple(name);
+        Simple simple = testData.createSimple(name);
 
         // when
         simple.setName("override");
@@ -129,7 +129,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_pk() throws Exception
     {
         // given
-        Simple simple = createSimple("testFindByPk");
+        Simple simple = testData.createSimple("testFindByPk");
 
         // when
         Simple find = repo.findBy(simple.getId());
@@ -143,7 +143,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_example() throws Exception
     {
         // given
-        Simple simple = createSimple("testFindByExample");
+        Simple simple = testData.createSimple("testFindByExample");
 
         // when
         List<Simple> find = repo.findBy(simple, Simple_.name);
@@ -159,8 +159,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_example_with_start_and_max() throws Exception
     {
         // given
-        Simple simple = createSimple("testFindByExample1", Integer.valueOf(10));
-        createSimple("testFindByExample1", Integer.valueOf(10));
+        Simple simple = testData.createSimple("testFindByExample1", Integer.valueOf(10));
+        testData.createSimple("testFindByExample1", Integer.valueOf(10));
 
         // when
         List<Simple> find = repo.findBy(simple, 0, 1, Simple_.name, Simple_.counter);
@@ -177,7 +177,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_example_with_no_attributes() throws Exception
     {
         // given
-        Simple simple = createSimple("testFindByExample");
+        Simple simple = testData.createSimple("testFindByExample");
         SingularAttribute<Simple, ?>[] attributes = new SingularAttribute[] {};
 
         // when
@@ -193,8 +193,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_all()
     {
         // given
-        createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
 
         // when
         List<Simple> find = repo.findAll();
@@ -207,8 +207,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_all_with_start_and_max()
     {
         // given
-        createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
 
         // when
         List<Simple> find = repo.findAll(0, 1);
@@ -222,8 +222,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_like()
     {
         // given
-        createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
         Simple example = new Simple("test");
 
         // when
@@ -238,8 +238,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_like_with_start_and_max()
     {
         // given
-        createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
         Simple example = new Simple("test");
 
         // when
@@ -254,8 +254,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_find_by_like_non_string()
     {
         // given
-        createSimple("testFindAll1", 1);
-        createSimple("testFindAll2", 2);
+        testData.createSimple("testFindAll1", 1);
+        testData.createSimple("testFindAll2", 2);
         Simple example = new Simple("test");
         example.setCounter(1);
 
@@ -270,7 +270,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_count_all()
     {
         // given
-        createSimple("testCountAll");
+        testData.createSimple("testCountAll");
 
         // when
         Long result = repo.count();
@@ -284,8 +284,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_count_with_attributes()
     {
         // given
-        Simple simple = createSimple("testFindAll1", Integer.valueOf(55));
-        createSimple("testFindAll2", Integer.valueOf(55));
+        Simple simple = testData.createSimple("testFindAll1", Integer.valueOf(55));
+        testData.createSimple("testFindAll2", Integer.valueOf(55));
 
         // when
         Long result = repo.count(simple, Simple_.name, Simple_.counter);
@@ -299,8 +299,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_count_with_no_attributes()
     {
         // given
-        Simple simple = createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        Simple simple = testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
         SingularAttribute<Simple, Object>[] attributes = new SingularAttribute[] {};
 
         // when
@@ -315,8 +315,8 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_count_by_like()
     {
         // given
-        createSimple("testFindAll1");
-        createSimple("testFindAll2");
+        testData.createSimple("testFindAll1");
+        testData.createSimple("testFindAll2");
         Simple example = new Simple("test");
 
         // when
@@ -330,7 +330,7 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
     public void should_remove()
     {
         // given
-        Simple simple = createSimple("testRemove");
+        Simple simple = testData.createSimple("testRemove");
 
         // when
         repo.remove(simple);
@@ -347,18 +347,4 @@ public class EntityRepositoryHandlerTest extends TransactionalTestCase
         return entityManager;
     }
 
-    private Simple createSimple(String name)
-    {
-        return createSimple(name, null);
-    }
-
-    private Simple createSimple(String name, Integer counter)
-    {
-        Simple result = new Simple(name);
-        result.setCounter(counter);
-        entityManager.persist(result);
-        entityManager.flush();
-        return result;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/TransactionalTestCase.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/TransactionalTestCase.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/TransactionalTestCase.java
index 0d90398..184a9e9 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/TransactionalTestCase.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/TransactionalTestCase.java
@@ -22,6 +22,7 @@ import javax.annotation.Resource;
 import javax.persistence.EntityManager;
 import javax.transaction.UserTransaction;
 
+import org.apache.deltaspike.data.test.util.TestData;
 import org.jboss.arquillian.junit.Arquillian;
 import org.junit.After;
 import org.junit.Before;
@@ -33,6 +34,8 @@ public abstract class TransactionalTestCase
 
     @Resource
     protected UserTransaction ut;
+    
+    protected TestData testData;
 
     @Before
     public void startTransaction() throws Exception
@@ -41,6 +44,12 @@ public abstract class TransactionalTestCase
         // Required by OpenJPA
         getEntityManager().getMetamodel();
     }
+    
+    @Before
+    public void initTestData()
+    {
+        testData = new TestData(getEntityManager());
+    }
 
     @After
     public void rollbackTransaction() throws Exception

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/ExtendedRepositoryInterface.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/ExtendedRepositoryInterface.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/ExtendedRepositoryInterface.java
index 1445d33..7aa7de9 100755
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/ExtendedRepositoryInterface.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/ExtendedRepositoryInterface.java
@@ -20,6 +20,7 @@ package org.apache.deltaspike.data.test.service;
 
 import static javax.persistence.LockModeType.PESSIMISTIC_READ;
 
+import org.apache.deltaspike.data.api.EntityManagerDelegate;
 import org.apache.deltaspike.data.api.EntityRepository;
 import org.apache.deltaspike.data.api.Modifying;
 import org.apache.deltaspike.data.api.Query;
@@ -27,7 +28,7 @@ import org.apache.deltaspike.data.api.Repository;
 import org.apache.deltaspike.data.test.domain.Simple;
 
 @Repository
-public interface ExtendedRepositoryInterface extends EntityRepository<Simple, Long>
+public interface ExtendedRepositoryInterface extends EntityRepository<Simple, Long>, EntityManagerDelegate<Simple>
 {
 
     @Query(lock = PESSIMISTIC_READ)

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestData.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestData.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestData.java
new file mode 100644
index 0000000..0ed860f
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestData.java
@@ -0,0 +1,48 @@
+/*
+ * 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.test.util;
+
+import javax.persistence.EntityManager;
+
+import org.apache.deltaspike.data.test.domain.Simple;
+
+public class TestData
+{
+
+    private EntityManager entityManager;
+
+    public TestData(EntityManager entityManager)
+    {
+        this.entityManager = entityManager;
+    }
+
+    public Simple createSimple(String name)
+    {
+        return createSimple(name, null);
+    }
+
+    public Simple createSimple(String name, Integer counter)
+    {
+        Simple result = new Simple(name);
+        result.setCounter(counter);
+        entityManager.persist(result);
+        entityManager.flush();
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/b0233a20/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
index 98ee9e3..68a65c1 100755
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/util/TestDeployments.java
@@ -22,6 +22,7 @@ import java.net.URL;
 
 import org.apache.deltaspike.data.api.AbstractEntityRepository;
 import org.apache.deltaspike.data.api.EntityManagerConfig;
+import org.apache.deltaspike.data.api.EntityManagerDelegate;
 import org.apache.deltaspike.data.api.EntityManagerResolver;
 import org.apache.deltaspike.data.api.EntityRepository;
 import org.apache.deltaspike.data.api.FirstResult;
@@ -103,7 +104,7 @@ public abstract class TestDeployments
         WebArchive archive = ShrinkWrap
                 .create(WebArchive.class, "test.war")
                 .addAsLibrary(createApiArchive())
-                .addClasses(WebProfileCategory.class, TransactionalTestCase.class)
+                .addClasses(WebProfileCategory.class, TransactionalTestCase.class, TestData.class)
                 .addClasses(RepositoryExtension.class, RepositoryDefinitionException.class)
                 .addPackages(true, TEST_FILTER, createImplPackages())
                 .addPackages(true, AuditedEntity.class.getPackage())
@@ -156,7 +157,7 @@ public abstract class TestDeployments
                         FirstResult.class, MaxResults.class, Modifying.class,
                         Query.class, QueryParam.class, QueryResult.class,
                         EntityManagerConfig.class, EntityManagerResolver.class, SingleResultType.class,
-                        QueryInvocationException.class)
+                        QueryInvocationException.class, EntityManagerDelegate.class)
                 .addClasses(Criteria.class, QuerySelection.class, CriteriaSupport.class)
                 .addClasses(CreatedOn.class, CurrentUser.class, ModifiedBy.class, ModifiedOn.class)
                 .addClasses(MappingConfig.class, QueryInOutMapper.class)