You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/05/21 07:05:41 UTC

svn commit: r776951 [3/3] - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/main/resources/org/apache/openjpa/meta/ openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/ openjpa-persistence-jdbc/src/test/j...

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Thu May 21 05:05:39 2009
@@ -25,6 +25,8 @@
 
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.ListJoin;
+import javax.persistence.criteria.Path;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.QueryBuilder;
 import javax.persistence.criteria.QueryBuilder.Trimspec;
@@ -34,14 +36,23 @@
 import org.apache.openjpa.kernel.exps.Literal;
 import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
+import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 
 public class Expressions {
 	
+    /**
+     * Convert the given Criteria expression to a corresponding kernel value 
+     * using the given ExpressionFactory.
+     * Also sets the alias of the resulting value.
+     */
 	static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, 
 		MetamodelImpl model, CriteriaQuery q) {
-		return (e == null ? factory.getNull() : 
-		    e.toValue(factory, model, q));
+        Value v = e == null ? factory.getNull() : e.toValue(factory, model, q);
+	    v.setImplicitType(e.getJavaType());
+	    v.setAlias(e.getAlias());
+
+		return v;
 	}
 	
 	/**
@@ -197,6 +208,20 @@
             return factory.size(Expressions.toValue(e, factory, model, q));
         }
     }
+    
+    public static class Type<X> 
+        extends UnaryFunctionalExpression<Class<? extends X>> {
+        public Type(PathImpl<?, X> path) {
+            super((Class<Class<? extends X>>) path.getJavaType().getClass(), 
+                path);
+        }
+        
+        @Override
+        public Value toValue(ExpressionFactory factory, MetamodelImpl model,
+            CriteriaQuery q) {
+            return factory.type(Expressions.toValue(e, factory, model, q));
+        }
+    }
 
     public static class Cast<B> extends UnaryFunctionalExpression<B> {
     	Class<B> b;
@@ -488,32 +513,25 @@
             this(x, new Constant<Object>(Object.class, y));
         }
         
-        public Equal negate() {
-            negate = true;
-            return this;
-        }
-        
         @Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, CriteriaQuery q) {
             boolean isTypeExpr = false;
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q);
-            if (e1 instanceof PathImpl) {
-                PathImpl path = (PathImpl)e1;
-                isTypeExpr = path.isTypeExpr();
-                if (isTypeExpr) {
-                    ((Constant)e2).setTypeLit(isTypeExpr);
-                    val2 = Expressions.toValue(e2, factory, model, q);
-                    Class clzz = (Class)((Literal)val2).getValue();
-                    val2.setMetaData(((Types.Managed)model.type(clzz)).meta);
-                }
-            }
+//            if (e1 instanceof TypePathImpl) {
+//                PathImpl path = (PathImpl)e1;
+//                isTypeExpr = path.isTypeExpr();
+//                if (isTypeExpr) {
+//                    ((Constant)e2).setTypeLit(isTypeExpr);
+//                    val2 = Expressions.toValue(e2, factory, model, q);
+//                    Class clzz = (Class)((Literal)val2).getValue();
+//                    val2.setMetaData(((Types.Managed)model.type(clzz)).meta);
+//                }
+//            }
             ((CriteriaQueryImpl)q).setImplicitTypes(val1, val2, null);
-            if (!negate)
-                return factory.equal(val1, val2);
-            else
-                return factory.notEqual(val1, val2);
+            return isNegated() ? factory.notEqual(val1, val2) 
+                    : factory.equal(val1, val2);
         }
     }
     
@@ -598,15 +616,13 @@
             super(new GreaterThanEqual(v,x), new LessThanEqual(v,y));
         }
         
-        public Between(Expression<? extends Y> v, Y x,
-                Y y) {
+        public Between(Expression<? extends Y> v, Y x, Y y) {
             this(v, new Constant<Y>(x), new Constant<Y>(y));
         }
     }
     
     public static class Constant<X> extends ExpressionImpl<X> {
         public final Object arg;
-        private boolean typeLit;
         public Constant(Class<X> t, X x) {
             super(t);
             this.arg = x;
@@ -616,44 +632,75 @@
         	this((Class<X>)x.getClass(),x);
         }
         
-        public void setTypeLit(boolean typeLit) {
-            this.typeLit = typeLit;
+        @Override
+        public Value toValue(ExpressionFactory factory, MetamodelImpl model,
+            CriteriaQuery q) {
+            int literalType = Literal.TYPE_UNKNOWN;
+            if (arg != null) {
+                Class<?> literalClass = arg.getClass();
+                if (Number.class.isAssignableFrom(literalClass))
+                    literalType = Literal.TYPE_NUMBER;
+                else if (Boolean.class.isAssignableFrom(literalClass))
+                    literalType = Literal.TYPE_BOOLEAN;
+                else if (String.class.isAssignableFrom(literalClass))
+                    literalType = Literal.TYPE_STRING;
+                else if (Enum.class.isAssignableFrom(literalClass))
+                    literalType = Literal.TYPE_ENUM;
+                else if (Class.class.isAssignableFrom(literalClass)) {
+                    literalType = Literal.TYPE_CLASS;
+                    Literal lit = factory.newTypeLiteral(arg, 
+                            Literal.TYPE_CLASS);
+                    lit.setMetaData(model.repos.getMetaData((Class<?>)arg, 
+                            null, true));
+                    return lit;
+                }
+                
+            }
+            return factory.newLiteral(arg, literalType);
+        }
+    }
+    
+    public static class TypeConstant<X> extends Constant<X> {
+        public TypeConstant(X x) {
+            super((Class<X>)x.getClass(),x);
         }
         
         @Override
         public Value toValue(ExpressionFactory factory, MetamodelImpl model,
             CriteriaQuery q) {
-            if (!typeLit)
-                return factory.newLiteral(arg, 1);
-            else
-                return factory.newTypeLiteral(arg, Literal.TYPE_CLASS);
+            return factory.newTypeLiteral(arg, Literal.TYPE_CLASS);
         }
-        
     }
     
     public static class IsEmpty extends PredicateImpl {
     	ExpressionImpl<?> collection;
-    	boolean negate;
     	public IsEmpty(Expression<?> collection) {
     		super();
     		this.collection = (ExpressionImpl<?>)collection;
     	}
     	
-    	public IsEmpty negate() {
-    	    negate = true;
-    	    return this;
-    	}
-    	
         @Override
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-        	ExpressionFactory factory, MetamodelImpl model, 
-        	CriteriaQuery q) {
-            if (!negate)
-                return factory.isEmpty(
-                    Expressions.toValue(collection, factory, model, q));
-            else
-                return factory.isNotEmpty(
-                    Expressions.toValue(collection, factory, model, q));
+            ExpressionFactory factory, MetamodelImpl model, CriteriaQuery q) {
+            Value val = Expressions.toValue(collection, factory, model, q);
+            return (isNegated()) 
+                ? factory.isNotEmpty(val) : factory.isEmpty(val);
+        }
+    }
+    
+    public static class Index extends UnaryFunctionalExpression<Integer> {
+        public Index(Joins.List<?,?> e) {
+            super(Integer.class, e);
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Value toValue(
+            ExpressionFactory factory, MetamodelImpl model, CriteriaQuery q) {
+            Value v = Expressions.toValue(e, factory, model, q);
+            ClassMetaData meta = ((PathImpl)e)._member.fmd.getElement()
+               .getTypeMetaData();
+            v.setMetaData(meta);
+            return factory.index(v);
         }
     }
     
@@ -924,7 +971,7 @@
 
         private Expression<? extends R> otherwise;
 
-        private Expression<? extends R> caseOperand;
+        private Expression<C> caseOperand;
 
         public SimpleCase() {
             super(null);
@@ -934,11 +981,12 @@
             super(cls);
         }
         
-        public SimpleCase(Expression<? extends R> expr) {
+        public SimpleCase(Expression<C> expr) {
             super(null);
             this.caseOperand = expr;
         }
-        public Expression getExpression() {
+        
+        public Expression<C> getExpression() {
             return caseOperand;
         }
 

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java Thu May 21 05:05:39 2009
@@ -19,6 +19,8 @@
 
 package org.apache.openjpa.persistence.criteria;
 
+import java.util.HashSet;
+
 import javax.persistence.criteria.CollectionJoin;
 import javax.persistence.criteria.Fetch;
 import javax.persistence.criteria.From;
@@ -33,9 +35,12 @@
 import javax.persistence.metamodel.List;
 import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.Map;
+import javax.persistence.metamodel.Member;
 import javax.persistence.metamodel.Set;
 
 import org.apache.openjpa.persistence.criteria.PathImpl;
+import org.apache.openjpa.persistence.meta.Members;
+import org.apache.openjpa.persistence.meta.Types;
 
 /**
  * Represents a bound type, usually an entity that appears in the from clause, 
@@ -47,167 +52,168 @@
  * @param <X> the type represented by this receiver 
  */
 
-public class FromImpl<Z,X> extends PathImpl<X> implements From<Z,X> {
+public class FromImpl<Z,X> extends PathImpl<Z,X> implements From<Z,X> {
     private java.util.Set<Join<X, ?>> _joins;
     private java.util.Set<Fetch<X, ?>> _fetches;
+    private Types.Managed<X> type;
     
     /**
      * Supply the non-null managed type.
      */
-    public FromImpl(ManagedType<X> type) {
+    protected FromImpl(Types.Managed<X> type) {
         super(type.getJavaType());
+        this.type = type;
+    }
+    
+    protected FromImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> m, 
+            Class<X> x) {
+        super(parent, m, x);
     }
     
     /**
+     * Create a path from the given parent ending at the given member.
+     */
+//    protected FromImpl(PathImpl<?,Z> parent, Members.Member<? super Z, X> m) {
+//        super(parent, m);
+//    }
+    
+    /**
      *  Return the joins that have been made from this type.
-     *  @return joins made from this type
      */
     public java.util.Set<Join<X, ?>> getJoins() {
-        throw new AbstractMethodError();
+        return _joins;
     }
 
     /**
-     *  Join to the specified attribute using an inner join.
-     *  @param attribute  target of the join
-     *  @return the resulting join
+     *  Join to the given attribute using an inner join.
      */
     public <Y> Join<X, Y> join(Attribute<? super X, Y> attribute) {
         return join(attribute, JoinType.INNER);
     }
 
     /**
-     *  Join to the specified attribute using the given join type.
-     *  @param attribute  target of the join
-     *  @param jt  join type 
-     *  @return the resulting join
+     *  Join to the given attribute using the given join type.
      */
     public <Y> Join<X, Y> join(Attribute<? super X, Y> attribute, JoinType jt) {
-        throw new AbstractMethodError();
+        Join<X, Y> join = new Joins.Attribute<X,Y>(this, 
+                (Members.Attribute<? super X, Y>) attribute, jt);
+        addJoin(join);
+        
+        return join;
     }
 
     /**
-     *  Join to the specified Collection-valued attribute using an 
-     *  inner join.
-     *  @param collection  target of the join
-     *  @return the resulting join
+     *  Join to the given Collection-valued attribute using an inner join.
      */
     public <Y> CollectionJoin<X, Y> join(Collection<? super X, Y> collection) {
         return join(collection, JoinType.INNER);
     }
 
     /**
-     *  Join to the specified Collection-valued attribute using the given 
+     *  Join to the given Collection-valued attribute using the given 
      *  join type.
-     *  @param collection  target of the join
-     *  @return the resulting join
      */
     public <Y> CollectionJoin<X, Y> join(Collection<? super X, Y> collection, 
         JoinType jt) {
-        throw new AbstractMethodError();
+        CollectionJoin<X, Y> join = new Joins.Collection<X, Y>(this, 
+             (Members.Collection<? super X, Y>)collection, jt);
+        addJoin(join);
+         
+         return join;
     }
 
     /**
-     *  Join to the specified Set-valued attribute using an inner join.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given Set-valued attribute using an inner join.
      */
     public <Y> SetJoin<X,Y> join(Set<? super X, Y> set) {
         return join(set, JoinType.INNER);
     }
     
     /**
-     *  Join to the specified Set-valued attribute using the given join type.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given Set-valued attribute using the given join type.
      */
     public <Y> SetJoin<X,Y> join(Set<? super X, Y> set, JoinType jt) {
-        throw new AbstractMethodError();
+        SetJoin<X, Y> join = new Joins.Set<X, Y>(this, 
+                (Members.Set<? super X, Y>)set, jt);
+        addJoin(join);    
+        return join;
     }
 
     /**
-     *  Join to the specified List-valued attribute using an inner join.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given List-valued attribute using an inner join.
      */
     public <Y> ListJoin<X,Y> join(List<? super X, Y> list) {
         return join(list, JoinType.INNER);
     }
 
     /**
-     *  Join to the specified List-valued attribute using the given join type.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given List-valued attribute using the given join type.
      */
     public <Y> ListJoin<X,Y> join(List<? super X, Y> list, JoinType jt) {
-        throw new AbstractMethodError();
+        ListJoin<X, Y> join = new Joins.List<X, Y>(this, 
+                (Members.List<? super X, Y>)list, jt);
+        addJoin(join);    
+        return join;
     }
     
     /**
-     *  Join to the specified Map-valued attribute using an inner join.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given Map-valued attribute using an inner join.
      */
     public <K,V> MapJoin<X,K,V> join(Map<? super X,K,V> map) {
         return join(map, JoinType.INNER);
     }
 
     /**
-     *  Join to the specified Map-valued attribute using the given join type.
-     *  @param set  target of the join
-     *  @return the resulting join
+     *  Join to the given Map-valued attribute using the given join type.
      */
     public <K,V> MapJoin<X,K,V> join(Map<? super X,K,V> map, JoinType jt) {
-        throw new AbstractMethodError();
+        MapJoin<X,K,V> join = new Joins.Map<X,K,V>(this, 
+                (Members.Map<? super X,K,V>)map, jt);
+        addJoin(join);    
+        return join;
     }
     
     // String based counterparts
 
     public Join join(String attributeName) {
-        throw new AbstractMethodError();
+        return join(type.getAttribute(attributeName));
     }
 
     public Join join(String attributeName, JoinType jt) {
-        throw new AbstractMethodError();
+        return join(type.getAttribute(attributeName), jt);
     }
 
 
     public CollectionJoin joinCollection(String attributeName) {
-        throw new AbstractMethodError();
+        return join(type.getCollection(attributeName));
     }
 
     public CollectionJoin joinCollection(String attributeName, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getCollection(attributeName), jt);
     }
 
     public ListJoin joinList(String attributeName) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getList(attributeName));
     }
 
     public ListJoin joinList(String attributeName, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getList(attributeName), jt);
     }
 
     public MapJoin joinMap(String attributeName) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getMap(attributeName));
     }
 
     public MapJoin joinMap(String attributeName, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getMap(attributeName));
     }
 
     public SetJoin joinSet(String attributeName) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getSet(attributeName));
     }
 
     public SetJoin joinSet(String attributeName, JoinType jt) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return join(type.getSet(attributeName), jt);
     }
 
     public Fetch fetch(Attribute assoc) {
@@ -244,5 +250,10 @@
         // TODO Auto-generated method stub
         throw new AbstractMethodError();
     }
-
+    
+    private void addJoin(Join<X,?> join) {
+        if (_joins == null)
+            _joins = new HashSet<Join<X,?>>();
+         _joins.add(join);
+    }
 }

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java?rev=776951&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java Thu May 21 05:05:39 2009
@@ -0,0 +1,276 @@
+package org.apache.openjpa.persistence.criteria;
+
+import javax.persistence.criteria.AbstractCollectionJoin;
+import javax.persistence.criteria.CollectionJoin;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.criteria.ListJoin;
+import javax.persistence.criteria.MapJoin;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.SetJoin;
+import javax.persistence.metamodel.Member;
+
+import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.persistence.meta.Members;
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
+
+/**
+ * 
+ * @author Pinaki Poddar
+ * 
+ */
+public abstract class Joins {
+   
+    /**
+     * Join a single-valued attribute.
+     * 
+     *
+     * @param <Z> type from which joining
+     * @param <X> type of the attribute being joined
+     */
+    public static class Attribute<Z,X> extends FromImpl<Z,X> 
+        implements Join<Z,X>{
+        private final JoinType joinType;
+        
+        public Attribute(FromImpl<?,Z> from, 
+            Members.Attribute<? super Z, X> member, JoinType jt) {
+            super(from, member, member.getJavaType());
+            joinType = jt;
+        }
+        
+        public JoinType getJoinType() {
+            return joinType;
+        }
+
+        public FromImpl<?, Z> getParent() {
+            return (FromImpl<?, Z>) _parent;
+        }
+        
+        public Member<? extends Z, X> getMember() {
+            return (Member<? extends Z, X>) _member;
+        }
+        
+        @Override
+        public Value toValue(ExpressionFactory factory, MetamodelImpl model, 
+            CriteriaQuery c) {
+            boolean allowNull = joinType != JoinType.INNER;
+            org.apache.openjpa.kernel.exps.Path path = 
+                (org.apache.openjpa.kernel.exps.Path)
+                getParent().toValue(factory, model, c);
+            path.get(_member.fmd, allowNull);
+            ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
+            path.setMetaData(meta);
+            path.setImplicitType(meta.getDescribedType());
+            return path;
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+            ExpressionFactory factory, MetamodelImpl model, CriteriaQuery c) {
+            org.apache.openjpa.kernel.exps.Value path = this.toValue
+                (factory, model, c);
+            ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
+            Value var = factory.newBoundVariable(getAlias(), 
+                meta.getDescribedType());
+            org.apache.openjpa.kernel.exps.Expression join = factory
+                .bindVariable(var, path);
+            return join;
+        }
+    }
+    
+    /**
+     * Join a multi-valued attribute.
+     * 
+     * @param Z type being joined from
+     * @param C Java collection type of the container
+     * @param type of the element being joined to
+     * 
+     */
+    public static abstract class AbstractCollection<Z,C,E> 
+        extends FromImpl<Z,E> 
+        implements AbstractCollectionJoin<Z, C, E> {
+        final JoinType joinType;
+//        final FromImpl<?, Z> _from;
+//        final Members.BaseCollection<? super Z, C, E> _member;
+        
+        public AbstractCollection(FromImpl<?,Z> from, 
+            Members.BaseCollection<? super Z, C, E> member, JoinType jt) {
+            super(from, member, member.getJavaType());
+            joinType = jt;
+        }
+        
+        public JoinType getJoinType() {
+            return joinType;
+        }
+
+        public FromImpl<?, Z> getParent() {
+            return (FromImpl<?, Z>) _parent;
+        }
+        
+        @Override
+        public FromImpl<?, Z> getParentPath() {
+            return (FromImpl<?, Z>) _parent;
+        }
+        
+        public Member<? extends Z, E> getMember() {
+            return (Member<? extends Z, E>)_member;
+        }
+        
+        public javax.persistence.metamodel.AbstractCollection<? super Z, C, E> 
+            getModel() {
+            return (javax.persistence.metamodel.AbstractCollection
+                    <? super Z, C, E>)
+            _member.getType();
+        }
+
+        /**
+         * Convert this path to a kernel path (value).
+         */
+        @Override
+        public Value toValue(ExpressionFactory factory, MetamodelImpl model,
+            CriteriaQuery c) {
+            boolean allowNull = joinType != JoinType.INNER;
+            org.apache.openjpa.kernel.exps.Path path = 
+                (org.apache.openjpa.kernel.exps.Path)
+                _parent.toValue(factory, model, c);
+            path.get(_member.fmd, allowNull);
+            ClassMetaData meta = _member.fmd.getElement()
+               .getDeclaredTypeMetaData();
+            path.setMetaData(meta);
+            path.setImplicitType(meta.getDescribedType());
+            return path;
+        }
+
+        /**
+         * Convert this path to a join expression.
+         * 
+         */
+        @Override
+        public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+            ExpressionFactory factory, MetamodelImpl model, CriteriaQuery c) {
+            org.apache.openjpa.kernel.exps.Value path = toValue
+               (factory, model, c);
+            
+            ClassMetaData meta = _member.fmd.isElementCollection() 
+                ? _member.fmd.getEmbeddedMetaData()
+                : _member.fmd.getElement().getDeclaredTypeMetaData();
+            Value var = factory.newBoundVariable(getAlias(), 
+                meta.getDescribedType());
+            org.apache.openjpa.kernel.exps.Expression join = factory
+                .bindVariable(var, path);
+            return join;
+        }
+        
+    }
+    
+    /**
+     * Join a java.util.Collection type attribute.
+     *
+     * @param <Z>
+     * @param <E>
+     */
+    public static class Collection<Z,E> 
+        extends AbstractCollection<Z,java.util.Collection<E>,E> 
+        implements CollectionJoin<Z,E>{
+        public Collection(FromImpl<?,Z> parent, 
+            Members.Collection<? super Z, E> member, JoinType jt) {
+            super(parent, member, jt);
+        }
+        
+        public javax.persistence.metamodel.Collection<? super Z, E> getModel() {
+            return (javax.persistence.metamodel.Collection<? super Z, E>)
+               _member.getType();
+        }
+    }
+    
+    /**
+     * Join a java.util.Set type attribute.
+     *
+     * @param <Z>
+     * @param <E>
+     */
+    public static class Set<Z,E> 
+        extends AbstractCollection<Z,java.util.Set<E>,E> 
+        implements SetJoin<Z,E>{
+        public Set(FromImpl<?,Z> parent, 
+            Members.Set<? super Z, E> member, JoinType jt) {
+            super(parent, member, jt);
+        }
+        
+        public javax.persistence.metamodel.Set<? super Z, E> getModel() {
+            return (javax.persistence.metamodel.Set<? super Z, E>)_member;
+        }
+    }
+    
+    /**
+     * Join a java.util.List type attribute.
+     *
+     * @param <Z>
+     * @param <E>
+     */
+    
+    public static class List<Z,E> 
+        extends AbstractCollection<Z,java.util.List<E>,E> 
+        implements ListJoin<Z,E> {
+        
+        public List(FromImpl<?,Z> parent, 
+            Members.List<? super Z, E> member, JoinType jt) {
+            super(parent, member, jt);
+        }
+        
+        public javax.persistence.metamodel.List<? super Z, E> getModel() {
+            return (javax.persistence.metamodel.List<? super Z, E>)
+                _member.getType();
+        }
+        
+        public Expression<Integer> index() {
+            return new Expressions.Index(this);
+        }
+    }
+    
+    /**
+     * Join a java.util.Map type attribute.
+     *
+     * @param <Z>
+     * @param <E>
+     */
+    
+    public static class Map<Z,K,V> 
+        extends AbstractCollection<Z,java.util.Map<K,V>,V> 
+        implements MapJoin<Z,K,V> {
+        
+        public Map(FromImpl<?,Z> parent, 
+            Members.Map<? super Z, K,V> member, JoinType jt) {
+            super(parent, member, jt);
+        }
+        
+        public javax.persistence.metamodel.Map<? super Z, K,V> getModel() {
+            return (javax.persistence.metamodel.Map<? super Z, K,V>)
+                _member.getType();
+        }
+        
+        public Join<java.util.Map<K, V>, K> joinKey() {
+            throw new AbstractMethodError();
+        }
+        
+        public Join<java.util.Map<K, V>, K> joinKey(JoinType jt) {
+            throw new AbstractMethodError();
+        }
+        
+        public Expression<java.util.Map.Entry<K, V>> entry() {
+            throw new AbstractMethodError();
+        }
+        
+        public Path<K> key() {
+            throw new AbstractMethodError();
+        }
+        
+        public Path<V> value() {
+            throw new AbstractMethodError();
+        }
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java Thu May 21 05:05:39 2009
@@ -25,7 +25,10 @@
 import javax.persistence.metamodel.AbstractCollection;
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Bindable;
+import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.Map;
+import javax.persistence.metamodel.Member;
+import javax.persistence.metamodel.Type;
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.Value;
@@ -34,37 +37,50 @@
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 
 /**
- * Path from another (parent) path.
+ * Path is an expression often representing a persistent member traversed
+ * from another (parent) path.
  * 
- * @author ppoddar
+ * @author Pinaki Poddar
  *
- * @param <X>
+ * @param <Z> the type of the parent path 
+ * @param <X> the type of this path
  */
-public class PathImpl<X> extends ExpressionImpl<X> implements Path<X> {
-    private PathImpl<?> _parent;
-    private Members.Member<?,X> member;
-    private boolean _isTypeExpr;
+public class PathImpl<Z,X> extends ExpressionImpl<X> implements Path<X> {
+    protected final PathImpl<?,Z> _parent;
+    protected final Members.Member<? super Z,?> _member;
     
     /**
-     * 
-     * @param cls
+     * Protected. use by root path which neither represent a member nor has a
+     * parent. 
      */
     protected PathImpl(Class<X> cls) {
         super(cls);
+        _parent = null;
+        _member = null;
     }
     
-    public <Z> PathImpl(Members.Member<Z, X> member) {
-        super(member.getMemberJavaType());
-        this.member = member;
+    /**
+     * Create a path from the given parent representing the the given member.
+     */
+    public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member, 
+        Class<X> cls) {
+        super(cls);
+        _parent = parent;
+        _member = member;
+        if (parent == null)
+            throw new NullPointerException("Null parent for member " + member);
+        if (member == null)
+            throw new NullPointerException("Null member for parent " + parent);
+        
     }
     
-    public <Z> PathImpl(PathImpl<Z> parent, 
-        Members.Member<? super Z, X> member) {
-        super(member.getMemberJavaType());
-        _parent = parent;
-        this.member = member;
+    public PathImpl<?,Z> getParentPath() {
+        return _parent;
     }
     
+    /**
+     * Convert this path to a kernel path value.
+     */
     @Override
     public Value toValue(ExpressionFactory factory, MetamodelImpl model,
         CriteriaQuery q) {
@@ -73,61 +89,66 @@
             org.apache.openjpa.kernel.exps.Path path = 
                 (org.apache.openjpa.kernel.exps.Path)
                 _parent.toValue(factory, model, q);
-            path.get(member.fmd, false);
+            boolean allowNull = false;
+            path.get(_member.fmd, allowNull);
             var = path;
         } else {
             var = factory.newPath();//getJavaType());
             var.setMetaData(model.repos.getMetaData(getJavaType(), null, true));
         }
-        if (member != null) {
-            int typeCode = member.fmd.getDeclaredTypeCode();
+        if (_member != null) {
+            int typeCode = _member.fmd.getDeclaredTypeCode();
             if (typeCode != JavaTypes.COLLECTION && typeCode != JavaTypes.MAP)
                 var.setImplicitType(getJavaType());
         }
         var.setAlias(getAlias());
-        if (_isTypeExpr) 
-            var = factory.type(var);
         return var;
     }
 
     public <Y> Path<Y> get(Attribute<? super X, Y> attr) {
-        return new PathImpl(this, (Members.Member<? super X, Y>)attr);
+        return new PathImpl<X,Y>(this, (Members.Attribute<? super X, Y>)attr, 
+            attr.getJavaType());
     }
-
-    public Expression get(AbstractCollection collection) {
-        return new PathImpl(this, (Members.BaseCollection) collection);
-    }
-
-    public Expression get(Map collection) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
-    }
-
-    public Path get(String attName) {
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+    
+    public <E, C extends java.util.Collection<E>> Expression<C>
+        get(AbstractCollection<X, C, E> coll) {
+        return new PathImpl<X,C>(this, 
+            (Members.BaseCollection<? super X, C, E>)coll, 
+            coll.getMemberJavaType());
+    }
+
+    public <K, V, M extends java.util.Map<K, V>> Expression<M> 
+        get(Map<X, K, V> map) {
+        return new PathImpl<X,M>(this, (Members.Map<? super X,K,V>)map, 
+            (Class<M>) map.getMemberJavaType());
+    }
+    
+    public <Y> Path<Y> get(String attName) {
+        Members.Member<? super X, Y> next = null;
+        Type<?> type = _member.getType();
+        switch (type.getPersistenceType()) {
+        case BASIC:
+            throw new RuntimeException(attName + " not navigable from " + this);
+            default: next = (Members.Member<? super X, Y>)
+                ((ManagedType<?>)type).getAttribute(attName);
+        }
+        return new PathImpl<X,Y>(this, next, (Class<Y>)type.getClass());
     }
+    
+    
+    
+    /**
+     * Gets the bindable object that corresponds to this path.
+     */
   //TODO: what does this return for a collection key, value? null?
     public Bindable<X> getModel() { 
-        // TODO Auto-generated method stub
-        throw new AbstractMethodError();
+        return (Bindable<X>)_member.getType();
     }
     
-    public Path<?> getParentPath() {
-        return _parent;
-    }
-
+    /**
+     * Get the type() expression corresponding to this path. 
+     */
     public Expression<Class<? extends X>> type() {
-        PathImpl<X> path = new PathImpl(getJavaType());
-        path.setTypeExpr(true);
-        return (Expression<Class<? extends X>>) path;
-    }
-
-    public void setTypeExpr(boolean isTypeExpr) {
-        _isTypeExpr = isTypeExpr;
-    }
-    
-    public boolean isTypeExpr() {
-        return _isTypeExpr;
+        return new Expressions.Type<X>(this);
     }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java Thu May 21 05:05:39 2009
@@ -19,22 +19,27 @@
 
 package org.apache.openjpa.persistence.criteria;
 
+import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Root;
 import javax.persistence.metamodel.Entity;
 
+import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.persistence.criteria.FromImpl;
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
+import org.apache.openjpa.persistence.meta.Types;
 
 /**
- * A path from itself.
+ * A path without a parent.
  * 
  * @author Pinaki Poddar
  *
  * @param <X>
  */
 public class RootImpl<X> extends FromImpl<X,X> implements Root<X> {
-	private final Entity<X> _entity;
+	private final Types.Entity<X> _entity;
 	
-    public RootImpl(Entity<X> type) {
+    public RootImpl(Types.Entity<X> type) {
         super(type);
         _entity = type;
     }
@@ -42,4 +47,32 @@
     public  Entity<X> getModel() {
         return _entity;
     }
+    
+    /**
+     * Convert this path to a kernel path value.
+     */
+    @Override
+    public Value toValue(ExpressionFactory factory, MetamodelImpl model, 
+        CriteriaQuery c) {
+        Value var = factory.newPath();
+        var.setMetaData(_entity.meta);
+        return var;
+    }
+    
+    /**
+     * Convert this path to a kernel expression.
+     * 
+     */
+    @Override
+    public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+        ExpressionFactory factory, MetamodelImpl model, CriteriaQuery c) {
+        org.apache.openjpa.kernel.exps.Value path = toValue(factory, model, c);
+        
+        Value var = factory.newBoundVariable(getAlias(), 
+            _entity.meta.getDescribedType());
+        org.apache.openjpa.kernel.exps.Expression exp = 
+            factory.bindVariable(var, path);
+        
+        return exp;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Thu May 21 05:05:39 2009
@@ -45,7 +45,7 @@
         super(cls);
     }
     
-    public SelectionImpl setSelections(Selection<?>... selections) {
+    public SelectionImpl<X> setSelections(Selection<?>... selections) {
         _sels = Arrays.asList(selections);
         return this;
     }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Thu May 21 05:05:39 2009
@@ -25,9 +25,11 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Generated;
@@ -39,6 +41,7 @@
 import javax.annotation.processing.SupportedSourceVersion;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
 import javax.persistence.metamodel.TypesafeMetamodel;
@@ -151,7 +154,10 @@
      * given the fully-qualified name of a Java class.
      *  
      */
-    private TypeCategory toMetaModelTypeCategory(String name) {
+    private TypeCategory toMetaModelTypeCategory(TypeMirror mirror, 
+        String name) {
+        if (mirror.getKind() == TypeKind.ARRAY)
+            return TypeCategory.LIST;
         if (CLASSNAMES_COLLECTION.contains(name))
             return TypeCategory.COLLECTION;
         if (CLASSNAMES_LIST.contains(name))
@@ -223,9 +229,11 @@
             
             for (Element m : members) {
                 TypeMirror decl = handler.getDeclaredType(m);
+                decl.getKind();
                 String fieldName = handler.getPersistentMemberName(m);
                 String fieldType = handler.getDeclaredTypeName(decl);
-                TypeCategory typeCategory = toMetaModelTypeCategory(fieldType);
+                TypeCategory typeCategory = toMetaModelTypeCategory(decl, 
+                        fieldType);
                 String metaModelType = typeCategory.getMetaModelType();
                 SourceCode.Field modelField = null;
                 switch (typeCategory) {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java Thu May 21 05:05:39 2009
@@ -19,6 +19,8 @@
 
 package org.apache.openjpa.persistence.meta;
 
+import java.lang.reflect.Field;
+
 import javax.persistence.metamodel.AbstractCollection;
 import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.Type;
@@ -56,14 +58,18 @@
         }
 
         public final ManagedType<X> getDeclaringType() {
-            return owner.model.type((Class<X>) fmd.getDeclaringType());
+            return (ManagedType<X>)owner.model.getType(fmd.getDeclaringType());
+        }
+        
+        public Type<?> getType() {
+            return owner.model.getType(fmd.getDeclaredType());
         }
 
         public final java.lang.reflect.Member getJavaMember() {
             return fmd.getBackingMember();
         }
 
-        public final Class<Y> getMemberJavaType() {
+        public Class<Y> getMemberJavaType() {
             return (Class<Y>) fmd.getDeclaredType();
         }
 
@@ -79,9 +85,9 @@
             return fmd.getDeclaredTypeCode() == JavaTypes.COLLECTION
                 || fmd.getDeclaredTypeCode() == JavaTypes.MAP;
         }
-
+        
         public String toString() {
-            return fmd.getName();
+            return fmd.getName() + ":" + getType();
         }
     }
 
@@ -126,6 +132,10 @@
         public Class<T> getJavaType() {
             return super.getMemberJavaType();
         }
+        
+        public void validateMeta(Field f) {
+            
+        }
     }
 
     /**
@@ -151,8 +161,8 @@
             return BindableType.COLLECTION;
         }
 
-        public final Class<E> getJavaType() {
-            return fmd.getElement().getDeclaredType();
+        public Class<E> getJavaType() {
+            return fmd.getDeclaredType();
         }
     }
 

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=776951&r1=776950&r2=776951&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 Thu May 21 05:05:39 2009
@@ -7,6 +7,9 @@
  javax.persistence.metamodel.Type.PersistenceType.MAPPED_SUPERCLASS;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.TypeVariable;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -18,14 +21,17 @@
 import javax.persistence.metamodel.Entity;
 import javax.persistence.metamodel.ManagedType;
 import javax.persistence.metamodel.MappedSuperclass;
+import javax.persistence.metamodel.Member;
 import javax.persistence.metamodel.Metamodel;
 import javax.persistence.metamodel.Type;
+import javax.persistence.metamodel.TypesafeMetamodel;
 import javax.persistence.metamodel.AbstractCollection.CollectionType;
 import javax.persistence.metamodel.Type.PersistenceType;
 
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.util.InternalException;
 
@@ -178,6 +184,8 @@
             return CollectionType.COLLECTION;
         if (Map.class.isAssignableFrom(cls))
             return CollectionType.MAP;
+        if (cls.isArray())
+            return CollectionType.LIST;
         return null;
     }
     
@@ -185,15 +193,117 @@
      * Populate the static fields of the canonical type.
      */
     public <X> void populate(Types.Managed<X> type) {
-    	try {
-    		Class<X> cls = type.getJavaType();
-    		Class<?> mcls = repos.getMetaModel(cls, true);
-	    	Field[] fields = mcls.getFields();
-	    	for (Field f : fields) {
-	    		f.set(null, type.getMember(f.getName()));
-	    	}
-    	} catch (Exception e) {
-    		
-    	}
+		Class<X> cls = type.getJavaType();
+		Class<?> mcls = repos.getMetaModel(cls, true);
+		if (mcls == null)
+		    return;
+        TypesafeMetamodel anno = mcls.getAnnotation(TypesafeMetamodel.class);
+		if (anno == null)
+            throw new IllegalArgumentException(_loc.get("meta-class-no-anno", 
+               mcls.getName(), cls.getName(), TypesafeMetamodel.class.getName())
+		       .getMessage());
+		
+        if (cls != anno.value()) {
+            throw new IllegalStateException(_loc.get("meta-class-mismatch",
+            mcls.getName(), cls.getName(), anno.value()).getMessage());
+        }
+        
+    	Field[] mfields = mcls.getFields();
+    	for (Field mf : mfields) {
+            try {
+                ParameterizedType mfType = getParameterziedType(mf);
+    	        Member<? super X, ?> f = type.getMember(mf.getName());
+    	        Class<?> fClass = f.getMemberJavaType();
+    	       java.lang.reflect.Type[] args = mfType.getActualTypeArguments();
+    	       if (args.length < 2)
+    	           throw new IllegalStateException(
+    	               _loc.get("meta-field-no-para", mf).getMessage());
+    	       java.lang.reflect.Type ftype = args[1];
+    	       if (fClass.isPrimitive() 
+    	        || Collection.class.isAssignableFrom(fClass) 
+    	        || Map.class.isAssignableFrom(fClass)) {
+    	        ;
+    	    } else if (ftype != args[1]) {
+    	        throw new RuntimeException(_loc.get("meta-field-mismatch", 
+    	            new Object[]{mf.getName(), mcls.getName(), 
+    	                toTypeName(mfType), toTypeName(ftype)}).getMessage());
+    	    }
+            mf.set(null, f);
+	} catch (Exception e) {
+	    e.printStackTrace();
+		throw new RuntimeException(mf.toString());
+	}
+        }
+    }
+    
+    /**
+     * Gets the parameterized type of the given field after validating. 
+     */
+    ParameterizedType getParameterziedType(Field mf) {
+        java.lang.reflect.Type t = mf.getGenericType();
+        if (t instanceof ParameterizedType == false) {
+            throw new IllegalStateException(_loc.get("meta-field-not-param", 
+            mf.getDeclaringClass(), mf.getName(), toTypeName(t)).getMessage());
+        }
+        ParameterizedType mfType = (ParameterizedType)t;
+        java.lang.reflect.Type[] args = mfType.getActualTypeArguments();
+        if (args.length < 2) {
+            throw new IllegalStateException(_loc.get("meta-field-less-param", 
+            mf.getDeclaringClass(), mf.getName(), toTypeName(t)).getMessage());
+        }
+        
+        return mfType;
+    }
+    
+    /**
+     * Pretty prints a Type. 
+     */
+    String toTypeName(java.lang.reflect.Type type) {
+        if (type instanceof GenericArrayType) {
+            return toTypeName(((GenericArrayType)type).
+                getGenericComponentType())+"[]";
+        }
+        if (type instanceof ParameterizedType == false) {
+            Class<?> cls = (Class<?>)type;
+            return cls.getName();
+        }
+        ParameterizedType pType = (ParameterizedType)type;
+        java.lang.reflect.Type[] args = pType.getActualTypeArguments();
+        StringBuffer tmp = new StringBuffer(pType.getRawType().toString());
+        for (int i = 0; i < args.length; i++) {
+            tmp.append((i == 0) ? "<" : ",");
+            tmp.append(toTypeName(args[i]));
+            tmp.append((i == args.length-1) ? ">" : "");
+        }
+        return tmp.toString();
     }
+    
+    /**
+     * Validates the given field of the meta class matches the given 
+     * FieldMetaData and 
+     * @param <X>
+     * @param <Y>
+     * @param mField
+     * @param member
+     */
+    void validate(Field metaField, FieldMetaData fmd) {
+        
+    }
+    
+    <X,Y> void validate(Field mField, Member<X, Y> member) {
+        Class<?> fType = member.getMemberJavaType();
+        if (!ParameterizedType.class.isInstance(mField.getGenericType())) {
+            throw new IllegalArgumentException(_loc.get("meta-bad-field", 
+                mField).getMessage());
+        }
+        ParameterizedType mfType = (ParameterizedType)mField.getGenericType();
+        java.lang.reflect.Type[] args = mfType.getActualTypeArguments();
+        java.lang.reflect.Type owner = args[0];
+        if (member.getDeclaringType().getJavaType() != owner)
+            throw new IllegalArgumentException(_loc.get("meta-bad-field-owner", 
+                    mField, owner).getMessage());
+        java.lang.reflect.Type elementType = args[1];
+        if (fType.isPrimitive())
+            return;
+    }    
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java Thu May 21 05:05:39 2009
@@ -538,9 +538,9 @@
     String getDeclaredTypeName(TypeMirror mirror, boolean box) {
     	if (mirror.getKind() == TypeKind.ARRAY) {
     		TypeMirror comp = ((ArrayType)mirror).getComponentType();
-    		return getDeclaredTypeName(comp, false)+"[]";
+    		return getDeclaredTypeName(comp, false);
     	}
-    	mirror = box? box(mirror) : mirror;
+    	mirror = box ? box(mirror) : mirror;
     	if (isPrimitive(mirror))
     		return ((PrimitiveType)mirror).toString();
         return processingEnv.getTypeUtils().asElement(mirror).toString();
@@ -597,6 +597,8 @@
      *         indexed parameter type argument. Otherwise null.
      */
     TypeMirror getTypeParameter(TypeMirror mirror, int index) {
+        if (mirror.getKind() == TypeKind.ARRAY)
+            return ((ArrayType)mirror).getComponentType();
     	if (mirror.getKind() != TypeKind.DECLARED)
     		return null;
         List<? extends TypeMirror> params = ((DeclaredType)mirror)

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java Thu May 21 05:05:39 2009
@@ -19,8 +19,10 @@
 
 package org.apache.openjpa.persistence.meta;
 
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
@@ -167,6 +169,7 @@
                 case JavaTypes.OBJECT:
                     attrs.put(f, new Members.Attribute(this, f));
                     break;
+                case JavaTypes.ARRAY:
                 case JavaTypes.COLLECTION:
                     switch (model.getCollectionType(f.getDeclaredType())) {
                     case COLLECTION:
@@ -178,10 +181,15 @@
                     case SET:
                         colls.put(f, new Members.Set(this, f));
                         break;
-                    case MAP:
-                        colls.put(f, new Members.Map(this, f));
-                        break;
                     }
+                    break;
+                 case JavaTypes.MAP:
+                     colls.put(f, new Members.Map(this, f));
+                     break;
+                 default:
+                     throw new IllegalStateException(_loc.get(
+                     "field-unrecognized", f.getFullName(false), decCode)
+                     .getMessage());
                 }
                 // TODO: Account for the following codes
                 // case ARRAY = 11;
@@ -192,13 +200,24 @@
             }
         }
         
+        public Member<? super X,?> getMember(Field field) {
+            return getMember(field.getName());
+        }
+        
         public Member<? super X,?> getMember(String name) {
-        	FieldMetaData fmd = meta.getField(name);
-        	if (attrs.containsKey(fmd))
-        		return attrs.get(fmd);
-        	if (colls.containsKey(fmd))
-        		return colls.get(fmd);
-        	return null;
+            FieldMetaData fmd = meta.getField(name);
+            if (fmd == null) {
+                throw new IllegalArgumentException(_loc.get("field-missing", 
+                    name, meta.getDescribedType(), 
+                    Arrays.toString(meta.getFieldNames())).getMessage());
+            }
+            if (attrs.containsKey(fmd))
+                return attrs.get(fmd);
+            if (colls.containsKey(fmd))
+                return colls.get(fmd);
+            throw new IllegalArgumentException(_loc.get("field-missing", 
+            name, meta.getDescribedType(), 
+            Arrays.toString(meta.getFieldNames())).getMessage());        
         }
 
         public <Y> Attribute<? super X, Y> getAttribute(String name,
@@ -374,12 +393,12 @@
             if (fmd == null) {
                 if (decl && meta.getField(name) != null) {
                     throw new IllegalArgumentException(_loc.get(
-                        "field-not-decl", name, cls)
-                        .getMessage());
+                        "field-not-decl", name, cls,
+                        meta.getField(name).getDeclaringType()).getMessage());
                 } else {
                     throw new IllegalArgumentException(_loc.get(
-                        "field-missing", name, meta.getDescribedType())
-                        .getMessage());
+                        "field-missing", name, meta.getDescribedType(),
+                        Arrays.toString(meta.getFieldNames())).getMessage());
                 }
             }
             assertType("field-type-mismatch", fmd, fmd.getDeclaredType(), type);

Modified: openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties?rev=776951&r1=776950&r2=776951&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties (original)
+++ openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties Thu May 21 05:05:39 2009
@@ -24,15 +24,17 @@
 access-none: Class "{0}" has not explicitly annotated any access type and \
 	no field or method is annotated either. It is not possible to determine \
 	its access type
-field-missing: "{0}" is not a managed field in "{1}"
+field-missing: "{0}" is not a managed field in "{1}". Available fields are {2}.
 field-not-decl: "{0}" is not declared in "{1}" itself but one of its \
-	persistent super class
+	persistent super class "{2}"
 field-type-mismatch: Actual type of field "{0}" "{1}" does not match with the \
 	expected type "{2}"
 field-element-type-mismatch: Actual element type of field "{0}" "{1}" does not \
 	match with the expected element type "{2}"
 field-key-type-mismatch: Actual key type of map field "{0}" "{1}" does not \
 	match with the expected key type "{2}"	
+field-unrecognized: Field "{0}" is not recognized by its type code "{1}" to \
+    be included in the meta model.
 getter-unmatched: Getter method "{0}" in "{1}" has no matching setter method.
 mmg-tool-banner: Starting OpenJPA Annotation Processor for Metamodel Generation 
 mmg-process: Generating canonical metamodel source code "{0}"
@@ -43,4 +45,10 @@
 mmg-bad-naming: Naming policy for meta-model classes specified in -Anaming \
 	option "{0}" can not be used due to "{1}". Using default naming policy.
 mmg-bad-log: Log level specified is -Alog option "{0}" is not recognized. \
-	Logging at default "{1}" level.  
\ No newline at end of file
+	Logging at default "{1}" level.  
+
+meta-class-no-anno: Meta class "{0}" registered for "{1}" is not annotated \
+	with "{2}" annotation.	
+meta-field-mismatch: The field "{0}" in meta class "{1}" is of type "{2}" does \
+	not match with the persistent property type "{3}".   
+type-wrong-category:"{0}" categorized as "{1}" should be a "{2}"
\ No newline at end of file