diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasAwareExprFactory.java b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasAwareExprFactory.java index adf08cd28..63204f4d0 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasAwareExprFactory.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasAwareExprFactory.java @@ -27,41 +27,77 @@ public class AliasAwareExprFactory extends SimpleExprFactory{ } public PBoolean create(Boolean arg){ - return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(arg); + try{ + return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } public PBooleanArray create(Boolean[] args){ - return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(args); + try{ + return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(args); + }finally{ + aliasFactory.setCurrent(null); + } } public PComponentCollection create(Collection arg) { - return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + try{ + return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } public > PComparable create(D arg){ - return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + try{ + return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } @SuppressWarnings("unchecked") public PSimple create(D arg){ - PSimple path = (PSimple) aliasFactory.pathForAlias(arg); - return path != null ? path : super.create(arg); + try{ + PSimple path = (PSimple) aliasFactory.pathForAlias(arg); + return path != null ? path : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } public > PComparableArray create(D[] args){ - return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(args); + try{ + return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(args); + }finally{ + aliasFactory.setCurrent(null); + } } public PComponentList create(List arg) { - return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + try{ + return aliasFactory.isBound() ? aliasFactory.>getCurrent() : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } public ExtString create(String arg){ - return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(arg); + try{ + return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(arg); + }finally{ + aliasFactory.setCurrent(null); + } } public PStringArray create(String[] args){ - return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(args); + try{ + return aliasFactory.isBound() ? aliasFactory.getCurrent() : super.create(args); + }finally{ + aliasFactory.setCurrent(null); + } } } diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasFactory.java b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasFactory.java index 7da1ad2ea..204e2c5c8 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasFactory.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/AliasFactory.java @@ -61,9 +61,7 @@ public class AliasFactory { @SuppressWarnings("unchecked") public > A getCurrent() { - A rv = (A)current.get(); - current.remove(); - return rv; + return (A) current.get(); } public boolean isBound() { diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/PropertyAccessInvocationHandler.java b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/PropertyAccessInvocationHandler.java index 3d1a69f1a..69c8f0956 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/alias/PropertyAccessInvocationHandler.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/alias/PropertyAccessInvocationHandler.java @@ -6,6 +6,7 @@ package com.mysema.query.collections.alias; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; @@ -71,30 +72,36 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ aliasFactory.setCurrent(propToPath.get(ptyName)); return rv; -// }else if (isElementAccess(method)){ -// String ptyName = "_get"; -// Object rv; -// if (propToObj.containsKey(ptyName)){ -// rv = propToObj.get(ptyName); -// }else{ -// Path parent = aliasFactory.pathForAlias(proxy); -// if (parent == null) throw new IllegalArgumentException("No path for " + proxy); -// PathMetadata pm = PathMetadata.forListAccess((PList)parent, (Integer)args[0]); -// rv = makeNew(Integer.class, proxy, ptyName, pm); -// } -// aliasFactory.setCurrent(propToPath.get(ptyName)); -// return rv; + }else if (isElementAccess(method)){ + String ptyName = "_get"; + Object rv; + if (propToObj.containsKey(ptyName)){ + rv = propToObj.get(ptyName); + }else{ + Path parent = aliasFactory.pathForAlias(proxy); + if (parent == null) throw new IllegalArgumentException("No path for " + proxy); + PathMetadata pm = PathMetadata.forListAccess((PList)parent, (Integer)args[0]); + Class rvType = (Class) method.getGenericParameterTypes()[0]; + rv = makeNew(rvType, proxy, ptyName, pm); + } + aliasFactory.setCurrent(propToPath.get(ptyName)); + return rv; }else{ return methodProxy.invokeSuper(proxy, args); } } -// private boolean isElementAccess(Method method) { -// return method.getName().equals("get") -// && method.getParameterTypes().length == 1 -// && method.getParameterTypes()[0].equals(int.class); -// } + private Class getFirstTypeParameter(Class cl) { + return (Class)((ParameterizedType) cl.getGenericSuperclass()) + .getActualTypeArguments()[0]; + } + + private boolean isElementAccess(Method method) { + return method.getName().equals("get") + && method.getParameterTypes().length == 1 + && method.getParameterTypes()[0].equals(int.class); + } private boolean isSizeAccessor(Method method) { return method.getName().equals("size") @@ -117,7 +124,7 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ path = new ExtString(pm); rv = (T) new String(); - } else if (Integer.class.equals(type)) { + } else if (Integer.class.equals(type) || int.class.equals(type)) { path = new Path.PComparable(Integer.class,pm); rv = (T) new Integer(42); @@ -125,19 +132,19 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ path = new Path.PComparable(Date.class,pm); rv = (T) new Date(); - } else if (Long.class.equals(type)) { + } else if (Long.class.equals(type) || long.class.equals(type)) { path = new Path.PComparable(Long.class,pm); rv = (T) new Long(42); - } else if (Short.class.equals(type)) { + } else if (Short.class.equals(type) || short.class.equals(type)) { path = new Path.PComparable(Short.class,pm); rv = (T) new Short((short) 42); - } else if (Double.class.equals(type)) { + } else if (Double.class.equals(type) || double.class.equals(type)) { path = new Path.PComparable(Double.class,pm); rv = (T) new Double(42); - } else if (Float.class.equals(type)) { + } else if (Float.class.equals(type) || float.class.equals(type)) { path = new Path.PComparable(Float.class,pm); rv = (T) new Float(42); @@ -149,7 +156,7 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ path = new Path.PComparable(BigDecimal.class,pm); rv = (T) new BigDecimal(42); - } else if (Boolean.class.equals(type)) { + } else if (Boolean.class.equals(type) || boolean.class.equals(type)) { path = new Path.PComparable(Boolean.class,pm); rv = (T) new Boolean(true); diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java index 75bbc251b..33f55f468 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java @@ -125,15 +125,21 @@ public class MiniApiTest { @Test @Ignore - public void testVariousAlias(){ + public void testAlias3(){ + // TODO : FIXME Cat c = alias(Cat.class, "cat"); - // 1 from($(c)) .where($(c.getMate().getBirthdate()).after(new Date())) - .iterate($(c)).iterator(); + .iterate($(c)).iterator(); + } + + @Test + @Ignore + public void testAlias4(){ + // TODO : FIXME + Cat c = alias(Cat.class, "cat"); - // 2 from($(c)) .where($(c.getKittens().get(0).getBodyWeight()).gt(12)) .iterate($(c.getName())).iterator();