-
Bug
-
Resolution: Fixed
-
P2
-
8, 9
-
b75
-
b158
-
x86_64
-
windows_7
-
Verified
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8175706 | 10 | Vicente Arturo Romero Zaldivar | P2 | Resolved | Fixed | b02 |
FULL PRODUCT VERSION :
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
EXTRA RELEVANT SYSTEM CONFIGURATION :
Running Windows 7 64bit, Installed Java JDK and JRE (32bit and 64bit),
using 64bit Java for compiler task, using opensource build tool Gradle version 2.14.1 to build and run applications
A DESCRIPTION OF THE PROBLEM :
The exception is raised while creating the javadoc for our project. We (my company and I) are developing database applications based on Java. We are using Frameworks like Spring, Spring Boot, JDOM2, Apache Camel and Jetty.
Running the javadoc executable as standalone with any Gradle taks it does NOT work either.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Call this with the class source code send with this report:
"C:\Program Files\Java\jdk1.8.0_91\bin\javadoc.exe" U:\WIB\git\xscore\core\src\main\java\com\din\xscore\core\domain\filter\builder\TreeFilterBuilder.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The excepted result is a complete java API documentation of our application classes.
ACTUAL -
No result. The process crashes.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$TypeVariableSymbol cannot be cast to com.sun.tools.javac.code.Symbol$ClassSymbol
at com.sun.tools.javac.api.JavacTrees.attributeDocReference(JavacTrees.java:410)
at com.sun.tools.javac.api.JavacTrees.getElement(JavacTrees.java:345)
at com.sun.tools.doclint.Checker.visitReference(Checker.java:756)
at com.sun.tools.doclint.Checker.visitReference(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCReference.accept(DCTree.java:523)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:65)
at com.sun.source.util.DocTreeScanner.visitLink(DocTreeScanner.java:177)
at com.sun.tools.doclint.Checker.visitLink(Checker.java:684)
at com.sun.tools.doclint.Checker.visitLink(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCLink.accept(DCTree.java:422)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:65)
at com.sun.source.util.DocTreeScanner.scanAndReduce(DocTreeScanner.java:81)
at com.sun.source.util.DocTreeScanner.scan(DocTreeScanner.java:92)
at com.sun.source.util.DocTreeScanner.scanAndReduce(DocTreeScanner.java:100)
at com.sun.source.util.DocTreeScanner.visitDocComment(DocTreeScanner.java:140)
at com.sun.tools.doclint.Checker.visitDocComment(Checker.java:217)
at com.sun.tools.doclint.Checker.visitDocComment(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCDocComment.accept(DCTree.java:122)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:47)
at com.sun.tools.doclint.Checker.scan(Checker.java:179)
at com.sun.tools.doclint.DocLint.scan(DocLint.java:319)
at com.sun.tools.javadoc.DocImpl.comment(DocImpl.java:133)
at com.sun.tools.javadoc.DocImpl.tags(DocImpl.java:154)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.checkOnPropertiesTags(VisibleMemberMap.java:686)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.getClassMembers(VisibleMemberMap.java:464)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.addMembers(VisibleMemberMap.java:372)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.mapClass(VisibleMemberMap.java:346)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.mapClass(VisibleMemberMap.java:358)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.build(VisibleMemberMap.java:341)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.access$100(VisibleMemberMap.java:291)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap.<init>(VisibleMemberMap.java:127)
at com.sun.tools.doclets.internal.toolkit.builders.MemberSummaryBuilder.<init>(MemberSummaryBuilder.java:82)
at com.sun.tools.doclets.internal.toolkit.builders.MemberSummaryBuilder.getInstance(MemberSummaryBuilder.java:101)
at com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory.getMemberSummaryBuilder(BuilderFactory.java:278)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.getNavSummaryLinks(ClassWriterImpl.java:641)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.addSummaryDetailLinks(ClassWriterImpl.java:622)
at com.sun.tools.doclets.formats.html.HtmlDocletWriter.addNavLinks(HtmlDocletWriter.java:560)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.getHeader(ClassWriterImpl.java:165)
at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildClassDoc(ClassBuilder.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.invokeMethod(AbstractBuilder.java:180)
at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:135)
at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.build(ClassBuilder.java:120)
at com.sun.tools.doclets.formats.html.HtmlDoclet.generateClassFiles(HtmlDoclet.java:189)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:205)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:189)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:137)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:82)
at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:80)
at com.sun.tools.doclets.standard.Standard.start(Standard.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
1 error
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:310)
at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:189)
at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:366)
at com.sun.tools.javadoc.Start.begin(Start.java:219)
at com.sun.tools.javadoc.Start.begin(Start.java:205)
at com.sun.tools.javadoc.Main.execute(Main.java:64)
at com.sun.tools.javadoc.Main.main(Main.java:54)
javadoc: error - java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$TypeVariableSymbol cannot be cast to com.sun.tools.javac.code.Symbol$ClassSymbol
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package com.din.xscore.core.domain.filter.builder;
import com.din.xscore.core.domain.filter.TreeFilter;
import com.din.xscore.core.repository.FilterRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* This abstract class defines filter builder working only with {@link TreeFilter}.
*
* <p>Any implementation of this class are <b>not</b> thread-safe! However the build process
* could be synchronized externally to support multiple threads or the filter builder instance could be reuse
* by a single thread by calling the build method again (resets all cached data).</p>
*
* @author WIB
* @version 1.0
* @since 2016-08-08
*/
public abstract class TreeFilterBuilder<F extends TreeFilter, T> implements FilterBuilder<F, T>
{
protected final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* The filter repository.
*/
protected final FilterRepository<F> repository;
/**
* A cache, used while build process.
*/
private final Map<String, F> cache;
/**
* All constructed tree root filter.
*/
private final Map<String, F> roots;
/**
* All incoming filter expressions ("leafs" of the in-memory tree).
*/
private final Map<String, F> leafs;
/**
* Constructor.
*
* <p>This constructor will create internal caches with the following initial sizes:
* <ul>
* <li>Roots: 5</li>
* <li>Cache: 20</li>
* <li>Leafs: 10</li>
* </ul>
* </p>
*
* @param repository filter repository instance supporting {@link TreeFilter}
*/
protected TreeFilterBuilder(FilterRepository<F> repository)
{
this.repository = repository;
this.roots = new HashMap<>(5);
this.cache = new HashMap<>(20);
this.leafs = new HashMap<>(10);
}
@Override
@SuppressWarnings ("unchecked")
public Collection<F> build(Map<String, T> source)
{
// clear caches
leafs.clear();
roots.clear();
cache.clear();
// read configuration one by one
for(String key : source.keySet())
{
// get filter if known
F leaf = this.repository.get(key);
if(leaf!=null)
{
// clone filter (to reuse filter instance)
leaf = (F) leaf.clone();
configureFilter(leaf, source.get(key));
log.debug("{}: {}", leaf.getName(), leaf.getDefinition());
this.leafs.put(leaf.getName(), leaf);
}
}
// build up in-memory tree
walkTree(this.leafs);
// return all constructed root filter
return this.roots.values();
}
/**
* Walks up the in-memory filter tree processing (clone and build) all filters per tree level recursively.
*
* @param filters tree level as filter map
*/
private void walkTree(Map<String, F> filters)
{
Map<String, F> treeLevel = new HashMap<>();
// walk over every filter on this level
for(String key : filters.keySet())
{
// get the filter
F filter = filters.get(key);
// if root move to roots
if(filter.isRoot())
this.roots.putIfAbsent(filter.getName(), filter);
else {
// otherwise process and get parent
F parent = prepareParent(filter);
//log.debug("walkTree: "+parent.definition());
// add to next tree level
treeLevel.put(parent.getName(), parent);
}
}
// proceed to next level (if no more leafs left stop)
if(treeLevel.size()>0)
walkTree(treeLevel);
}
/**
* Configures the given filter instance with the given configuration.
*
* <p>This method should call {@link F#build()}.</p>
*
* @param filter filter instance
* @param config configuration instance
*
* @see #build(Map)
*/
protected abstract void configureFilter(F filter, T config);
/**
* Prepares the parent tree filter of the given filter for processing.
*
* <p>"Preparation" means any operation(s) to retrieve the parent from
* the child filter (could include cloning, building, setting parameters).</p>
*
* @param filter filter instance
*
* @return prepared parent filter
*/
protected abstract F prepareParent(F filter);
/**
* Returns a flag indicating if the filter with the given name is cached already.
*
* @param name unique name of a filter, filter key
*
* @return <code>true</code>, if the filter with the given name is cached, <code>false</code> otherwise
*/
protected boolean isCached(String name)
{
return this.cache.containsKey(name);
}
/**
* Caches a filter instance.
*
* @param filter filter to cache
*/
protected void cache(F filter)
{
this.cache.put(filter.getName(), filter);
}
/**
* Retrieves a cached filter instance.
*
* @param name unique name of a filter, filter key
*
* @return cached filter instance, or <code>null</code> if there is no cached filter with that name
*/
protected F cache(String name)
{
return this.cache.get(name);
}
}
---------- END SOURCE ----------
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
EXTRA RELEVANT SYSTEM CONFIGURATION :
Running Windows 7 64bit, Installed Java JDK and JRE (32bit and 64bit),
using 64bit Java for compiler task, using opensource build tool Gradle version 2.14.1 to build and run applications
A DESCRIPTION OF THE PROBLEM :
The exception is raised while creating the javadoc for our project. We (my company and I) are developing database applications based on Java. We are using Frameworks like Spring, Spring Boot, JDOM2, Apache Camel and Jetty.
Running the javadoc executable as standalone with any Gradle taks it does NOT work either.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Call this with the class source code send with this report:
"C:\Program Files\Java\jdk1.8.0_91\bin\javadoc.exe" U:\WIB\git\xscore\core\src\main\java\com\din\xscore\core\domain\filter\builder\TreeFilterBuilder.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The excepted result is a complete java API documentation of our application classes.
ACTUAL -
No result. The process crashes.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$TypeVariableSymbol cannot be cast to com.sun.tools.javac.code.Symbol$ClassSymbol
at com.sun.tools.javac.api.JavacTrees.attributeDocReference(JavacTrees.java:410)
at com.sun.tools.javac.api.JavacTrees.getElement(JavacTrees.java:345)
at com.sun.tools.doclint.Checker.visitReference(Checker.java:756)
at com.sun.tools.doclint.Checker.visitReference(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCReference.accept(DCTree.java:523)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:65)
at com.sun.source.util.DocTreeScanner.visitLink(DocTreeScanner.java:177)
at com.sun.tools.doclint.Checker.visitLink(Checker.java:684)
at com.sun.tools.doclint.Checker.visitLink(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCLink.accept(DCTree.java:422)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:65)
at com.sun.source.util.DocTreeScanner.scanAndReduce(DocTreeScanner.java:81)
at com.sun.source.util.DocTreeScanner.scan(DocTreeScanner.java:92)
at com.sun.source.util.DocTreeScanner.scanAndReduce(DocTreeScanner.java:100)
at com.sun.source.util.DocTreeScanner.visitDocComment(DocTreeScanner.java:140)
at com.sun.tools.doclint.Checker.visitDocComment(Checker.java:217)
at com.sun.tools.doclint.Checker.visitDocComment(Checker.java:95)
at com.sun.tools.javac.tree.DCTree$DCDocComment.accept(DCTree.java:122)
at com.sun.source.util.DocTreePathScanner.scan(DocTreePathScanner.java:47)
at com.sun.tools.doclint.Checker.scan(Checker.java:179)
at com.sun.tools.doclint.DocLint.scan(DocLint.java:319)
at com.sun.tools.javadoc.DocImpl.comment(DocImpl.java:133)
at com.sun.tools.javadoc.DocImpl.tags(DocImpl.java:154)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.checkOnPropertiesTags(VisibleMemberMap.java:686)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.getClassMembers(VisibleMemberMap.java:464)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.addMembers(VisibleMemberMap.java:372)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.mapClass(VisibleMemberMap.java:346)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.mapClass(VisibleMemberMap.java:358)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.build(VisibleMemberMap.java:341)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap$ClassMembers.access$100(VisibleMemberMap.java:291)
at com.sun.tools.doclets.internal.toolkit.util.VisibleMemberMap.<init>(VisibleMemberMap.java:127)
at com.sun.tools.doclets.internal.toolkit.builders.MemberSummaryBuilder.<init>(MemberSummaryBuilder.java:82)
at com.sun.tools.doclets.internal.toolkit.builders.MemberSummaryBuilder.getInstance(MemberSummaryBuilder.java:101)
at com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory.getMemberSummaryBuilder(BuilderFactory.java:278)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.getNavSummaryLinks(ClassWriterImpl.java:641)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.addSummaryDetailLinks(ClassWriterImpl.java:622)
at com.sun.tools.doclets.formats.html.HtmlDocletWriter.addNavLinks(HtmlDocletWriter.java:560)
at com.sun.tools.doclets.formats.html.ClassWriterImpl.getHeader(ClassWriterImpl.java:165)
at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildClassDoc(ClassBuilder.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.invokeMethod(AbstractBuilder.java:180)
at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:135)
at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.build(ClassBuilder.java:120)
at com.sun.tools.doclets.formats.html.HtmlDoclet.generateClassFiles(HtmlDoclet.java:189)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:205)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:189)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:137)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:82)
at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:80)
at com.sun.tools.doclets.standard.Standard.start(Standard.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
1 error
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:310)
at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:189)
at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:366)
at com.sun.tools.javadoc.Start.begin(Start.java:219)
at com.sun.tools.javadoc.Start.begin(Start.java:205)
at com.sun.tools.javadoc.Main.execute(Main.java:64)
at com.sun.tools.javadoc.Main.main(Main.java:54)
javadoc: error - java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$TypeVariableSymbol cannot be cast to com.sun.tools.javac.code.Symbol$ClassSymbol
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package com.din.xscore.core.domain.filter.builder;
import com.din.xscore.core.domain.filter.TreeFilter;
import com.din.xscore.core.repository.FilterRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* This abstract class defines filter builder working only with {@link TreeFilter}.
*
* <p>Any implementation of this class are <b>not</b> thread-safe! However the build process
* could be synchronized externally to support multiple threads or the filter builder instance could be reuse
* by a single thread by calling the build method again (resets all cached data).</p>
*
* @author WIB
* @version 1.0
* @since 2016-08-08
*/
public abstract class TreeFilterBuilder<F extends TreeFilter, T> implements FilterBuilder<F, T>
{
protected final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* The filter repository.
*/
protected final FilterRepository<F> repository;
/**
* A cache, used while build process.
*/
private final Map<String, F> cache;
/**
* All constructed tree root filter.
*/
private final Map<String, F> roots;
/**
* All incoming filter expressions ("leafs" of the in-memory tree).
*/
private final Map<String, F> leafs;
/**
* Constructor.
*
* <p>This constructor will create internal caches with the following initial sizes:
* <ul>
* <li>Roots: 5</li>
* <li>Cache: 20</li>
* <li>Leafs: 10</li>
* </ul>
* </p>
*
* @param repository filter repository instance supporting {@link TreeFilter}
*/
protected TreeFilterBuilder(FilterRepository<F> repository)
{
this.repository = repository;
this.roots = new HashMap<>(5);
this.cache = new HashMap<>(20);
this.leafs = new HashMap<>(10);
}
@Override
@SuppressWarnings ("unchecked")
public Collection<F> build(Map<String, T> source)
{
// clear caches
leafs.clear();
roots.clear();
cache.clear();
// read configuration one by one
for(String key : source.keySet())
{
// get filter if known
F leaf = this.repository.get(key);
if(leaf!=null)
{
// clone filter (to reuse filter instance)
leaf = (F) leaf.clone();
configureFilter(leaf, source.get(key));
log.debug("{}: {}", leaf.getName(), leaf.getDefinition());
this.leafs.put(leaf.getName(), leaf);
}
}
// build up in-memory tree
walkTree(this.leafs);
// return all constructed root filter
return this.roots.values();
}
/**
* Walks up the in-memory filter tree processing (clone and build) all filters per tree level recursively.
*
* @param filters tree level as filter map
*/
private void walkTree(Map<String, F> filters)
{
Map<String, F> treeLevel = new HashMap<>();
// walk over every filter on this level
for(String key : filters.keySet())
{
// get the filter
F filter = filters.get(key);
// if root move to roots
if(filter.isRoot())
this.roots.putIfAbsent(filter.getName(), filter);
else {
// otherwise process and get parent
F parent = prepareParent(filter);
//log.debug("walkTree: "+parent.definition());
// add to next tree level
treeLevel.put(parent.getName(), parent);
}
}
// proceed to next level (if no more leafs left stop)
if(treeLevel.size()>0)
walkTree(treeLevel);
}
/**
* Configures the given filter instance with the given configuration.
*
* <p>This method should call {@link F#build()}.</p>
*
* @param filter filter instance
* @param config configuration instance
*
* @see #build(Map)
*/
protected abstract void configureFilter(F filter, T config);
/**
* Prepares the parent tree filter of the given filter for processing.
*
* <p>"Preparation" means any operation(s) to retrieve the parent from
* the child filter (could include cloning, building, setting parameters).</p>
*
* @param filter filter instance
*
* @return prepared parent filter
*/
protected abstract F prepareParent(F filter);
/**
* Returns a flag indicating if the filter with the given name is cached already.
*
* @param name unique name of a filter, filter key
*
* @return <code>true</code>, if the filter with the given name is cached, <code>false</code> otherwise
*/
protected boolean isCached(String name)
{
return this.cache.containsKey(name);
}
/**
* Caches a filter instance.
*
* @param filter filter to cache
*/
protected void cache(F filter)
{
this.cache.put(filter.getName(), filter);
}
/**
* Retrieves a cached filter instance.
*
* @param name unique name of a filter, filter key
*
* @return cached filter instance, or <code>null</code> if there is no cached filter with that name
*/
protected F cache(String name)
{
return this.cache.get(name);
}
}
---------- END SOURCE ----------
- backported by
-
JDK-8175706 JavacTrees should use Types.skipTypeVars() to get the upper bound of type variables
-
- Resolved
-