[ 
https://issues.apache.org/jira/browse/FREEMARKER-120?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17024731#comment-17024731
 ] 

Christoph Rueger commented on FREEMARKER-120:
---------------------------------------------

Yes, it works. Now we can monitor method calls and use the data to e.g. 
maintain a Whitelist.
Sorry forgot to respond here or mailing list. 

> Hook to collect which members are accessed on runtime
> -----------------------------------------------------
>
>                 Key: FREEMARKER-120
>                 URL: https://issues.apache.org/jira/browse/FREEMARKER-120
>             Project: Apache Freemarker
>          Issue Type: Improvement
>          Components: engine
>    Affects Versions: 2.3.29
>            Reporter: Christoph Rueger
>            Priority: Trivial
>             Fix For: 2.3.30
>
>
> h2. Problem description
> We would like to collect metrics which counts which Objects and methods are 
> called by templates.
>   
> h2. Why?
> We have lots of FM-templates which are provided by users (not developers). 
> Collecting metrics about method invocations would allow us to track what 
> users are doing in templates, find out about about which methods are used how 
> often (e.g. to determine potential for performance optimizations or detect 
> unused methods (potential dead code)). Furthermore it allows to detect 
> malicious usage (e.g. attempts to call "dangerous" methods on objects which 
> were are accessible in templates etc.).
> h3. Example of possible metrics output
>  
> {code:java}
> com.company.MyClass#getA()=1 
> com.company.MyClass#getB(String)=567 
> com.company.Otherclass#getA(String, String)=134  {code}
>  
>  etc. 
>  For example Hibernate has a similar in-built mechanism which collects 
> metrics.([https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/stat/Statistics.html])
> This is a bit too much for freemarker to have this built-in, that's why a 
> hook would be enough.
>    
>   
> h3.  Suggestion
> It would be great if we e.g. could just override a method / hook in a Custom 
> ObjectWrapper.
> {code:java}
> Could be specified in BeansWrapper.java and called from 
> freemarker.ext.beans.BeansWrapper.invokeMethod(Object, Method, Object[]) just 
> before the actual method invocation.
> /**
>      * This hook can be used by subclasses
>      * e.g. for statistics about method invokation
>      * (which methods get called on which objects how often).
>      * 
>      * @param object
>      * @param method
>      * @param args
>      */
>     protected void logMethodInvocation(Object object, Method method, Object[] 
> args) {
>         // TODO Auto-generated method stub
> }
> {code}
> See example 
> [https://github.com/chrisrueger/freemarker/commit/804b3d99188e1dbb00fd03f8fe120515b17bbbca]
>  
> *Possible example* *implementation which uses this hook to collect metrics*
> {code:java}
> public class MyObjectWrapper extends SimpleObjectWrapper{
>       
>       private AtomicLongMap<String> methodStats = AtomicLongMap.create();
>       public MyObjectWrapper(Version version) {
>               super(version);
>       @Override
>       protected void logMethodInvocation(Object object, Method method, 
> Object[] args) {
>               
> methodStats.incrementAndGet(object.getClass().getName()+"#"+method.getName());
>       }
> }{code}
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to