Well, I'm ok if you want to reopen it and do something with it, but I
don't want to leave people with false hope.

I guess I can see why it might be helpful in some cases where a
non-technical user may not understand the need for case-sensitivity.

On Tue, Jun 2, 2015 at 11:38 PM, Sergiu Dumitriu (JIRA) <j...@apache.org> wrote:
>
>     [ 
> https://issues.apache.org/jira/browse/VELOCITY-818?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14570219#comment-14570219
>  ]
>
> Sergiu Dumitriu commented on VELOCITY-818:
> ------------------------------------------
>
> I agree that it doesn't make sense as a default language feature, but this 
> could be an optional uberspector that could be enabled in the configuration.
>
>> Case-insensitive matching ${object.methodName} == ${object.methodname} == 
>> ${object.methodName}
>> ----------------------------------------------------------------------------------------------
>>
>>                 Key: VELOCITY-818
>>                 URL: https://issues.apache.org/jira/browse/VELOCITY-818
>>             Project: Velocity
>>          Issue Type: New Feature
>>          Components: Engine
>>    Affects Versions: 1.7
>>            Reporter: Mark S
>>              Labels: api-change
>>   Original Estimate: 4h
>>  Remaining Estimate: 4h
>>
>> I thought I would share the following code with the Apache Velocity 
>> community.
>> Currently there is no easy way for Velocity to do a case-insensitive match 
>> on a property or method.  Below is my implementation to achieve this.
>> VelocityContext velocityContext = new VelocityContext();
>> {
>>     context.put( "aNumericValue", "1234567890" );
>> }
>> | If String template =                 | Then String evaluatedTemplate =  |
>> | ${aNumericValue}                     | 1234567890                       |
>> | ${anumericvalue}                     | 1234567890                       |
>> | ${anumericValue}                     | 1234567890                       |
>> | ${aNumericvalue}                     | 1234567890                       |
>> | ${aNumericValue.toString()}          | 1234567890                       |
>> | ${anumericvalue.tostring()}          | 1234567890                       |
>> -- Setup Snippet --
>> Properties p = new Properties();
>> p.setProperty( RuntimeConstants.INPUT_ENCODING, DEFAULT_ENCODING );
>> p.setProperty( RuntimeConstants.OUTPUT_ENCODING, DEFAULT_ENCODING );
>> p.setProperty( RuntimeConstants.UBERSPECT_CLASSNAME,
>>                "custom.CustomSecureUberspector" ); //$NON-NLS-1$
>>
>> VelocityEngine engine = new VelocityEngine( p );
>> engine.init();
>> RuntimeInstance ri = new RuntimeInstance();
>> ri.init( p );
>> uberspector = (CustomSecureUberspector)ri.getUberspect();
>> -- Setup Snippet --
>> -- Call Snippet --
>> VelocityContext velocityContext = new VelocityContext();
>> {
>>     context.put( "aNumericValue", "1234567890" );
>> }
>> EventCartridge eventCartridge = new EventCartridge();
>> eventCartridge.addEventHandler( new SloppyNameReferenceEventHandler( 
>> uberspector ) );
>> eventCartridge.addEventHandler( new 
>> NullValueReferenceInsertionEventHandler() );
>> eventCartridge.attachToContext( velocityContext );
>> String template = "${aNumericvalue}";
>> StringWriter velocityWriter = new StringWriter();
>> velocityEngine.evaluate( velocityContext, velocityWriter, "LOG", template );
>> String evaluatedTemplate = velocityWriter.toString();
>> -- Call Snippet --
>> -- Supporting Classes Snippet --
>> package custom;
>> import org.apache.velocity.util.introspection.SecureIntrospectorImpl;
>> import org.apache.velocity.util.introspection.SecureUberspector;
>> public class CustomSecureUberspector extends SecureUberspector
>> {
>>     public SecureIntrospectorImpl getSecureIntrospector()
>>     {
>>         return (SecureIntrospectorImpl)introspector;
>>     }
>> }
>> package custom;
>> import java.lang.reflect.Method;
>> import java.util.ArrayList;
>> import java.util.List;
>> import org.apache.velocity.app.event.InvalidReferenceEventHandler;
>> import org.apache.velocity.context.Context;
>> import org.apache.velocity.util.introspection.Info;
>> import org.apache.velocity.util.introspection.SecureIntrospectorImpl;
>> import custom.CustomSecureUberspector;
>> @SuppressWarnings( { "unused" } )
>> public class SloppyNameReferenceEventHandler implements 
>> InvalidReferenceEventHandler
>> {
>>     protected CustomSecureUberspector uberspector;
>>     public SloppyNameReferenceEventHandler( CustomSecureUberspector 
>> uberspector )
>>     {
>>         this.uberspector = uberspector;
>>     }
>>     @Override
>>     public Object invalidGetMethod( Context context, String reference, 
>> Object object, String property, Info info )
>>     {
>>         try
>>         {
>>             return callMethod( object, property );
>>         }
>>         catch ( Exception e )
>>         {
>>             return null;
>>         }
>>     }
>>     @Override
>>     public boolean invalidSetMethod( Context context, String leftReference, 
>> String rightReference, Info info )
>>     {
>>         // Do nothing
>>         return false;
>>     }
>>     @Override
>>     public Object invalidMethod( Context context, String reference, Object 
>> object, String method, Info info )
>>     {
>>         try
>>         {
>>             return callMethod( object, method );
>>         }
>>         catch ( Exception e )
>>         {
>>             return null;
>>         }
>>     }
>>     protected Object callMethod( Object object, String method )
>>         throws Exception
>>     {
>>         if ( null == object || null == method )
>>         {
>>             return null;
>>         }
>>         List<String> possibleMethodMatches = 
>> findCaseInsensitiveMethodsForObject( object, method, "get" + method ); 
>> //$NON-NLS-1$
>>         SecureIntrospectorImpl secureIntrospectorImpl = 
>> uberspector.getSecureIntrospector();
>>         for ( String possibleMethodMatch : possibleMethodMatches )
>>         {
>>             if ( secureIntrospectorImpl.checkObjectExecutePermission( 
>> object.getClass(), possibleMethodMatch ) )
>>             {
>>                 Method[] objectMethods = object.getClass().getMethods();
>>                 for ( int i = 0; i < objectMethods.length; i++ )
>>                 {
>>                     if ( possibleMethodMatch.equals( 
>> objectMethods[i].getName() ) )
>>                     {
>>                         return objectMethods[i].invoke( object );
>>                     }
>>                 }
>>             }
>>         }
>>         return null;
>>     }
>>     @SuppressWarnings( "static-method" )
>>     protected List<String> findCaseInsensitiveMethodsForObject( Object 
>> object, String ... methodNames )
>>     {
>>         List<String> methodMatches = new ArrayList<String>();
>>         Method[] methods = object.getClass().getMethods();
>>         for ( int i = 0; i < methods.length; i++ )
>>         {
>>             String objectMethodName = methods[i].getName();
>>             String objectMethodNameInLowerCase = 
>> objectMethodName.toLowerCase();
>>             for ( int j = 0; j < methodNames.length; j++ )
>>             {
>>                 if ( objectMethodNameInLowerCase.equals( 
>> methodNames[j].toLowerCase() ) )
>>                 {
>>                     methodMatches.add( objectMethodName );
>>                 }
>>             }
>>         }
>>         return methodMatches;
>>     }
>> }
>>
>> package custom;
>> import org.apache.velocity.app.event.ReferenceInsertionEventHandler;
>> public class NullValueReferenceInsertionEventHandler implements 
>> ReferenceInsertionEventHandler
>> {
>>     @Override
>>     public Object referenceInsert( String reference, Object value )
>>     {
>>         if ( null == value )
>>         {
>>         return String.valueOf( reference );
>>         }
>>         return value;
>>     }
>> }
>> -- Supporting Classes Snippet --
>
>
>
> --
> This message was sent by Atlassian JIRA
> (v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@velocity.apache.org
For additional commands, e-mail: dev-h...@velocity.apache.org

Reply via email to