Indeed it is powerful.  This is for an integration for monitoring and
management platform designed expressly for this purpose. You can already
enter that code into a form field which lets you enter any arbitrary
script. THis is just for a form field which is for properties.

Gerald R. Wiltse
jerrywil...@gmail.com


On Wed, Apr 20, 2016 at 4:13 AM, Alessio Stalla <alessiosta...@gmail.com>
wrote:

> If those strings come from the outside, then using eval on them is a
> no-no. Consider what happens if your input string is "${System.exit(1)}" or
> "${Shell.run('rm -rf /')}". Only use eval on sanitized input and only if
> there is no simpler way.
>
> On 20 April 2016 at 09:32, Guillaume Laforge <glafo...@gmail.com> wrote:
>
>> Eval.x(v) should just work as well.
>>
>> Regarding resources / performance, it means spinning the parser and
>> compiler, so it's not for free. Doing your own string parsing logic might
>> be more efficient.
>> Depends on how frequently you have to do that.
>> Le 20 avr. 2016 07:57, "Gerald Wiltse" <jerrywil...@gmail.com> a écrit :
>>
>>> Wow, i just wrote that exact code basically... and started responding to
>>> your email, but there were various drawbacks to this approach as I don't
>>> want to have to define handling of every property by name...  Then... it
>>> hit me...
>>>
>>> def v = '1..10'
>>> assert new GroovyShell().parse(v).run() == [1,2,3,4,5]
>>>
>>> It works!!!
>>>
>>> Something about the Eval works just a little bit differently than
>>> GroovyShell i guess.  Perhaps Dierk  can explain.
>>>
>>> Last question, how expensive is this invocation of groovyshell and parse
>>> and all that (resources wise)?  So-so?
>>>
>>>
>>> Gerald R. Wiltse
>>> jerrywil...@gmail.com
>>>
>>>
>>> On Wed, Apr 20, 2016 at 1:48 AM, Guillaume Laforge <glafo...@gmail.com>
>>> wrote:
>>>
>>>> If you know it's a range when parsing that string, you can do this,
>>>> with the toInteger() method:
>>>>
>>>>    def rangeString = "123..455"
>>>>    def (String min, String max) = rangeString.tokenize("..")
>>>>    def range = min.toInteger()..max.toInteger()
>>>>
>>>> On Wed, Apr 20, 2016 at 7:26 AM, Gerald Wiltse <jerrywil...@gmail.com>
>>>> wrote:
>>>>
>>>>> I don't see how that works in my case, maybe i'm missing something.
>>>>>
>>>>> I will clarify:
>>>>>
>>>>> I define a variable in web to represent the range:   14502..14520
>>>>>
>>>>> The web converts this to a string, and passes it into my code.
>>>>>
>>>>> My code then has to receive this string, and then construct a list
>>>>> from it.
>>>>>
>>>>> I could do:
>>>>>
>>>>> String rangeString = passedInVar
>>>>> (String min, String max) = rangeString.tokenize("..")
>>>>> Range range = min..max
>>>>>
>>>>> But i was hoping for a universal "caster" loop which can detect and
>>>>> cast the common types from strings:
>>>>> Integers, lists, ranges, maps, booleans..
>>>>>
>>>>> 12345
>>>>> ["this", "is", "Sample", "List"]
>>>>> 14502..14520
>>>>> ["key":"value","for":"maps"]
>>>>> true
>>>>>
>>>>> I think eval works for all but ranges.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Gerald R. Wiltse
>>>>> jerrywil...@gmail.com
>>>>>
>>>>>
>>>>> On Wed, Apr 20, 2016 at 1:15 AM, Guillaume Laforge <glafo...@gmail.com
>>>>> > wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> You can just replace the bounds with variables.
>>>>>>
>>>>>> def a = 1
>>>>>> def b = 10
>>>>>> def r = a..b
>>>>>>
>>>>>> Isn't that what you're looking for?
>>>>>>
>>>>>> Guillaume
>>>>>>
>>>>>>
>>>>>> Le mercredi 20 avril 2016, Gerald Wiltse <jerrywil...@gmail.com> a
>>>>>> écrit :
>>>>>>
>>>>>>> I can find no examples of different ways to create a range.  There's
>>>>>>> a plethora of examples on what you can do when you start by creating a
>>>>>>> range like so:  "1..10"
>>>>>>>
>>>>>>> But, how does one create a range when the min and max values are
>>>>>>> stored in variables?  There's no range constructor.  I see that it's a 
>>>>>>> form
>>>>>>> of a list, but I see no helper methods for dynamically creating ranges
>>>>>>> given a min and max value.
>>>>>>>
>>>>>>> I even tried to get really fancy, but this evaluates to a string.
>>>>>>>
>>>>>>> def v = "10..15"
>>>>>>> assert Eval.x(v, "return x")​.getClass()​.name ==
>>>>>>> "​​​​​​​​​​​java.lang.String"​
>>>>>>>
>>>>>>> My use case is this.  I populate a bunch of form fields with
>>>>>>> variable definitions... but they all get passed to my code as strings. 
>>>>>>> But
>>>>>>> I want to pass port ranges and lists and maps. So, the Eval() method is
>>>>>>> exactly what I needed.. it just isn't working for ranges.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Jerry
>>>>>>>
>>>>>>>
>>>>>>> Gerald R. Wiltse
>>>>>>> jerrywil...@gmail.com
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Guillaume Laforge
>>>>>> Apache Groovy committer & PMC Vice-President
>>>>>> Product Ninja & Advocate at Restlet <http://restlet.com>
>>>>>>
>>>>>> Blog: http://glaforge.appspot.com/
>>>>>> Social: @glaforge <http://twitter.com/glaforge> / Google+
>>>>>> <https://plus.google.com/u/0/114130972232398734985/posts>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Guillaume Laforge
>>>> Apache Groovy committer & PMC Vice-President
>>>> Product Ninja & Advocate at Restlet <http://restlet.com>
>>>>
>>>> Blog: http://glaforge.appspot.com/
>>>> Social: @glaforge <http://twitter.com/glaforge> / Google+
>>>> <https://plus.google.com/u/0/114130972232398734985/posts>
>>>>
>>>
>>>
>

Reply via email to