Author: allee8285
Date: Tue May 14 16:26:39 2013
New Revision: 1482427

URL: http://svn.apache.org/r1482427
Log:
OPENJPA-2377 - Fix criteria query methods to meet spec requirements.

Modified:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java?rev=1482427&r1=1482426&r2=1482427&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
 Tue May 14 16:26:39 2013
@@ -18,9 +18,15 @@
  */
 package org.apache.openjpa.persistence.criteria;
 
+import static javax.persistence.metamodel.Type.PersistenceType.EMBEDDABLE;
+import static javax.persistence.metamodel.Type.PersistenceType.ENTITY;
+
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Set;
 
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
 import javax.persistence.Parameter;
 import javax.persistence.Query;
 import javax.persistence.Tuple;
@@ -36,6 +42,7 @@ import javax.persistence.criteria.SetJoi
 import javax.persistence.criteria.Subquery;
 import javax.persistence.metamodel.EmbeddableType;
 import javax.persistence.metamodel.EntityType;
+import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.Metamodel;
 import javax.persistence.metamodel.SetAttribute;
 
@@ -95,6 +102,43 @@ public class TestMetaModelTypesafeCriter
         videoStore_ = mm.entity(VideoStore.class);
     }
 
+    public void testEntityEmbeddableTest() {
+        Metamodel mm = em.getMetamodel();
+
+        assertEquals(mm.managedType(Account.class).getPersistenceType(), 
ENTITY);
+        assertEquals(mm.managedType(Address.class).getPersistenceType(), 
EMBEDDABLE);
+
+        assertNotNull(mm.entity(Account.class));
+        assertNotNull(mm.embeddable(Address.class));
+
+        try {
+            mm.entity(Address.class);
+            fail("Expecting IllegalArgumentException");
+        } catch (IllegalArgumentException iaex) {
+        }
+        try {
+            mm.embeddable(Account.class);
+            fail("Expecting IllegalArgumentException");
+        } catch (IllegalArgumentException iaex) {
+        }
+
+        int numEntity = 0;
+        int numEmbeddables = 0;
+        for (Class<?> clz : getDomainClasses()) {
+            if (clz.getAnnotation(Embeddable.class) != null) {
+                ++numEmbeddables;
+            } else if (clz.getAnnotation(Entity.class) != null) {
+                ++numEntity;
+            }
+        }
+        Set<EmbeddableType<?>> embs = mm.getEmbeddables();
+        assertEquals(embs.size(), numEmbeddables);
+        Set<EntityType<?>> ents = mm.getEntities();
+        assertEquals(ents.size(), numEntity);
+        Set<ManagedType<?>> metaTypes = mm.getManagedTypes();
+        assertEquals(metaTypes.size(), numEntity + numEmbeddables);
+    }
+
     public void testStringEqualExpression() {
         String jpql = "select c from Customer c " 
                     + "where c.name='Autowest Toyota'";

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=1482427&r1=1482426&r2=1482427&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
 Tue May 14 16:26:39 2013
@@ -343,7 +343,7 @@ class CriteriaQueryImpl<T> implements Op
 
     
     public <X> Root<X> from(Class<X> cls) {
-        EntityType<X> entity = _model.entity(cls);
+        EntityType<X> entity = _model.entityImpl(cls);
         if (entity == null)
             throw new IllegalArgumentException(_loc.get("root-non-entity", 
cls).getMessage());
         return from(entity);

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java?rev=1482427&r1=1482426&r2=1482427&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
 Tue May 14 16:26:39 2013
@@ -68,6 +68,7 @@ public class MetamodelImpl implements Me
     private final MetaDataRepository repos;
     private Map<Class<?>, Type<?>> _basics = new HashMap<Class<?>, Type<?>>();
     private Map<Class<?>, EntityType<?>> _entities = new HashMap<Class<?>, 
EntityType<?>>();
+    private Set<EntityType<?>> _entitiesOnlySet = null;
     private Map<Class<?>, EmbeddableType<?>> _embeddables = new 
HashMap<Class<?>, EmbeddableType<?>>();
     private Map<Class<?>, MappedSuperclassType<?>> _mappedsupers = new 
HashMap<Class<?>, MappedSuperclassType<?>>();
     private Map<Class<?>, Types.PseudoEntity<?>> _pseudos = new 
HashMap<Class<?>, Types.PseudoEntity<?>>();
@@ -86,15 +87,15 @@ public class MetamodelImpl implements Me
             PersistenceType type = getPersistenceType(meta);
             switch (type) {
             case ENTITY:
-                find(cls, _entities, ENTITY);
+                find(cls, _entities, ENTITY, false);
                 if (meta.isEmbeddable())
-                    find(cls, _embeddables, EMBEDDABLE);
+                    find(cls, _embeddables, EMBEDDABLE, false);
                 break;
             case EMBEDDABLE:
-                find(cls, _embeddables, EMBEDDABLE);
+                find(cls, _embeddables, EMBEDDABLE, false);
                 break;
             case MAPPED_SUPERCLASS:
-                find(cls, _mappedsupers, MAPPED_SUPERCLASS);
+                find(cls, _mappedsupers, MAPPED_SUPERCLASS, false);
                 break;
             default:
             }
@@ -113,7 +114,7 @@ public class MetamodelImpl implements Me
      *  @throws IllegalArgumentException if not an embeddable class
      */
     public <X> EmbeddableType<X> embeddable(Class<X> clazz) {
-        return (EmbeddableType<X>)find(clazz, _embeddables, EMBEDDABLE);
+        return (EmbeddableType<X>)find(clazz, _embeddables, EMBEDDABLE, false);
     }
 
     /**
@@ -123,7 +124,27 @@ public class MetamodelImpl implements Me
      *  @throws IllegalArgumentException if not an entity
      */
     public <X> EntityType<X> entity(Class<X> clazz) {
-        return (EntityType<X>) find(clazz, _entities, ENTITY);
+        return (EntityType<X>) find(clazz, _entities, ENTITY, false);
+    }
+
+    public <X> EntityType<X> entityImpl(Class<X> clazz) {
+        return (EntityType<X>) find(clazz, _entities, ENTITY, true);
+    }
+
+    /*
+     * Return the most up-to-date entity only set in the current meta model.
+     */
+    private Collection<EntityType<?>> getEntityValuesOnly() {
+        if (_entitiesOnlySet == null) {
+            _entitiesOnlySet = new HashSet<EntityType<?>>();
+            for (Class<?> cls : _entities.keySet()) {
+                // if key indicates it is a embeddable, do not add to the 
_entitiesOnlySet.
+                if (!_embeddables.containsKey(cls)) {
+                    _entitiesOnlySet.add(_entities.get(cls));
+                }
+            }
+        }
+        return _entitiesOnlySet;
     }
 
     /**
@@ -139,7 +160,7 @@ public class MetamodelImpl implements Me
      * @return the metamodel entity types
      */
     public Set<EntityType<?>> getEntities() {
-        return unmodifiableSet(_entities.values());
+        return unmodifiableSet(getEntityValuesOnly());
     }
 
     /**
@@ -148,7 +169,7 @@ public class MetamodelImpl implements Me
      */
     public Set<ManagedType<?>> getManagedTypes() {
         Set<ManagedType<?>> result = new HashSet<ManagedType<?>>();
-        result.addAll(_entities.values());
+        result.addAll(getEntityValuesOnly());
         result.addAll(_embeddables.values());
         result.addAll(_mappedsupers.values());
         return result;
@@ -162,10 +183,10 @@ public class MetamodelImpl implements Me
      *  @throws IllegalArgumentException if not a managed class
      */
     public <X> ManagedType<X> managedType(Class<X> clazz) {
-        if (_entities.containsKey(clazz))
-            return (EntityType<X>) _entities.get(clazz);
         if (_embeddables.containsKey(clazz))
             return (EmbeddableType<X>) _embeddables.get(clazz);
+        if (_entities.containsKey(clazz))
+            return (EntityType<X>) _entities.get(clazz);
         if (_mappedsupers.containsKey(clazz))
             return (MappedSuperclassType<X>) _mappedsupers.get(clazz);
         throw new IllegalArgumentException(_loc.get("type-not-managed", clazz)
@@ -216,9 +237,12 @@ public class MetamodelImpl implements Me
      * The managed type may become instantiated as a side-effect.
      */
     private <V extends ManagedType<?>> V find(Class<?> cls, Map<Class<?>,V> 
container,  
-            PersistenceType expected) {
-        if (container.containsKey(cls))
-            return container.get(cls);
+            PersistenceType expected, boolean implFind) {
+        if (container.containsKey(cls)) {
+            if (implFind || expected != ENTITY || 
!_embeddables.containsKey(cls)) {
+                return container.get(cls);
+            }
+        }
         ClassMetaData meta = repos.getMetaData(cls, null, false);
         if (meta != null) {
             instantiate(cls, meta, container, expected);
@@ -252,6 +276,7 @@ public class MetamodelImpl implements Me
         case ENTITY:
                Types.Entity<X> entity = new Types.Entity<X>(meta, this);
             _entities.put(cls, entity);
+            _entitiesOnlySet = null;
             populate(entity);
             break;
         case MAPPED_SUPERCLASS:


Reply via email to