From 5b6bcd325b8a30a199275915236e09d2251b0586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 25 Sep 2015 20:42:01 +0300 Subject: [PATCH 1/4] Provide access to enclosing type --- .../java/com/mysema/codegen/model/ClassType.java | 13 ++++++++++++- .../com/mysema/codegen/model/SimpleType.java | 16 +++++++++++++++- src/main/java/com/mysema/codegen/model/Type.java | 2 ++ .../com/mysema/codegen/model/TypeAdapter.java | 5 +++++ .../com/mysema/codegen/model/ClassTypeTest.java | 10 +++++++--- .../com/mysema/codegen/model/SimpleTypeTest.java | 8 ++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/mysema/codegen/model/ClassType.java b/src/main/java/com/mysema/codegen/model/ClassType.java index d74c9d2d9..a98b6f9f5 100644 --- a/src/main/java/com/mysema/codegen/model/ClassType.java +++ b/src/main/java/com/mysema/codegen/model/ClassType.java @@ -35,7 +35,7 @@ public class ClassType implements Type { private final List parameters; - private Type arrayType, componentType; + private Type arrayType, componentType, enclosingType; public ClassType(Class javaClass, Type... parameters) { this(TypeCategory.SIMPLE, javaClass, Arrays.asList(parameters)); @@ -98,6 +98,17 @@ public class ClassType implements Type { return componentType; } + @Override + public Type getEnclosingType() { + if (enclosingType == null) { + Class enclosingClass = javaClass.getEnclosingClass(); + if (enclosingClass != null) { + enclosingType = new ClassType(enclosingClass); + } + } + return enclosingType; + } + @Override public String getFullName() { return className; diff --git a/src/main/java/com/mysema/codegen/model/SimpleType.java b/src/main/java/com/mysema/codegen/model/SimpleType.java index 797965731..a09f42961 100644 --- a/src/main/java/com/mysema/codegen/model/SimpleType.java +++ b/src/main/java/com/mysema/codegen/model/SimpleType.java @@ -43,7 +43,7 @@ public class SimpleType implements Type { private final boolean primitiveClass, finalClass; - private Type arrayType, componentType; + private Type arrayType, componentType, enclosingType; private transient Class javaClass; @@ -144,6 +144,20 @@ public class SimpleType implements Type { } } + @Override + public Type getEnclosingType() { + if (enclosingType == null && localName.contains(".")) { + String newLocalName = localName.substring(0, localName.lastIndexOf('.')); + String newSimpleName = newLocalName.substring(newLocalName.lastIndexOf('.') + 1); + String newFullName = newLocalName; + if (packageName.length() > 0) { + newFullName = packageName + "." + newLocalName; + } + enclosingType = new SimpleType(newFullName, packageName, newSimpleName); + } + return enclosingType; + } + @Override public String getFullName() { return fullName; diff --git a/src/main/java/com/mysema/codegen/model/Type.java b/src/main/java/com/mysema/codegen/model/Type.java index cd76872ca..6ac040645 100644 --- a/src/main/java/com/mysema/codegen/model/Type.java +++ b/src/main/java/com/mysema/codegen/model/Type.java @@ -27,6 +27,8 @@ public interface Type { Type getComponentType(); + Type getEnclosingType(); + TypeCategory getCategory(); String getFullName(); diff --git a/src/main/java/com/mysema/codegen/model/TypeAdapter.java b/src/main/java/com/mysema/codegen/model/TypeAdapter.java index a81218d5c..fa3e43fc9 100644 --- a/src/main/java/com/mysema/codegen/model/TypeAdapter.java +++ b/src/main/java/com/mysema/codegen/model/TypeAdapter.java @@ -45,6 +45,11 @@ public class TypeAdapter implements Type { return type.getComponentType(); } + @Override + public Type getEnclosingType() { + return type.getEnclosingType(); + } + @Override public boolean equals(Object o) { return type.equals(o); diff --git a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java index 05b275909..944e815d2 100644 --- a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java @@ -5,9 +5,7 @@ */ package com.mysema.codegen.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.util.Collections; import java.util.Map; @@ -110,4 +108,10 @@ public class ClassTypeTest { // assertEquals("long", Types.LONG.getPrimitiveName()); // assertEquals("short", Types.SHORT.getPrimitiveName()); // } + + @Test + public void getEnclosingType() { + assertEquals(new ClassType(ClassTypeTest.class), new ClassType(Inner.class).getEnclosingType()); + assertNull(new ClassType(ClassTypeTest.class).getEnclosingType()); + } } diff --git a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java index eebe1e9fd..92c3a2115 100644 --- a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java @@ -1,6 +1,7 @@ package com.mysema.codegen.model; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import java.util.Collections; @@ -66,4 +67,11 @@ public class SimpleTypeTest { // assertEquals("int", new SimpleType(Types.INTEGER).getPrimitiveName()); // } + @Test + public void GetEnclosingType() { + assertEquals(new SimpleType(new ClassType(SimpleTypeTest.class)), + new SimpleType(new ClassType(Inner.class)).getEnclosingType()); + assertNull(new SimpleType(new ClassType(SimpleTypeTest.class)).getEnclosingType()); + } + } From 5a3bbb78ae5e9baa470dbf02ce7336ab9150d6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 25 Sep 2015 21:19:47 +0300 Subject: [PATCH 2/4] Add isMember() --- .../com/mysema/codegen/model/ClassType.java | 5 +++++ .../com/mysema/codegen/model/SimpleType.java | 21 +++++++++++-------- .../java/com/mysema/codegen/model/Type.java | 2 ++ .../com/mysema/codegen/model/TypeAdapter.java | 5 +++++ .../mysema/codegen/model/SimpleTypeTest.java | 9 ++++++-- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mysema/codegen/model/ClassType.java b/src/main/java/com/mysema/codegen/model/ClassType.java index a98b6f9f5..3d0c08daf 100644 --- a/src/main/java/com/mysema/codegen/model/ClassType.java +++ b/src/main/java/com/mysema/codegen/model/ClassType.java @@ -184,6 +184,11 @@ public class ClassType implements Type { return javaClass.isPrimitive(); } + @Override + public boolean isMember() { + return javaClass.getEnclosingClass() != null; + } + @Override public String toString() { return getGenericName(true); diff --git a/src/main/java/com/mysema/codegen/model/SimpleType.java b/src/main/java/com/mysema/codegen/model/SimpleType.java index a09f42961..51ee2e524 100644 --- a/src/main/java/com/mysema/codegen/model/SimpleType.java +++ b/src/main/java/com/mysema/codegen/model/SimpleType.java @@ -41,7 +41,7 @@ public class SimpleType implements Type { private final List parameters; - private final boolean primitiveClass, finalClass; + private final boolean primitiveClass, finalClass, memberClass; private Type arrayType, componentType, enclosingType; @@ -77,7 +77,7 @@ public class SimpleType implements Type { } else { this.localName = fullName; } - if (fullName.substring(packageName.length() + 1).contains(".")) { + if (localName.contains(".")) { this.outerClassName = fullName.substring(0, fullName.lastIndexOf('.')); } else { this.outerClassName = fullName; @@ -85,6 +85,7 @@ public class SimpleType implements Type { this.primitiveClass = primitiveClass; this.finalClass = finalClass; this.parameters = parameters; + this.memberClass = localName.contains("."); } public SimpleType(TypeCategory typeCategory, String fullName, String packageName, @@ -149,11 +150,7 @@ public class SimpleType implements Type { if (enclosingType == null && localName.contains(".")) { String newLocalName = localName.substring(0, localName.lastIndexOf('.')); String newSimpleName = newLocalName.substring(newLocalName.lastIndexOf('.') + 1); - String newFullName = newLocalName; - if (packageName.length() > 0) { - newFullName = packageName + "." + newLocalName; - } - enclosingType = new SimpleType(newFullName, packageName, newSimpleName); + enclosingType = new SimpleType(outerClassName, packageName, newSimpleName); } return enclosingType; } @@ -231,8 +228,9 @@ public class SimpleType implements Type { @Override public String getRawName(Set packages, Set classes) { - if (packages.contains(packageName) || classes.contains(fullName) - || classes.contains(outerClassName)) { + if (classes.contains(fullName)) { + return simpleName; + } else if (packages.contains(packageName) || classes.contains(outerClassName)) { return localName; } else { return fullName; @@ -259,6 +257,11 @@ public class SimpleType implements Type { return primitiveClass; } + @Override + public boolean isMember() { + return memberClass; + } + @Override public String toString() { return getGenericName(true); diff --git a/src/main/java/com/mysema/codegen/model/Type.java b/src/main/java/com/mysema/codegen/model/Type.java index 6ac040645..2ae8613ef 100644 --- a/src/main/java/com/mysema/codegen/model/Type.java +++ b/src/main/java/com/mysema/codegen/model/Type.java @@ -51,4 +51,6 @@ public interface Type { boolean isPrimitive(); + boolean isMember(); + } \ No newline at end of file diff --git a/src/main/java/com/mysema/codegen/model/TypeAdapter.java b/src/main/java/com/mysema/codegen/model/TypeAdapter.java index fa3e43fc9..ee348b846 100644 --- a/src/main/java/com/mysema/codegen/model/TypeAdapter.java +++ b/src/main/java/com/mysema/codegen/model/TypeAdapter.java @@ -119,6 +119,11 @@ public class TypeAdapter implements Type { return type.isPrimitive(); } + @Override + public boolean isMember() { + return type.isMember(); + } + @Override public String toString() { return type.toString(); diff --git a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java index 92c3a2115..af8df62b0 100644 --- a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java @@ -1,7 +1,6 @@ package com.mysema.codegen.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.*; import java.util.Collections; @@ -74,4 +73,10 @@ public class SimpleTypeTest { assertNull(new SimpleType(new ClassType(SimpleTypeTest.class)).getEnclosingType()); } + @Test + public void IsMember() { + assertTrue(new SimpleType(new ClassType(SimpleTypeTest.Inner.class)).isMember()); + assertFalse(new SimpleType(new ClassType(SimpleType.class)).isMember()); + } + } From d285ba836ff7ddf8657dff0e3090e5ce9d0045a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 25 Sep 2015 21:54:17 +0300 Subject: [PATCH 3/4] Improve name handling --- .../com/mysema/codegen/model/SimpleType.java | 4 ++- .../mysema/codegen/support/ClassUtils.java | 26 +++++++++--------- .../mysema/codegen/model/ClassTypeTest.java | 27 ++++++++++++++++--- .../mysema/codegen/model/SimpleTypeTest.java | 27 +++++++++++++++---- .../codegen/support/ClassUtilsTest.java | 4 +-- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/mysema/codegen/model/SimpleType.java b/src/main/java/com/mysema/codegen/model/SimpleType.java index 51ee2e524..e2092c57e 100644 --- a/src/main/java/com/mysema/codegen/model/SimpleType.java +++ b/src/main/java/com/mysema/codegen/model/SimpleType.java @@ -230,7 +230,9 @@ public class SimpleType implements Type { public String getRawName(Set packages, Set classes) { if (classes.contains(fullName)) { return simpleName; - } else if (packages.contains(packageName) || classes.contains(outerClassName)) { + } else if (classes.contains(outerClassName)) { + return fullName.substring(outerClassName.lastIndexOf('.') + 1); + } else if (packages.contains(packageName)) { return localName; } else { return fullName; diff --git a/src/main/java/com/mysema/codegen/support/ClassUtils.java b/src/main/java/com/mysema/codegen/support/ClassUtils.java index 70c0aab41..b719a6884 100644 --- a/src/main/java/com/mysema/codegen/support/ClassUtils.java +++ b/src/main/java/com/mysema/codegen/support/ClassUtils.java @@ -55,21 +55,19 @@ public final class ClassUtils { public static String getName(Class cl, Set packages, Set classes) { if (cl.isArray()) { return getName(cl.getComponentType(), packages, classes) + "[]"; - } - if (cl.getName().indexOf('$') > 0) { - return getName(cl.getDeclaringClass(), packages, classes) + "." + cl.getSimpleName(); } - final String canonicalName = cl.getName(); - final int i = canonicalName.lastIndexOf('.'); - if (i == -1) { - return canonicalName; - } else { - final String packageName = canonicalName.substring(0, i); - if (packages.contains(packageName) || classes.contains(canonicalName)) { - return cl.getSimpleName(); - } else { - return canonicalName; - } + final String canonicalName = cl.getName().replace('$', '.'); + final int i = cl.getName().lastIndexOf('.'); + if (classes.contains(canonicalName)) { + return cl.getSimpleName(); + } else if (cl.getEnclosingClass() != null) { + return getName(cl.getEnclosingClass(), packages, classes) + "." + cl.getSimpleName(); + } else if (i == -1) { + return canonicalName; + } else if (packages.contains(canonicalName.substring(0, i))) { + return canonicalName.substring(i + 1); + } else { + return canonicalName; } } diff --git a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java index 944e815d2..90bb21acf 100644 --- a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java @@ -12,10 +12,15 @@ import java.util.Map; import org.junit.Test; +import com.google.common.collect.ImmutableSet; + public class ClassTypeTest { public class Inner { - + public class Inner2 { + public class Inner3 { + } + } } private final ClassType stringType = new ClassType(TypeCategory.STRING, String.class); @@ -110,8 +115,22 @@ public class ClassTypeTest { // } @Test - public void getEnclosingType() { - assertEquals(new ClassType(ClassTypeTest.class), new ClassType(Inner.class).getEnclosingType()); - assertNull(new ClassType(ClassTypeTest.class).getEnclosingType()); + public void GetEnclosingType() { + Type outer = new ClassType(ClassTypeTest.class); + Type inner = new ClassType(ClassTypeTest.Inner.class); + Type inner2 = new ClassType(ClassTypeTest.Inner.Inner2.class); + Type inner3 = new ClassType(ClassTypeTest.Inner.Inner2.Inner3.class); + + assertEquals(inner2, inner3.getEnclosingType()); + assertEquals(inner, inner2.getEnclosingType()); + assertEquals(outer, inner.getEnclosingType()); + assertNull(outer.getEnclosingType()); + + assertEquals("ClassTypeTest.Inner.Inner2.Inner3", + inner3.getRawName(ImmutableSet.of(outer.getPackageName()), ImmutableSet.of())); + assertEquals("Inner2.Inner3", + inner3.getRawName(ImmutableSet.of(), ImmutableSet.of(inner2.getFullName()))); + assertEquals("Inner3", + inner3.getRawName(ImmutableSet.of(), ImmutableSet.of(inner3.getFullName()))); } } diff --git a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java index af8df62b0..e07159220 100644 --- a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java @@ -6,10 +6,15 @@ import java.util.Collections; import org.junit.Test; +import com.google.common.collect.ImmutableSet; + public class SimpleTypeTest { public static class Inner { - + public class Inner2 { + public class Inner3 { + } + } } @Test @@ -68,11 +73,23 @@ public class SimpleTypeTest { @Test public void GetEnclosingType() { - assertEquals(new SimpleType(new ClassType(SimpleTypeTest.class)), - new SimpleType(new ClassType(Inner.class)).getEnclosingType()); - assertNull(new SimpleType(new ClassType(SimpleTypeTest.class)).getEnclosingType()); - } + Type outer = new SimpleType(new ClassType(SimpleTypeTest.class)); + Type inner = new SimpleType(new ClassType(SimpleTypeTest.Inner.class)); + Type inner2 = new SimpleType(new ClassType(SimpleTypeTest.Inner.Inner2.class)); + Type inner3 = new SimpleType(new ClassType(SimpleTypeTest.Inner.Inner2.Inner3.class)); + assertEquals(inner2, inner3.getEnclosingType()); + assertEquals(inner, inner2.getEnclosingType()); + assertEquals(outer, inner.getEnclosingType()); + assertNull(outer.getEnclosingType()); + + assertEquals("SimpleTypeTest.Inner.Inner2.Inner3", + inner3.getRawName(ImmutableSet.of(outer.getPackageName()), ImmutableSet.of())); + assertEquals("Inner2.Inner3", + inner3.getRawName(ImmutableSet.of(), ImmutableSet.of(inner2.getFullName()))); + assertEquals("Inner3", + inner3.getRawName(ImmutableSet.of(), ImmutableSet.of(inner3.getFullName()))); + } @Test public void IsMember() { assertTrue(new SimpleType(new ClassType(SimpleTypeTest.Inner.class)).isMember()); diff --git a/src/test/java/com/mysema/codegen/support/ClassUtilsTest.java b/src/test/java/com/mysema/codegen/support/ClassUtilsTest.java index f59355249..5a5bf975b 100644 --- a/src/test/java/com/mysema/codegen/support/ClassUtilsTest.java +++ b/src/test/java/com/mysema/codegen/support/ClassUtilsTest.java @@ -19,9 +19,7 @@ public class ClassUtilsTest { @Test public void GetName() { assertEquals("int", ClassUtils.getName(int.class)); - assertEquals( - "int", - ClassUtils.getName(int.class, Collections. emptySet(), + assertEquals("int", ClassUtils.getName(int.class, Collections. emptySet(), Collections. emptySet())); assertEquals("Object", ClassUtils.getName(Object.class)); assertEquals("Object[]", ClassUtils.getName(Object[].class)); From 091888f3d83dd228122e4dd44da0719759129aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sat, 26 Sep 2015 22:51:32 +0300 Subject: [PATCH 4/4] Use memberClass --- src/main/java/com/mysema/codegen/model/SimpleType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mysema/codegen/model/SimpleType.java b/src/main/java/com/mysema/codegen/model/SimpleType.java index e2092c57e..a482ceb08 100644 --- a/src/main/java/com/mysema/codegen/model/SimpleType.java +++ b/src/main/java/com/mysema/codegen/model/SimpleType.java @@ -147,7 +147,7 @@ public class SimpleType implements Type { @Override public Type getEnclosingType() { - if (enclosingType == null && localName.contains(".")) { + if (enclosingType == null && memberClass) { String newLocalName = localName.substring(0, localName.lastIndexOf('.')); String newSimpleName = newLocalName.substring(newLocalName.lastIndexOf('.') + 1); enclosingType = new SimpleType(outerClassName, packageName, newSimpleName);