/* gnu.classpath.tools.gjdoc.ClassDocReflectedImpl
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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 Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
package gnu.classpath.tools.gjdoc;
import com.sun.javadoc.*;
import java.util.Map;
import java.util.HashMap;
public class ClassDocReflectedImpl
implements ClassDoc, WritableType
{
private Class clazz;
private String name;
private ClassDoc superclassDoc;
private ClassDoc[] unfilteredInnerClasses;
private String dimension = "";
private static Map reflectionCache = new HashMap();
public static ClassDocReflectedImpl newInstance(Class clazz)
{
ClassDocReflectedImpl result
= (ClassDocReflectedImpl)reflectionCache.get(clazz);
if (null != result) {
return result;
}
else {
return new ClassDocReflectedImpl(clazz);
}
}
public ClassDocReflectedImpl(Class clazz)
{
reflectionCache.put(clazz, this);
//System.err.println("ClassDocReflectedImpl: " + clazz);
this.clazz = clazz;
String className = clazz.getName();
int ndx = className.lastIndexOf('.');
if (ndx >= 0) {
this.name = className.substring(ndx + 1);
}
else {
this.name = className;
}
Class superclass = clazz.getSuperclass();
if (null != superclass && !clazz.getName().equals("java.lang.Object")) {
this.superclassDoc = (ClassDocReflectedImpl)reflectionCache.get(superclass);
if (null == this.superclassDoc) {
this.superclassDoc = new ClassDocReflectedImpl(superclass);
}
}
Class[] innerclasses = clazz.getDeclaredClasses();
this.unfilteredInnerClasses = new ClassDoc[innerclasses.length];
for (int i=0; i<innerclasses.length; ++i) {
this.unfilteredInnerClasses[i] = (ClassDocReflectedImpl)reflectionCache.get(innerclasses[i]);
if (null == this.unfilteredInnerClasses[i]) {
this.unfilteredInnerClasses[i] = new ClassDocReflectedImpl(innerclasses[i]);
//System.err.println("adding " + this.unfilteredInnerClasses[i] + " [" + innerclasses[i] + "] as inner class of " + this + " [" + clazz + "]");
}
}
}
public ConstructorDoc[] constructors() { return new ConstructorDoc[0]; }
public ConstructorDoc[] constructors(boolean filtered) { return new ConstructorDoc[0]; }
public boolean definesSerializableFields() { return false; }
public FieldDoc[] fields() { return new FieldDoc[0]; }
public FieldDoc[] fields(boolean filtered) { return new FieldDoc[0]; }
public ClassDoc findClass(java.lang.String className) { return null; }
public ClassDoc[] importedClasses() { return new ClassDoc[0]; }
public PackageDoc[] importedPackages() { return new PackageDoc[0]; }
public ClassDoc[] innerClasses() { return new ClassDoc[0]; }
public ClassDoc[] innerClasses(boolean filtered)
{
if (filtered) {
return new ClassDoc[0];
}
else {
return unfilteredInnerClasses;
}
}
public ClassDoc[] interfaces() { return new ClassDoc[0]; }
public boolean isAbstract() { return false; }
public boolean isExternalizable() { return false; }
public boolean isSerializable() { return false; }
public MethodDoc[] methods() { return new MethodDoc[0]; }
public MethodDoc[] methods(boolean filtered) { return new MethodDoc[0]; }
public FieldDoc[] serializableFields() { return new FieldDoc[0]; }
public MethodDoc[] serializationMethods() { return new MethodDoc[0]; }
public boolean subclassOf(ClassDoc cd) { return false; }
public ClassDoc superclass() {
return superclassDoc;
}
public ClassDoc containingClass()
{
Class declaringClass = clazz.getDeclaringClass();
if (null != declaringClass) {
return new ClassDocReflectedImpl(declaringClass);
}
else {
return null;
}
}
public PackageDoc containingPackage()
{
Class outerClass = clazz;
while (null != outerClass.getDeclaringClass()) {
outerClass = outerClass.getDeclaringClass();
}
String packageName = outerClass.getName();
int ndx = packageName.lastIndexOf('.');
if (ndx > 0) {
packageName = packageName.substring(0, ndx);
}
else {
packageName = "";
}
PackageDoc result = Main.getRootDoc().findOrCreatePackageDoc(packageName);
return result;
}
public boolean isFinal() { return false; }
public boolean isPackagePrivate() { return false; }
public boolean isPrivate() { return false; }
public boolean isProtected() { return false; }
public boolean isPublic() { return false; }
public boolean isStatic() { return false; }
public String modifiers() { return ""; }
public int modifierSpecifier() { return 0; }
public String qualifiedName() { return clazz.getName().replace('$', '.'); }
public String commentText() { return null; }
public Tag[] firstSentenceTags() { return new Tag[0]; }
public String getRawCommentText() { return null; }
public Tag[] inlineTags() { return new Tag[0]; }
public boolean isClass() { return false; }
public boolean isConstructor() { return false; }
public boolean isError() { return false; }
public boolean isException() { return false; }
public boolean isField() { return false; }
public boolean isIncluded() { return false; }
public boolean isInterface() { return false; }
public boolean isMethod() { return false; }
public boolean isOrdinaryClass() { return false; }
public String name() { return name; }
public SourcePosition position() { return null; }
public SeeTag[] seeTags() { return new SeeTag[0]; }
public void setRawCommentText(java.lang.String rawDocumentation) {}
public Tag[] tags() { return new Tag[0]; }
public Tag[] tags(java.lang.String tagname) { return new Tag[0]; }
public String typeName() { return name; }
public String qualifiedTypeName() { return qualifiedName(); }
public ClassDoc asClassDoc() { return this; }
public TypeVariable asTypeVariable() { return null; }
public boolean isPrimitive() { return false; }
public String toString() { return "ClassDocReflectedImpl{"+qualifiedName()+"}"; }
public int compareTo(java.lang.Object o) {
if (o instanceof Doc) {
return Main.getInstance().getCollator().compare(name(), ((Doc)o).name());
}
else {
return 0;
}
}
public String dimension() { return dimension; }
public void setDimension(String dimension) {
this.dimension = dimension;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public TypeVariable[] typeParameters() { return new TypeVariable[0]; }
}