Lukasz Lenart created WW-5827:
---------------------------------

             Summary: Tiles plugin: check the preparer type before 
instantiating it and do not cache failed preparer lookups
                 Key: WW-5827
                 URL: https://issues.apache.org/jira/browse/WW-5827
             Project: Struts 2
          Issue Type: Improvement
          Components: Plugin - Tiles
            Reporter: Lukasz Lenart


Two issues in how the Tiles plugin resolves view preparers.

*ClassUtil instantiates before checking the type*

{{ClassUtil.getClass(String, Class)}} loads the class with 
{{Class.forName(className, true, classLoader)}}, so static initialisation runs 
on lookup. {{ClassUtil.instantiate(String, boolean)}} passes {{Object.class}} 
as the base type and calls {{newInstance()}}; the {{ViewPreparer}} check 
happens only afterwards, as a cast in {{BasicPreparerFactory.createPreparer}}. 
A configured preparer name that is not a {{ViewPreparer}} is therefore loaded, 
initialised and constructed before it is rejected.

Expected: resolve the class without initialising it, apply the expected base 
type ({{ViewPreparer}}) before instantiation, and fail without constructing 
anything when it does not match.

*BasicPreparerFactory caches failed lookups in a non-thread-safe map*

{{BasicPreparerFactory.getPreparer}} stores the result of {{createPreparer}} in 
a plain {{HashMap}}, including the {{null}} returned when the class cannot be 
found. A failed lookup stays cached for the lifetime of the factory, and the 
map is read and written concurrently by request threads.

Expected: do not cache failed lookups, and use a thread-safe map (e.g. 
{{ConcurrentHashMap}}).



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to