r2280 - in trunk/jaxx-compiler/src: main/java/jaxx/compiler/reflect main/java/jaxx/compiler/reflect/resolvers test/java/jaxx/compiler/reflect test/java/jaxx/compiler/reflect/resolvers
Author: tchemit Date: 2011-05-15 14:13:29 +0200 (Sun, 15 May 2011) New Revision: 2280 Url: http://nuiton.org/repositories/revision/jaxx/2280 Log: Anomalie #1470: Loading java source file does not take account of super classes Added: trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/MyChildClass.java Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptor.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaClass.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFile.java trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/ClassDescriptorTest.java trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFileTest.java Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptor.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptor.java 2011-05-15 12:10:27 UTC (rev 2279) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptor.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -26,6 +26,8 @@ package jaxx.compiler.reflect; import jaxx.runtime.JAXXObjectDescriptor; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.util.Arrays; @@ -37,6 +39,12 @@ */ public abstract class ClassDescriptor { + /** Logger. */ + private static final Log log = LogFactory.getLog(ClassDescriptor.class); + + public static final FieldDescriptor[] EMPTY_FIELD_DESCRIPTORS_ARRAY = + new FieldDescriptor[0]; + private String name; private String packageName; @@ -69,9 +77,22 @@ String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException; - public abstract FieldDescriptor getDeclaredFieldDescriptor( - String name) throws NoSuchFieldException; +// public abstract FieldDescriptor getDeclaredFieldDescriptor( +// String name) throws NoSuchFieldException; + public FieldDescriptor getDeclaredFieldDescriptor(String name) throws NoSuchFieldException { + for (FieldDescriptor descriptor : declaredFieldDescriptors) { + if (name.equals(descriptor.getName())) { + if (log.isDebugEnabled()) { + log.debug("Using a declared field descriptor [" + name + + "] for " + getName()); + } + return descriptor; + } + } + throw new NoSuchFieldException(name); + } + protected ClassDescriptor(ClassDescriptorHelper.ResolverType resolverType, String name, String packageName, @@ -206,6 +227,10 @@ return fieldDescriptors; } + public FieldDescriptor[] getDeclaredFieldDescriptors() { + return declaredFieldDescriptors==null? EMPTY_FIELD_DESCRIPTORS_ARRAY : declaredFieldDescriptors; + } + public FieldDescriptor getFieldDescriptor(String name) throws NoSuchFieldException { for (FieldDescriptor fieldDescriptor : fieldDescriptors) { if (fieldDescriptor.getName().equals(name)) { Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaClass.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaClass.java 2011-05-15 12:10:27 UTC (rev 2279) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaClass.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -105,6 +105,16 @@ ); } + Field[] javaDeclaredFields = javaClass.getDeclaredFields(); + FieldDescriptor[] declaredFields = + new FieldDescriptor[javaDeclaredFields.length]; + for (int i = 0; i < declaredFields .length; i++) { + declaredFields[i] = ClassDescriptorHelper.createFieldDescriptor( + javaDeclaredFields[i], + javaClass.getClassLoader() + ); + } + JAXXObjectDescriptor jaxxObjectDescriptor = ClassDescriptorHelper.getJAXXObjectDescriptor(javaClass); @@ -121,7 +131,8 @@ classLoader, constructors, methods, - fields + fields, + declaredFields ); } @@ -143,7 +154,9 @@ ClassLoader classLoader, MethodDescriptor[] constructors, MethodDescriptor[] methods, - FieldDescriptor[] fields) { + FieldDescriptor[] fields, + FieldDescriptor[] declaredFields + ) { super( ClassDescriptorResolverFromJavaClass.this.getResolverType(), name, @@ -157,17 +170,18 @@ classLoader, constructors, methods, - fields + fields, + declaredFields ); this.javaClass = javaClass; } - @Override - public FieldDescriptor getDeclaredFieldDescriptor(String name) throws NoSuchFieldException { - return ClassDescriptorHelper.createFieldDescriptor(javaClass.getDeclaredField(name), - javaClass.getClassLoader() - ); - } +// @Override +// public FieldDescriptor getDeclaredFieldDescriptor(String name) throws NoSuchFieldException { +// return ClassDescriptorHelper.createFieldDescriptor(javaClass.getDeclaredField(name), +// javaClass.getClassLoader() +// ); +// } @Override public MethodDescriptor getDeclaredMethodDescriptor(String name, Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFile.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFile.java 2011-05-15 12:10:27 UTC (rev 2279) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFile.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -92,7 +92,7 @@ try { parser.doParse(displayName, reader); } catch (Exception e) { - log.error(e.getMessage()); +// log.error(e.getMessage()); throw new RuntimeException(e); } result = new JavaFileClassDescriptor(parser, classLoader); @@ -132,18 +132,18 @@ } - @Override - public FieldDescriptor getDeclaredFieldDescriptor(String name) throws NoSuchFieldException { - for (FieldDescriptor descriptor : declaredFieldDescriptors) { - if (name.equals(descriptor.getName())) { - if (log.isDebugEnabled()) { - log.debug("Using a declared field descriptor [" + name + "] for " + getName()); - } - return descriptor; - } - } - throw new NoSuchFieldException(name); - } +// @Override +// public FieldDescriptor getDeclaredFieldDescriptor(String name) throws NoSuchFieldException { +// for (FieldDescriptor descriptor : declaredFieldDescriptors) { +// if (name.equals(descriptor.getName())) { +// if (log.isDebugEnabled()) { +// log.debug("Using a declared field descriptor [" + name + "] for " + getName()); +// } +// return descriptor; +// } +// } +// throw new NoSuchFieldException(name); +// } @Override public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException { @@ -262,6 +262,7 @@ ClassDescriptor superclassDescriptor = ClassDescriptorHelper.getClassDescriptor(superclass, compiler.getClassLoader()); methods.addAll(Arrays.asList(superclassDescriptor.getMethodDescriptors())); fields.addAll(Arrays.asList(superclassDescriptor.getFieldDescriptors())); + declaredFields.addAll(Arrays.asList(superclassDescriptor.getDeclaredFieldDescriptors())); } return; Modified: trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/ClassDescriptorTest.java =================================================================== --- trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/ClassDescriptorTest.java 2011-05-15 12:10:27 UTC (rev 2279) +++ trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/ClassDescriptorTest.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -98,7 +98,6 @@ public void testConstructorFromClass() throws ClassNotFoundException, MalformedURLException { String className = MyClass.class.getName(); ClassDescriptor descriptor = ClassDescriptorHelper.getClassDescriptor(className); - ClassLoader classLoader = getClass().getClassLoader(); assertNotNull(descriptor); assertEquals(ClassDescriptorHelper.ResolverType.JAVA_CLASS, descriptor.getResolverType()); MethodDescriptor[] constructorDescriptors = descriptor.getConstructorDescriptors(); Added: trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/MyChildClass.java =================================================================== --- trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/MyChildClass.java (rev 0) +++ trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/MyChildClass.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -0,0 +1,48 @@ +/* + * #%L + * JAXX :: Compiler + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2011 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package jaxx.compiler.reflect; + +/** + * A child class to test the bug http://nuiton.org/issues/show/1470 + * <p/> + * To test if a child class obtains properties from his super class. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.4.2 + */ +public class MyChildClass extends MyClass implements Cloneable{ + + private static final long serialVersionUID = 2L; + + protected String childProperty; + + public String getChildProperty() { + return childProperty; + } + + public void setChildProperty(String childProperty) { + this.childProperty = childProperty; + } +} Property changes on: trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/MyChildClass.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFileTest.java =================================================================== --- trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFileTest.java 2011-05-15 12:10:27 UTC (rev 2279) +++ trunk/jaxx-compiler/src/test/java/jaxx/compiler/reflect/resolvers/ClassDescriptorResolverFromJavaFileTest.java 2011-05-15 12:13:29 UTC (rev 2280) @@ -28,6 +28,7 @@ import jaxx.compiler.reflect.ClassDescriptorHelper; import jaxx.compiler.reflect.FieldDescriptor; import jaxx.compiler.reflect.MyAbstractClass; +import jaxx.compiler.reflect.MyChildClass; import jaxx.compiler.reflect.MyClass; import jaxx.compiler.reflect.MyEnum; import jaxx.compiler.reflect.MyInterface; @@ -39,6 +40,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.util.ApplicationConfig; +import org.nuiton.util.FileUtil; import java.io.File; import java.io.Serializable; @@ -71,9 +73,10 @@ // says basedir is where we start tests. basedir = new File("").getAbsolutePath(); } - testSourceRoot = new File(new File(basedir), - "src" + File.separator + - "test" + File.separator + "java"); + testSourceRoot = FileUtil.getFileFromPaths(new File(basedir), + "src", + "test", + "java"); } protected ClassDescriptor getDescriptor(Class<?> klass) throws Exception { @@ -215,6 +218,58 @@ } + @Test + public void parseMyChildClass() throws Exception { + + ClassDescriptor descriptor = getDescriptor(MyChildClass.class); + + assertInterfaces(descriptor, MyChildClass.class.getInterfaces()); + assertInterfaces(descriptor, Cloneable.class); + assertSuperClass(descriptor, MyClass.class); + assertIsAssignableFrom(descriptor, + Serializable.class, + MyInterface.class, + MyAbstractClass.class, + MyClass.class + ); + + assertDeclaredField( + descriptor, + "serialVersionUID", + long.class, + Modifier.PRIVATE | Modifier.FINAL | Modifier.STATIC + ); + + assertDeclaredField( + descriptor, + "myPrivateStringField", + String.class, + Modifier.PRIVATE | Modifier.FINAL + ); + + assertDeclaredField( + descriptor, + "myProtectedStringField", + String.class, + Modifier.PROTECTED + ); + + assertDeclaredField( + descriptor, + "childProperty", + String.class, + Modifier.PROTECTED + ); + + assertField( + descriptor, + "myPublicStringField", + String.class, + Modifier.PUBLIC + ); + + } + public static void assertField(ClassDescriptor descriptor, String fieldName, Class<?> fieldType,
participants (1)
-
tchemit@users.nuiton.org