Title: [600] trunk/qdox/src/java/com/thoughtworks/qdox: QDOX-148: introduction of JavaClassContext

Diff

Added: trunk/qdox/src/java/com/thoughtworks/qdox/DefaultJavaClassCache.java (0 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/DefaultJavaClassCache.java	                        (rev 0)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/DefaultJavaClassCache.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -0,0 +1,25 @@
+package com.thoughtworks.qdox;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaClassCache;
+
+public class DefaultJavaClassCache implements JavaClassCache {
+
+	private Map classes = new Hashtable();
+	
+	public JavaClass getClassByName(String name) {
+		return (JavaClass) classes.get(name);
+	}
+
+	public JavaClass[] getClasses() {
+		return (JavaClass[]) classes.values().toArray(new JavaClass[0]);
+	}
+
+	public void putClassByName(String name, JavaClass javaClass) {
+		classes.put(name, javaClass);
+	}
+
+}

Added: trunk/qdox/src/java/com/thoughtworks/qdox/JavaClassContext.java (0 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/JavaClassContext.java	                        (rev 0)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/JavaClassContext.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -0,0 +1,80 @@
+package com.thoughtworks.qdox;
+
+import java.io.Serializable;
+
+import com.thoughtworks.qdox.model.ClassLibrary;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaClassCache;
+
+/**
+ * JavaClassContext gives you a mechanism to get a JavaClass.
+ * If a class couldn't be found in the cache, the class will be pulled from the classLibrary, the builder will create the corresponding JavaClass and put it in the cache.  
+ * 
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class JavaClassContext implements Serializable {
+
+	private final JavaClassCache cache;
+	private ClassLibrary classLibrary;
+	private JavaDocBuilder builder;
+	
+	public JavaClassContext(JavaDocBuilder builder) {
+		this.builder = builder;
+		this.cache = new DefaultJavaClassCache();
+	}
+	
+	
+	public JavaClassContext(ClassLibrary classLibrary) {
+		this.classLibrary = classLibrary;
+		this.cache = new DefaultJavaClassCache();
+	}
+	
+	
+	public void setClassLibrary(ClassLibrary classLibrary) {
+		this.classLibrary = classLibrary;
+	}
+	
+	/**
+	 * temporary, this should be hidden
+	 * @return classLibrary
+	 * @todo remove
+	 */
+	public ClassLibrary getClassLibrary() {
+		return classLibrary;
+	}
+	
+	
+	public JavaClass getClassByName(String name) {
+		JavaClass result = cache.getClassByName(name);
+		if(result == null && builder != null) {
+			result = builder.createBinaryClass(name);
+			if(result != null) {
+				add(result);
+		        result.setJavaClassContext(this);
+			}
+			else {
+				result = builder.createUnknownClass(name);
+				add(result);
+			}
+		}
+		return result;
+	}
+	
+	public JavaClass[] getClasses() {
+		return cache.getClasses();
+	}
+	public void add(JavaClass javaClass) {
+		cache.putClassByName(javaClass.getFullyQualifiedName(), javaClass);
+	}
+	
+	
+	public void add(String fullyQualifiedClassName) {
+		classLibrary.add(fullyQualifiedClassName);
+	}
+
+	public Class getClass(String name) {
+		return classLibrary.getClass(name);
+	}
+}

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/JavaDocBuilder.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/JavaDocBuilder.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/JavaDocBuilder.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -78,11 +78,11 @@
  * @author Aslak Hellesøy
  * @author Robert Scholte
  */
-public class JavaDocBuilder implements Serializable, JavaClassCache {
+public class JavaDocBuilder implements Serializable {
 
-    private Map classes = new HashMap();
+	private final JavaClassContext context;;
+	
     private Set packages = new HashSet();
-    private ClassLibrary classLibrary;
     private List sources = new ArrayList();
     private DocletTagFactory docletTagFactory;
     private String encoding = System.getProperty("file.encoding");
@@ -101,8 +101,10 @@
 
     public JavaDocBuilder(DocletTagFactory docletTagFactory) {
         this.docletTagFactory = docletTagFactory;
-        classLibrary = new ClassLibrary(this);
+        ClassLibrary classLibrary = new ClassLibrary();
         classLibrary.addDefaultLoader();
+        this.context = new JavaClassContext(this);
+        this.context.setClassLibrary(classLibrary);
     }
 
     public JavaDocBuilder(ClassLibrary classLibrary) {
@@ -111,7 +113,8 @@
 
     public JavaDocBuilder(DocletTagFactory docletTagFactory, ClassLibrary classLibrary) {
         this.docletTagFactory = docletTagFactory;
-        this.classLibrary = classLibrary; 
+        this.context = new JavaClassContext(this);
+        this.context.setClassLibrary(classLibrary);
     }
 
     private void addClasses(JavaSource source) {
@@ -125,30 +128,19 @@
     }
 
     private void addClass(JavaClass cls) {
-        classes.put(cls.getFullyQualifiedName(), cls);
-        cls.setJavaClassCache(this);
+        context.add(cls);
+        cls.setJavaClassContext(context);
     }
 
     public JavaClass getClassByName(String name) {
         if (name == null) {
             return null;
         }
-        JavaClass result = (JavaClass) classes.get(name);
-        if (result == null) {
-            // Try to make a binary class out of it
-            result = createBinaryClass(name);
-            if (result != null) {
-                addClass(result);
-            } else {
-                result = createUnknownClass(name);
-                classes.put(name, result);
-            }
-        }
-        return result;
+        return context.getClassByName(name);
     }
 
-    private JavaClass createUnknownClass(String name) {
-        ModelBuilder unknownBuilder = new ModelBuilder(classLibrary, docletTagFactory, new HashMap());
+    protected JavaClass createUnknownClass(String name) {
+        ModelBuilder unknownBuilder = new ModelBuilder(context, docletTagFactory, new HashMap());
         ClassDef classDef = new ClassDef();
         classDef.name = name;
         unknownBuilder.beginClass(classDef);
@@ -158,16 +150,16 @@
         return result;
     }
 
-    private JavaClass createBinaryClass(String name) {
+    protected JavaClass createBinaryClass(String name) {
         // First see if the class exists at all.
-        Class clazz = classLibrary.getClass(name);
+        Class clazz = context.getClass(name);
         if (clazz == null) {
             return null;
         } else {
             try {
 				// Create a new builder and mimic the behaviour of the parser.
 				// We're getting all the information we need via reflection instead.
-				ModelBuilder binaryBuilder = new ModelBuilder(classLibrary, docletTagFactory, new HashMap());
+				ModelBuilder binaryBuilder = new ModelBuilder(context, docletTagFactory, new HashMap());
 
 				// Set the package name and class name
 				String packageName = getPackageName(name);
@@ -321,7 +313,7 @@
     }
 
     public JavaSource addSource(Reader reader, String sourceInfo) {
-        ModelBuilder builder = new ModelBuilder(classLibrary, docletTagFactory, allPackages);
+        ModelBuilder builder = new ModelBuilder(context, docletTagFactory, allPackages);
         Lexer lexer = new JFlexLexer(reader);
         Parser parser = new Parser(lexer, builder);
         parser.setDebugLexer(debugLexer);
@@ -455,7 +447,7 @@
 
     public List search(Searcher searcher) {
         List results = new LinkedList();
-        for (Iterator iterator = classLibrary.all().iterator(); iterator.hasNext();) {
+        for (Iterator iterator = context.getClassLibrary().all().iterator(); iterator.hasNext();) {
             String clsName = (String) iterator.next();
             JavaClass cls = getClassByName(clsName);
             if (searcher.eval(cls)) {
@@ -466,7 +458,7 @@
     }
 
     public ClassLibrary getClassLibrary() {
-        return classLibrary;
+        return context.getClassLibrary();
     }
 
     public void save(File file) throws IOException {

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/ClassLibrary.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/ClassLibrary.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/ClassLibrary.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -25,6 +25,8 @@
     private transient List classLoaders = new ArrayList();
     private JavaClassCache cache;
     
+    public ClassLibrary() {}
+    
     public ClassLibrary(JavaClassCache cache) {
         this.cache = cache;
     }

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClass.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClass.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClass.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -1,5 +1,6 @@
 package com.thoughtworks.qdox.model;
 
+import com.thoughtworks.qdox.JavaClassContext;
 import com.thoughtworks.qdox.model.util.OrderedMap;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,7 +35,7 @@
     private Type type;
     private Type superClass;
     private Type[] implementz = new Type[0];
-    private JavaClassCache javaClassCache;
+    private JavaClassContext context;
 	private JavaPackage javaPackage;
 
     public JavaClass() {
@@ -44,13 +45,13 @@
         setName(name);
     }
 
-    public void setJavaClassCache(JavaClassCache javaClassCache) {
-        this.javaClassCache = javaClassCache;
+    public void setJavaClassContext(JavaClassContext context) {
+		this.context = context;
 
         // reassign OBJECT. This will make it have a "source" too,
         // causing Type.getJavaClass() to return a JavaClass, instead
         // of null.
-        OBJECT = javaClassCache.getClassByName("java.lang.Object").asType();
+        OBJECT = context.getClassByName("java.lang.Object").asType();
     }
 
     /**
@@ -237,8 +238,8 @@
         return getParent().resolveType(typeName);
     }
 
-    public ClassLibrary getClassLibrary() {
-        return getParent().getClassLibrary();
+    public JavaClassContext getJavaClassContext() {
+        return getParent().getJavaClassContext();
     }
 
     public String getClassNamePrefix() {
@@ -557,7 +558,7 @@
      */
     public JavaClass[] getDerivedClasses() {
         List result = new ArrayList();
-        JavaClass[] classes = javaClassCache.getClasses();
+        JavaClass[] classes = context.getClasses();
 
         for (int i = 0; i < classes.length; i++) {
             JavaClass clazz = classes[i];

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassCache.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassCache.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassCache.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -1,6 +1,9 @@
 package com.thoughtworks.qdox.model;
 
-public interface JavaClassCache {
+import java.io.Serializable;
+
+public interface JavaClassCache extends Serializable {
     public JavaClass[] getClasses();
     public JavaClass getClassByName(String name);
+    public void putClassByName(String name, JavaClass javaClass);
 }

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassParent.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassParent.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassParent.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -1,5 +1,7 @@
 package com.thoughtworks.qdox.model;
 
+import com.thoughtworks.qdox.JavaClassContext;
+
 public interface JavaClassParent {
 
     /**
@@ -10,7 +12,7 @@
      */
     public String resolveType(String typeName);
 
-    public ClassLibrary getClassLibrary();
+    public JavaClassContext getJavaClassContext();
 
     public String getClassNamePrefix();
 

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaSource.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaSource.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaSource.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -12,6 +12,9 @@
 import java.util.Map;
 import java.util.Set;
 
+import com.thoughtworks.qdox.DefaultJavaClassCache;
+import com.thoughtworks.qdox.JavaClassContext;
+
 public class JavaSource implements Serializable, JavaClassParent {
 
     private static final Set PRIMITIVE_TYPES = new HashSet();
@@ -33,10 +36,18 @@
     private String[] importsArray;
     private List classes = new LinkedList();
     private JavaClass[] classesArray;
-    private ClassLibrary classLibrary;
+    private JavaClassContext context;
     private Map resolvedTypeCache = new HashMap();
     private URL url;
 
+    public JavaSource() {
+    	this(new JavaClassContext((ClassLibrary) null));
+    }
+    
+    public JavaSource(JavaClassContext context) {
+    	this.context = context;
+    }
+    
     /**
      * @since 1.4
      */
@@ -104,12 +115,12 @@
         return classesArray;
     }
 
-    public ClassLibrary getClassLibrary() {
-        return classLibrary;
+    public JavaClassContext getJavaClassContext() {
+        return this.context;
     }
 
     public void setClassLibrary(ClassLibrary classLibrary) {
-        this.classLibrary = classLibrary;
+        this.context.setClassLibrary(classLibrary);
     }
 
     public String getCodeBlock() {
@@ -217,7 +228,7 @@
                 break lookup;
             }
 
-            if(getClassLibrary() != null) {
+            if(context.getClassLibrary() != null) {
                 // check for a class in the same package
                 resolvedName = resolveFromLibrary( getClassNamePrefix() + nestedName );
                 
@@ -263,11 +274,11 @@
     }
     
     private String resolveFromLibrary(String typeName) {
-        return getClassLibrary().contains( typeName ) ? typeName : null;
+        return context.getClassLibrary().contains( typeName ) ? typeName : null;
     }
     
     private String resolveFullyQualifiedType(String typeName) {
-        if (getClassLibrary() != null) {
+        if (context.getClassLibrary() != null) {
             int indexOfLastDot = typeName.lastIndexOf('.');
             
             if (indexOfLastDot >= 0) {
@@ -281,7 +292,7 @@
             }
     
             // check for fully-qualified class
-            if (getClassLibrary().contains(typeName)) {
+            if (context.getClassLibrary().contains(typeName)) {
                 return typeName;
             }
         }
@@ -313,4 +324,13 @@
         return result;
     }
 
+    /**
+     * 
+     * @return
+     * @deprecated, use getJavaClassContext().getClassLibrary()
+     */
+	public ClassLibrary getClassLibrary() {
+		return this.context.getClassLibrary();
+	}
+
 }

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/ModelBuilder.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/ModelBuilder.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/ModelBuilder.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -9,6 +9,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import com.thoughtworks.qdox.JavaClassContext;
 import com.thoughtworks.qdox.model.annotation.AnnotationFieldRef;
 import com.thoughtworks.qdox.model.annotation.AnnotationVisitor;
 import com.thoughtworks.qdox.model.annotation.RecursiveAnnotationVisitor;
@@ -27,7 +28,7 @@
  */
 public class ModelBuilder implements Builder {
 
-    private final ClassLibrary classLibrary;
+    private final JavaClassContext context;
     private final JavaSource source;
     private JavaClassParent currentParent;
     private JavaClass currentClass;
@@ -38,15 +39,14 @@
     private final Map allPackages;
 
     public ModelBuilder() {
-        this(new ClassLibrary(null), new DefaultDocletTagFactory(), new HashMap());
+        this(new JavaClassContext(new ClassLibrary(null)), new DefaultDocletTagFactory(), new HashMap());
     }
 
-    public ModelBuilder(ClassLibrary classLibrary, DocletTagFactory docletTagFactory, Map allPackages) {
-        this.classLibrary = classLibrary;
+    public ModelBuilder(JavaClassContext context, DocletTagFactory docletTagFactory, Map allPackages) {
+        this.context = context;
         this.docletTagFactory = docletTagFactory;
         this.allPackages = allPackages;
-        source = new JavaSource();
-        source.setClassLibrary(classLibrary);
+        source = new JavaSource(context);
         currentParent = source;
         currentAnnoDefs = new ArrayList();
     }
@@ -126,7 +126,7 @@
 
         currentParent.addClass(currentClass);
         currentParent = currentClass;
-        classLibrary.add(currentClass.getFullyQualifiedName());
+        context.add(currentClass.getFullyQualifiedName());
     }
 
     public void endClass() {

Modified: trunk/qdox/src/java/com/thoughtworks/qdox/model/Type.java (599 => 600)

--- trunk/qdox/src/java/com/thoughtworks/qdox/model/Type.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/java/com/thoughtworks/qdox/model/Type.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -2,6 +2,7 @@
 
 import java.io.Serializable;
 
+import com.thoughtworks.qdox.JavaClassContext;
 import com.thoughtworks.qdox.parser.structs.TypeDef;
 import com.thoughtworks.qdox.parser.structs.WildcardTypeDef;
 
@@ -184,9 +185,9 @@
         if (javaClassParent != null) {
         	result = javaClassParent.getNestedClassByName(getValue());
 	        if(result == null) {
-	            ClassLibrary classLibrary = javaClassParent.getClassLibrary();
-	            if (classLibrary != null) {
-	            	result = classLibrary.getClassByName(getValue());
+	            JavaClassContext context = javaClassParent.getJavaClassContext();
+	            if (context.getClassLibrary() != null) {
+	            	result = context.getClassByName(getValue());
 	            }
 	        }
         }

Modified: trunk/qdox/src/test/com/thoughtworks/qdox/model/ClassLibraryTest.java (599 => 600)

--- trunk/qdox/src/test/com/thoughtworks/qdox/model/ClassLibraryTest.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/test/com/thoughtworks/qdox/model/ClassLibraryTest.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -74,4 +74,8 @@
         assertNotNull(jclass);
         assertEquals("MyClass", jclass.getName());
     }
+
+	public void putClassByName(String name, JavaClass javaClass) {
+		//only required by interface
+	}
 }

Modified: trunk/qdox/src/test/com/thoughtworks/qdox/model/TypeTest.java (599 => 600)

--- trunk/qdox/src/test/com/thoughtworks/qdox/model/TypeTest.java	2009-05-18 18:29:05 UTC (rev 599)
+++ trunk/qdox/src/test/com/thoughtworks/qdox/model/TypeTest.java	2009-05-21 11:13:00 UTC (rev 600)
@@ -1,6 +1,8 @@
 package com.thoughtworks.qdox.model;
 
 import junit.framework.TestCase;
+
+import com.thoughtworks.qdox.JavaClassContext;
 import com.thoughtworks.qdox.JavaDocBuilder;
 
 public class TypeTest extends TestCase {
@@ -45,8 +47,8 @@
     }
 
     public void testTypeHasJavaClass() {
-        JavaSource javaSource = new JavaSource();
-        javaSource.setClassLibrary(new ClassLibrary(new JavaDocBuilder()));
+        JavaSource javaSource = new JavaSource(new JavaClassContext(new JavaDocBuilder()));
+        javaSource.setClassLibrary(new ClassLibrary(null));
         Type type = new Type("java.util.HashSet", 0, javaSource);
         JavaClass clazz = type.getJavaClass();
         JavaClass superClass = clazz.getSuperJavaClass();


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to