Unless you're talking about your method declaration *def mapToList()*. In 
that case, the def is just window dressing AFAIK. The return type is the 
same with or without *def*: ie, *Object*.

On Wednesday, April 27, 2016 at 3:34:24 PM UTC-7, Brian Ray wrote:
>
> Nice hackaround. I will try that in the uncooperative parts of my script.
>
> Ah yes, *def x* vs *x*. On the face of it the two declarations should be 
> identical--roughly typing *x* as an *Object*. But there are different 
> scoping implications 
> <http://stackoverflow.com/questions/15619216/groovy-scope-how-to-access-script-variable-in-a-method>
>  
> for each.
>
> On Wednesday, April 27, 2016 at 3:00:43 PM UTC-7, Norbert Lange wrote:
>>
>> Hi Brian,
>>
>> every single method in the "final foo...." - including the String 
>> Constructor requires approval. I was hoping for a proper subset that would 
>> work within the sandbox.
>> What I ended with (several dozen "Builds" later ) is using a helper 
>> function squeezing the map into a list, seems the most sane aproach so far 
>> =(
>>
>> Btw, whats the difference of using "def x" vs "x"?
>>
>> node {
>>     ....
>>     for (it2 in mapToList(depmap)) {
>>         name = it2[0]
>>         revision = it2[1]
>>     }
>> }
>> @NonCPS
>> def mapToList(depmap) {
>>     def dlist = []
>>     for (entry in depmap) {
>>         dlist.add([entry.key, entry.value])
>>     }
>>     dlist
>> }
>>
>>
>>
>>
>> Am Mittwoch, 27. April 2016 18:26:51 UTC+2 schrieb Brian Ray:
>>>
>>> FWIW I recently replaced several C-style loops with *for ( x in y )* 
>>> for iterating over both lists and maps in CPS code and for the most part 
>>> conversion went fine. There were a couple of CPS sections where I could not 
>>> use that construct and had to fall back on the C-loops and further do a 
>>> torturous cast to avoid a serialization error getting keys and values from 
>>> the map. I want to say *Set<Map.Entry<K,V>>* caused the exception 
>>> because *AbstractMap.SimpleEntry* and *.SimpleImmutableEntry* are 
>>> serializable, while *Set *is not, per the JDK.
>>>
>>> for ( int i = 0; i < myMap.size(); i++ ) {
>>>   
>>>   // hacktacular String() cloning to avoid NotSerializableException; 
>>> also 
>>>   // hacktacular Map > Set > Array morph to enable C-style looping
>>>   final foo = new String( myMap.entrySet().toArray()[i].value )
>>>
>>>   // do stuff with foo...
>>>
>>> }
>>>
>>>
>>> Nonetheless as mentioned in another part of the script I had no problem 
>>> using the shorter alternative, nor accessing keys and values using 
>>> *myMap.key* and *myMap.value*. Not sure what the difference is with my 
>>> more stubborn loop.
>>>
>>> On Wednesday, April 27, 2016 at 8:21:45 AM UTC-7, Norbert Lange wrote:
>>>>
>>>>
>>>>
>>>> Am Mittwoch, 27. April 2016 16:41:40 UTC+2 schrieb Jesse Glick:
>>>>>
>>>>> On Tuesday, April 26, 2016 at 7:18:55 PM UTC-4, Norbert Lange wrote:
>>>>>>
>>>>>> There seem to be some arcane rules on how to iterate over some 
>>>>>> builtin Groovy/Java Types within a sandbox. I haven`t found a way 
>>>>>> that 
>>>>>> works without manually allowing the function.
>>>>>
>>>>>
>>>>> Which methods did you need to approve? We can easily add them to the 
>>>>> default whitelist in the Script Security plugin. But anyway
>>>>>
>>>>> The map`s each (at least)
>>>>  
>>>>
>>>>>
>>>>>> 2) Serialization issues for iterators. 
>>>>>>
>>>>>
>>>>> `for (x : list) {…}` works as of `workflow-cps` 2.x. Other iterators 
>>>>> do not yet work (outside a `@NonCPS` method). Probably fixing them is not 
>>>>> hard, just have not gotten to it yet
>>>>>
>>>>
>>>> Yes, these issues I can very likely work around. For someone who is new 
>>>> to Groovy and Jenkins sandboxing, a list of preferred methods would be 
>>>> very 
>>>> welcome (the examples from the workflow libs are rather simple). There are 
>>>> atleast 3 different ways to iterate over containers, and several 
>>>> variations 
>>>> of those for maps.
>>>>  
>>>>
>>>>>  
>>>>>
>>>>>>
>>>>>> take the createDList 
>>>>>> which seems to execute the code differently (throws errrors, need to 
>>>>>> define a explicit variable)
>>>>>>
>>>>>
>>>>> Not sure what this is about. If you find something you think should 
>>>>> work which does not work in a minimal reproducible script, please file a 
>>>>> bug report for it.
>>>>>
>>>> Where? Is that a feature-not-bug of Groovy, an issue in Jenkins or some 
>>>> Plugin? I was hoping for some feedback as I am not proficient in either of 
>>>> those to pinpoint issues.
>>>> The code above should be able to explain the issue, the exact same 
>>>> method body in the node scope works fine, the call will result in some 
>>>> message about "it not defined". Similary there seems some issues with name 
>>>> clashes (if variables in functions are named like those in the node 
>>>> scope), 
>>>> but it mightve been some flukes during trial-and-error
>>>>  
>>>>
>>>>>  
>>>>>
>>>>>>
>>>>>> Are variables from Closures global?
>>>>>>
>>>>>
>>>>> Local `def` variables in a closure? Not sure what you are referring to 
>>>>> here.
>>>>>
>>>> See last point, and the code were I can access the it variable after 
>>>> the closure were its used (Noted with "// Weird !" )
>>>>
>>>>>
>>>>> The main problem you are presumably hitting is the well-known 
>>>>> JENKINS-26481 <https://issues.jenkins-ci.org/browse/JENKINS-26481>. 
>>>>> We are working on a fix, but in the meantime, do not use any method built 
>>>>> into Groovy which takes a closure argument, such as `list.each {x -> …}` 
>>>>> or 
>>>>> `someText.eachLine {line -> …}`. Rather use a Java-style loop. (To be on 
>>>>> the safe side, also avoid iterators, meaning use a C- or JDK 1.4-style 
>>>>> loop 
>>>>> with an index.)
>>>>>
>>>> Could you please post me the preferable code for iterating a map in 
>>>> this way? (Not sure I fully understand the bug )
>>>>
>>>>
>>>>> Incidentally `it` does not currently work in closures as noted in 
>>>>> JENKINS-33468 
>>>>> <https://www.google.com/url?q=https%3A%2F%2Fissues.jenkins-ci.org%2Fbrowse%2FJENKINS-33468&sa=D&sntz=1&usg=AFQjCNHCpckU-LtRXqq1a2tEPCzNrYhPTw>;
>>>>>  
>>>>> use an explicit parameter name instead.
>>>>>
>>>> That seems to be one of the issues I am fighting with, and might be 
>>>> that the supposed name-clashes came from unfocused variations of the code. 
>>>> Strangely it does seem to somewhat work in the node body?
>>>>  
>>>> Kind Regards, 
>>>> Norbert 
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/dd4180c3-14ad-4b7e-9cf4-c1fbd029d4d8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to