- Revision
- 1436
- Author
- rfscholte
- Date
- 2011-10-22 10:33:26 -0500 (Sat, 22 Oct 2011)
Log Message
Simplify EvaluatingVisitor.visit(FieldRef) Expose JavaPackage.getJavaClassLibrary() Simplify and improve FieldRef.getField()
Modified Paths
- trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitor.java
- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaPackage.java
- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/_expression_/FieldRef.java
- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaPackage.java
- trunk/qdox/src/test/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitorTest.java
Diff
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitor.java (1435 => 1436)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitor.java 2011-10-22 13:32:29 UTC (rev 1435) +++ trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitor.java 2011-10-22 15:33:26 UTC (rev 1436) @@ -299,13 +299,12 @@ throw new IllegalArgumentException( "Cannot resolve field reference '" + fieldRef + "'." ); } - if ( !javaField.isFinal() || !javaField.isStatic() ) + if ( !(javaField.isFinal() && javaField.isStatic() ) ) { throw new IllegalArgumentException( "Field reference '" + fieldRef + "' must be static and final." ); } - Object result = getFieldReferenceValue( javaField ); - return result; + return getFieldReferenceValue( javaField ); } protected abstract Object getFieldReferenceValue( JavaField javaField );
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaPackage.java (1435 => 1436)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaPackage.java 2011-10-22 13:32:29 UTC (rev 1435) +++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaPackage.java 2011-10-22 15:33:26 UTC (rev 1436) @@ -21,6 +21,8 @@ import java.util.Collection; +import com.thoughtworks.qdox.library.ClassLibrary; + public interface JavaPackage extends JavaModel, JavaAnnotatedElement { @@ -63,5 +65,11 @@ * @return the name, should never be <code>null</code> */ String getName(); - + + /** + * The {@link ClassLibrary} of this package. + * + * @return the classLibrary, should never be <code>null</code> + */ + ClassLibrary getJavaClassLibrary(); } \ No newline at end of file
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/_expression_/FieldRef.java (1435 => 1436)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/_expression_/FieldRef.java 2011-10-22 13:32:29 UTC (rev 1435) +++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/_expression_/FieldRef.java 2011-10-22 15:33:26 UTC (rev 1436) @@ -21,17 +21,17 @@ import java.util.StringTokenizer; +import com.thoughtworks.qdox.library.ClassLibrary; import com.thoughtworks.qdox.model.JavaAnnotatedElement; import com.thoughtworks.qdox.model.JavaClass; import com.thoughtworks.qdox.model.JavaField; import com.thoughtworks.qdox.model.JavaMember; +import com.thoughtworks.qdox.model.JavaPackage; import com.thoughtworks.qdox.model.JavaParameter; -import com.thoughtworks.qdox.model.impl.DefaultJavaType; public class FieldRef implements AnnotationValue { - private final int[] parts; private final String name; @@ -156,25 +156,20 @@ if ( field == null ) { - JavaClass baseClass = declaringClass; - - // assume context is a JavaClass itself - if ( declaringClass == null ) + ClassLibrary classLibrary = getClassLibrary(); + if( classLibrary != null ) { - baseClass = (JavaClass) context; - } + for ( int i = 0; i < parts.length - 1; ++i ) + { + String className = getNamePrefix( i ); - for ( int i = 0; i < parts.length - 1; ++i ) - { - String className = getNamePrefix( i ); - String typeName = baseClass.resolveFullyQualifiedName( className ); - - if ( typeName != null ) - { - JavaClass javaClass = baseClass.getJavaClassLibrary().getJavaClass( typeName ); - fieldIndex = i + 1; - field = resolveField( javaClass, i + 1, parts.length - 1 ); - break; + if ( classLibrary.hasClassReference( className ) ) + { + JavaClass javaClass = classLibrary.getJavaClass( className ); + fieldIndex = i + 1; + field = resolveField( javaClass, i + 1, parts.length - 1 ); + break; + } } } } @@ -202,4 +197,25 @@ // } return result; } -} + + private ClassLibrary getClassLibrary() { + ClassLibrary result = null; + if ( context instanceof JavaPackage ) + { + result =( (JavaPackage) context).getJavaClassLibrary(); + } + else if ( context instanceof JavaClass ) + { + result =( (JavaClass) context).getJavaClassLibrary(); + } + else + { + JavaClass declaringClass = getDeclaringClass(); + if( declaringClass != null ) + { + result = declaringClass.getJavaClassLibrary(); + } + } + return result; + } +} \ No newline at end of file
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaPackage.java (1435 => 1436)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaPackage.java 2011-10-22 13:32:29 UTC (rev 1435) +++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaPackage.java 2011-10-22 15:33:26 UTC (rev 1436) @@ -68,6 +68,11 @@ { this.classLibrary = classLibrary; } + + public ClassLibrary getJavaClassLibrary() + { + return classLibrary; + } public void addClass(JavaClass clazz) { classes.add(clazz);
Modified: trunk/qdox/src/test/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitorTest.java (1435 => 1436)
--- trunk/qdox/src/test/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitorTest.java 2011-10-22 13:32:29 UTC (rev 1435) +++ trunk/qdox/src/test/java/com/thoughtworks/qdox/builder/impl/EvaluatingVisitorTest.java 2011-10-22 15:33:26 UTC (rev 1436) @@ -13,9 +13,14 @@ import org.junit.Ignore; import org.junit.Test; +import com.thoughtworks.qdox.library.ClassLibrary; +import com.thoughtworks.qdox.model.JavaAnnotatedElement; import com.thoughtworks.qdox.model.JavaAnnotation; import com.thoughtworks.qdox.model.JavaClass; import com.thoughtworks.qdox.model.JavaField; +import com.thoughtworks.qdox.model.JavaMethod; +import com.thoughtworks.qdox.model.JavaPackage; +import com.thoughtworks.qdox.model.JavaParameter; import com.thoughtworks.qdox.model.JavaType; import com.thoughtworks.qdox.model._expression_.Add; import com.thoughtworks.qdox.model._expression_.And; @@ -25,6 +30,7 @@ import com.thoughtworks.qdox.model._expression_.Divide; import com.thoughtworks.qdox.model._expression_.Equals; import com.thoughtworks.qdox.model._expression_.ExclusiveOr; +import com.thoughtworks.qdox.model._expression_.FieldRef; import com.thoughtworks.qdox.model._expression_.GreaterEquals; import com.thoughtworks.qdox.model._expression_.GreaterThan; import com.thoughtworks.qdox.model._expression_.LessEquals; @@ -496,9 +502,68 @@ } } - @Ignore @Test - public void testVisitFieldRef() { + public void testVisitFieldRef() + { + JavaAnnotatedElement annotatedElement = mock( JavaAnnotatedElement.class ); + FieldRef ref = new FieldRef( "fieldname" ); + ref.setContext( annotatedElement ); + try { + visitor.visit( ref ); + fail( "fieldname should be a unresolvable field" ); + } + catch( IllegalArgumentException e ) + { + } + + JavaField nonStaticNonFinalfield = mock( JavaField.class ); + + JavaClass declaringClass = mock( JavaClass.class ); + when( declaringClass.getFieldByName( "fieldname" ) ).thenReturn( nonStaticNonFinalfield ); + + JavaClass annotatedClass = mock( JavaClass.class ); + try + { + visitor.visit( ref ); + fail( "fieldname should fail, because it's not-static and non-final" ); + } + catch( IllegalArgumentException e) + { + } + + + JavaField staticFinalfield = mock( JavaField.class ); + when( staticFinalfield.isStatic() ).thenReturn( true ); + when( staticFinalfield.isFinal() ).thenReturn( true ); + when( declaringClass.getFieldByName( "fieldname" ) ).thenReturn( staticFinalfield ); + + ref = new FieldRef( "fieldname" ); + ref.setContext( annotatedClass ); + when( annotatedClass.getDeclaringClass() ).thenReturn( declaringClass ); + assertSame( EvaluatingVisitorStub.fieldReferenceValue, visitor.visit( ref ) ); + + JavaMethod annotatedMethod = mock( JavaMethod.class ); + ref = new FieldRef( "fieldname" ); + ref.setContext( annotatedMethod ); + when( annotatedMethod.getDeclaringClass() ).thenReturn( declaringClass ); + assertSame( EvaluatingVisitorStub.fieldReferenceValue, visitor.visit( ref ) ); + + JavaParameter annotatedParameter = mock( JavaParameter.class ); + ref = new FieldRef( "fieldname" ); + ref.setContext( annotatedParameter ); + when( annotatedParameter.getParentClass() ).thenReturn( declaringClass ); + assertSame( EvaluatingVisitorStub.fieldReferenceValue, visitor.visit( ref ) ); + + JavaPackage annotatedPackage = mock( JavaPackage.class ); + ref = new FieldRef( "a.B.fieldname" ); + ref.setContext( annotatedPackage ); + JavaClass b = mock( JavaClass.class ); + when( b.getFieldByName( "fieldname" ) ).thenReturn( staticFinalfield ); + ClassLibrary classLibrary = mock( ClassLibrary.class ); + when( classLibrary.hasClassReference( "a.B" ) ).thenReturn( true ); + when( classLibrary.getJavaClass( "a.B" ) ).thenReturn( b ); + when( annotatedPackage.getJavaClassLibrary() ).thenReturn( classLibrary ); + assertSame( EvaluatingVisitorStub.fieldReferenceValue, visitor.visit( ref ) ); } @@ -1258,12 +1323,14 @@ } } - private class EvaluatingVisitorStub extends EvaluatingVisitor { + private static class EvaluatingVisitorStub extends EvaluatingVisitor { + static final Object fieldReferenceValue = new Object(); + @Override protected Object getFieldReferenceValue( JavaField javaField ) { - return null; + return fieldReferenceValue; } } }
To unsubscribe from this list please visit:
