Title: [1436] trunk/qdox/src/main/java/com/thoughtworks/qdox/model: Simplify EvaluatingVisitor.visit(FieldRef)

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:

http://xircles.codehaus.org/manage_email

Reply via email to