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