JDK-8225468 : ClassCastException when trying to use custom DocletEnvironment implementation
  • Type: Bug
  • Component: tools
  • Sub-Component: javadoc(tool)
  • Affected Version: 11,12,13
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2019-06-06
  • Updated: 2019-06-07
  • Resolved: 2019-06-07
Related Reports
Duplicate :  
Description
A DESCRIPTION OF THE PROBLEM :
When trying to customize the JavaDoc generation process by wrapping the original DocletEnvironment implementation, the JavaDoc generation fails with a ClassCastException, because the JDK attempts to cast to the "exact" type of the DocletEnvironment instance. 

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : 
Write a custom doclet that extends the StandardDoclet and uses a delegate for DocletEnvironment and then use the doclet during JavaDoc generation. 

EXPECTED VERSUS ACTUAL BEHAVIOR : 
EXPECTED - 
The doclet works and no classcastexception is raised. 
ACTUAL - 
The Workarounds class attempts to cast the class to the default DocEnvImpl type and fails with a ClassCastException. 

---------- BEGIN SOURCE ---------- 
package bug.demo; 

import java.util.Set; 

import javax.lang.model.SourceVersion; 
import javax.lang.model.element.Element; 
import javax.lang.model.element.TypeElement; 
import javax.lang.model.util.Elements; 
import javax.lang.model.util.Types; 
import javax.tools.JavaFileManager; 
import javax.tools.JavaFileObject.Kind; 

import com.sun.source.util.DocTrees; 

import jdk.javadoc.doclet.DocletEnvironment; 
import jdk.javadoc.doclet.StandardDoclet; 

public class NewDoclet extends StandardDoclet { 

    @Override 
    public boolean run(DocletEnvironment docEnv) { 
        return super.run(wrap(docEnv)); 
    } 

    public DocletEnvironment wrap(DocletEnvironment env) { 
        return new DocletEnvironment() { 
            @Override 
            public Set<? extends Element> getSpecifiedElements() { 
                return env.getSpecifiedElements(); 
            } 

            @Override 
            public Set<? extends Element> getIncludedElements() { 
                return env.getIncludedElements(); 
            } 

            @Override 
            public DocTrees getDocTrees() { 
                return env.getDocTrees(); 
            } 

            @Override 
            public Elements getElementUtils() { 
                return env.getElementUtils(); 
            } 

            @Override 
            public Types getTypeUtils() { 
                return env.getTypeUtils(); 
            } 

            @Override 
            public boolean isIncluded(Element element) { 
                return env.isIncluded(element); 
            } 

            @Override 
            public boolean isSelected(Element element) { 
                return env.isSelected(element); 
            } 

            @Override 
            public JavaFileManager getJavaFileManager() { 
                return env.getJavaFileManager(); 
            } 

            @Override 
            public SourceVersion getSourceVersion() { 
                return env.getSourceVersion(); 
            } 

            @Override 
            public ModuleMode getModuleMode() { 
                return env.getModuleMode(); 
            } 

            @Override 
            public Kind getFileKind(TypeElement type) { 
                return env.getFileKind(type); 
            } 
        }; 
    } 
} 
---------- END SOURCE ---------- 



Comments
This is known issue JDK-8224092, which is already in open state
07-06-2019