- Revision
- 600
- Author
- rfscholte
- Date
- 2009-05-21 06:13:00 -0500 (Thu, 21 May 2009)
Log Message
QDOX-148: introduction of JavaClassContext
Modified Paths
- trunk/qdox/src/java/com/thoughtworks/qdox/JavaDocBuilder.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/ClassLibrary.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClass.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassCache.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaClassParent.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/JavaSource.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/ModelBuilder.java
- trunk/qdox/src/java/com/thoughtworks/qdox/model/Type.java
- trunk/qdox/src/test/com/thoughtworks/qdox/model/ClassLibraryTest.java
- trunk/qdox/src/test/com/thoughtworks/qdox/model/TypeTest.java
Added Paths
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:
