[OLINGO-971] Improve CMP Support
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java
index 64444b5..6089be0 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java
@@ -219,7 +219,7 @@
 
   private void validatePreConditions() throws ODataJPARuntimeException {
 
-    if (oDataJPAContext.getEntityManagerFactory() == null) {
+    if (oDataJPAContext.getEntityManager() == null) {
       throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.ENTITY_MANAGER_NOT_INITIALIZED, null);
     }
 
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmBaseViewImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmBaseViewImpl.java
index ee6f083..80d9d75 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmBaseViewImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmBaseViewImpl.java
@@ -47,7 +47,7 @@
 
   public JPAEdmBaseViewImpl(final ODataJPAContext context) {
     pUnitName = context.getPersistenceUnitName();
-    metaModel = context.getEntityManagerFactory().getMetamodel();
+    metaModel = context.getEntityManager().getMetamodel();
     jpaEdmMappingModelAccess =
         ODataJPAFactory.createFactory().getJPAAccessFactory().getJPAEdmMappingModelAccess(context);
     jpaEdmExtension = context.getJPAEdmExtension();
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLBuilderFactoryTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLBuilderFactoryTest.java
index 58082b9..318c167 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLBuilderFactoryTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLBuilderFactoryTest.java
@@ -248,58 +248,34 @@
     } catch (IllegalAccessException e) {
       fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
     }
-    EntityManagerFactory emf = new EntityManagerFactory() {
+    final EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.expect(em.getMetamodel()).andReturn(null);
+    EasyMock.expect(em.isOpen()).andReturn(true).anyTimes();
+    EasyMock.replay(em);
 
-      @Override
-      public boolean isOpen() {
-        return false;
-      }
-
-      @Override
-      public Map<String, Object> getProperties() {
-        return null;
-      }
-
-      @Override
-      public PersistenceUnitUtil getPersistenceUnitUtil() {
-        return null;
-      }
-
-      @Override
-      public Metamodel getMetamodel() {
-        return null;
-      }
-
-      @Override
-      public CriteriaBuilder getCriteriaBuilder() {
-        return null;
-      }
-
-      @Override
-      public Cache getCache() {
-        return null;
-      }
-
-      @SuppressWarnings("rawtypes")
-      @Override
-      public EntityManager createEntityManager(final Map arg0) {
-        return null;
-      }
-
-      @Override
-      public EntityManager createEntityManager() {
-        return null;
-      }
-
-      @Override
-      public void close() {}
-    };
-    oDataJPAContextImpl.setEntityManagerFactory(emf);
+    oDataJPAContextImpl.setEntityManagerFactory(new TestEntityManagerFactory(em));
     oDataJPAContextImpl.setPersistenceUnitName("pUnit");
 
     assertNotNull(jpaAccessFactory.getJPAProcessor(oDataJPAContextImpl));
     assertNotNull(jpaAccessFactory.getJPAEdmModelView(oDataJPAContextImpl));
+  }
 
+
+  @Test
+  public void testJPAAccessFactoryEntityManagerOnly() {
+    ODataJPAFactoryImpl oDataJPAFactoryImpl = new ODataJPAFactoryImpl();
+    JPAAccessFactory jpaAccessFactory = oDataJPAFactoryImpl.getJPAAccessFactory();
+    ODataJPAContextImpl oDataJPAContextImpl = new ODataJPAContextImpl();
+
+    final EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.expect(em.getMetamodel()).andReturn(null);
+    EasyMock.expect(em.isOpen()).andReturn(true).anyTimes();
+    EasyMock.replay(em);
+
+    oDataJPAContextImpl.setEntityManager(em);
+
+    assertNotNull(jpaAccessFactory.getJPAProcessor(oDataJPAContextImpl));
+    assertNotNull(jpaAccessFactory.getJPAEdmModelView(oDataJPAContextImpl));
   }
 
   @Test
@@ -309,70 +285,92 @@
     ODataJPAAccessFactory jpaAccessFactory = oDataJPAFactoryImpl.getODataJPAAccessFactory();
     ODataJPAContextImpl oDataJPAContextImpl = new ODataJPAContextImpl();
 
-    EntityManagerFactory emf = new EntityManagerFactory() {
+    final EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.expect(em.getMetamodel()).andReturn(null);
+    EasyMock.expect(em.isOpen()).andReturn(true).anyTimes();
+    EasyMock.replay(em);
 
-      @Override
-      public boolean isOpen() {
-        // TODO Auto-generated method stub
-        return false;
-      }
-
-      @Override
-      public Map<String, Object> getProperties() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public PersistenceUnitUtil getPersistenceUnitUtil() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public Metamodel getMetamodel() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public CriteriaBuilder getCriteriaBuilder() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public Cache getCache() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @SuppressWarnings("rawtypes")
-      @Override
-      public EntityManager createEntityManager(final Map arg0) {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public EntityManager createEntityManager() {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public void close() {
-        // TODO Auto-generated method stub
-
-      }
-    };
-    oDataJPAContextImpl.setEntityManagerFactory(emf);
+    oDataJPAContextImpl.setEntityManagerFactory(new TestEntityManagerFactory(em));
     oDataJPAContextImpl.setPersistenceUnitName("pUnit");
 
     assertNotNull(jpaAccessFactory.getODataJPAMessageService(new Locale("en")));
     assertNotNull(jpaAccessFactory.createODataJPAContext());
     assertNotNull(jpaAccessFactory.createJPAEdmProvider(oDataJPAContextImpl));
     assertNotNull(jpaAccessFactory.createODataProcessor(oDataJPAContextImpl));
-
   }
+
+  @Test
+  public void testOdataJpaAccessFactoryEntityManagerOnly() {
+    ODataJPAFactoryImpl oDataJPAFactoryImpl = new ODataJPAFactoryImpl();
+    ODataJPAAccessFactory jpaAccessFactory = oDataJPAFactoryImpl.getODataJPAAccessFactory();
+    ODataJPAContextImpl oDataJPAContextImpl = new ODataJPAContextImpl();
+
+    EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.expect(em.getMetamodel()).andReturn(null);
+    EasyMock.expect(em.isOpen()).andReturn(true).anyTimes();
+    EasyMock.replay(em);
+
+    oDataJPAContextImpl.setEntityManager(em);
+    oDataJPAContextImpl.setPersistenceUnitName("pUnit");
+
+    assertNotNull(jpaAccessFactory.getODataJPAMessageService(new Locale("en")));
+    assertNotNull(jpaAccessFactory.createODataJPAContext());
+    assertNotNull(jpaAccessFactory.createJPAEdmProvider(oDataJPAContextImpl));
+    assertNotNull(jpaAccessFactory.createODataProcessor(oDataJPAContextImpl));
+  }
+
+  private static class TestEntityManagerFactory implements EntityManagerFactory {
+
+    private EntityManager em;
+
+    public TestEntityManagerFactory(EntityManager entityManager) {
+      em = entityManager;
+    }
+
+    @Override
+    public boolean isOpen() {
+      return false;
+    }
+
+    @Override
+    public Map<String, Object> getProperties() {
+      return null;
+    }
+
+    @Override
+    public PersistenceUnitUtil getPersistenceUnitUtil() {
+      return null;
+    }
+
+    @Override
+    public Metamodel getMetamodel() {
+      return null;
+    }
+
+    @Override
+    public CriteriaBuilder getCriteriaBuilder() {
+      return null;
+    }
+
+    @Override
+    public Cache getCache() {
+      return null;
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public EntityManager createEntityManager(final Map arg0) {
+      return em;
+    }
+
+    @Override
+    public EntityManager createEntityManager() {
+      return em;
+    }
+
+    @Override
+    public void close() {
+    }
+  };
+
 }
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
index 9e03c86..83cb0d3 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
@@ -62,6 +62,8 @@
 
   private static EntityManager mockEntityManager() {
     EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.expect(em.getMetamodel()).andReturn(null);
+    EasyMock.expect(em.isOpen()).andReturn(true).anyTimes();
     EasyMock.replay(em);
     return em;