Your browser was unable to load all of the resources. They may have been blocked by your firewall, proxy or browser configuration.
Press Ctrl+F5 or Ctrl+Shift+R to have your browser try again.

Repeat Parameters of map keys #2535

nmanos ·
Hi,
I want to iterate a step using Repeat Parameters of map keys.
This map has keys:values of structure { CL_number : Usernmae } and I saved it inside QB variable in an earlier step.

Then I tried to set the iterator values using:

${groovy:
import com.pmease.quickbuild.variable.Variable;
mapCLsUsers = vars.get("mapCLsUsers").list2map();
return mapCLsUsers.keySet();
}

or using:

${groovy:
def mapCLsUsers = evaluate(vars.getValue("mapCLsUsers"));
return mapCLsUsers.keySet();
}


but none works. Any suggestion how to do it ?

Thanks!
Noam.
  • replies 10
  • views 4053
  • stars 0
robinshen ADMIN ·
Use below script to see if it works. If not, please let me know an exmple of value of variable "mapCLsUsers".
${groovy:
def mapCLsUsers = evaluate(vars.getValue("mapCLsUsers"));
return mapCLsUsers.keySet().join(",");
}
nmanos ·
mapCLsUsers variable example:
[300588:fname1.lname1, 300579:fname2.lname2, 300560:fname3.lname3, 300556:fname4.lname4]


But evaluate "thinks" it's an Object.property fname.lname, instead of taking it as a simple String[]:
ERROR - Step 'master' is failed: java.lang.NullPointerException: Cannot get property 'lname1' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:56)


Should I encapsulate the keys and values with quotes, before evaluating ?
nmanos ·
After enclosing the values during the creation of the mapCLsUsers with quotes
{ CLnumber:"fname.lname" ... }

I found that the evaluate() works.
However, there's seems to be a bug in the repeat parameters - when setting repeat parameters in a sequential step:
${groovy:
def mapCLsUsers = evaluate(vars.getValue("mapCLsUsers"));
return mapCLsUsers.keySet().join(",");
}


If the variable value is empty (null) before build starts - even that this variable is initialized with a value in a step before the sequential step - master step fails with NullPointerException:

22:08:34,133 INFO - Executing pre-execute action...
22:08:34,133 INFO - Running step...
22:08:34,478 INFO - Executing post-execute action...
22:08:34,478 ERROR - Step 'master' is failed: java.lang.NullPointerException
at groovy.lang.GroovyCodeSource.<init>(GroovyCodeSource.java:125)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:627)
at groovy.lang.Script.evaluate(Script.java:219)
at groovy.lang.Script$evaluate.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
at script1381262914176664879425.run(script1381262914176664879425.groovy:2)
at com.pmease.quickbuild.plugin.basis.BasisPlugin$25.evaluate(BasisPlugin.java:322)
at com.pmease.quickbuild.DefaultScriptEngine.evaluate(DefaultScriptEngine.java:80)
at com.pmease.quickbuild.DefaultScriptEngine.interpolate(DefaultScriptEngine.java:104)
at com.pmease.quickbuild.DefaultScriptEngine$Interpolator.intercept(DefaultScriptEngine.java:277)
at com.pmease.quickbuild.setting.step.repetition.SpecifiedValues$$EnhancerByCGLIB$$94656680.getValues(<generated>)
at com.pmease.quickbuild.setting.step.repetition.SpecifiedValues.get(SpecifiedValues.java:36)
at com.pmease.quickbuild.setting.step.repetition.SpecifiedValues$$EnhancerByCGLIB$$94656680.CGLIB$get$0(<generated>)
at com.pmease.quickbuild.setting.step.repetition.SpecifiedValues$$EnhancerByCGLIB$$94656680$$FastClassByCGLIB$$fc27a756.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.pmease.quickbuild.DefaultScriptEngine$Interpolator.intercept(DefaultScriptEngine.java:269)
at com.pmease.quickbuild.setting.step.repetition.SpecifiedValues$$EnhancerByCGLIB$$94656680.get(<generated>)
at com.pmease.quickbuild.stepsupport.CompositeStep.findChildren(CompositeStep.java:155)
at com.pmease.quickbuild.stepsupport.SequentialStep$$EnhancerByCGLIB$$f6517159.CGLIB$findChildren$4(<generated>)
at com.pmease.quickbuild.stepsupport.SequentialStep$$EnhancerByCGLIB$$f6517159$$FastClassByCGLIB$$458a6f03.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.pmease.quickbuild.DefaultScriptEngine$Interpolator.intercept(DefaultScriptEngine.java:269)
at com.pmease.quickbuild.stepsupport.SequentialStep$$EnhancerByCGLIB$$f6517159.findChildren(<generated>)
at com.pmease.quickbuild.stepsupport.SequentialStep.triggerChildren(SequentialStep.java:31)
at com.pmease.quickbuild.stepsupport.CompositeStep.run(CompositeStep.java:97)
at com.pmease.quickbuild.stepsupport.Step.execute(Step.java:501)
at com.pmease.quickbuild.stepsupport.StepExecutionJob.executeStepAwareJob(StepExecutionJob.java:30)
at com.pmease.quickbuild.stepsupport.StepAwareJob.executeBuildAwareJob(StepAwareJob.java:47)
at com.pmease.quickbuild.BuildAwareJob.execute(BuildAwareJob.java:61)
at com.pmease.quickbuild.grid.GridJob.run(GridJob.java:78)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
brutan ·
Repeat parameter seems to be evaluated on parent step start. You can add fake composition step over your repeating step to work around this problem.
robinshen ADMIN ·
Yes, that is true. The variable has to be initialized before parent step containing the repeated step.
nmanos ·
I see, adding a "fake" composition step (over the sequential step with the repeat parameters), after the step that initialized "mapCLsUsers" variable, did the trick.

Can you explain the logic - why does QB try to evaluate the repeat parameters values, before it has run prior steps ?
robinshen ADMIN ·
Parent step has to know all its children before running them. Repeated steps will be expanded as separate children in parent step.
nmanos ·
Hi,
And another related question regarding Map.
I'm trying to get a submap from mapCLsUsers, which should contain only the first element [key:value] of mapCLsUsers. As before, QB variable mapCLsUsers =
[300588:'fname1.lname1', 300579:'fname2.lname2', 300560:'fname3.lname3', 300556:'fname4.lname4']


Using Map take() works on my external groovy ide, but in QB:

groovy:
def mapCLsUsers = evaluate(vars.getValue("mapCLsUsers"));
mapCLsUsers = mapCLsUsers.take(1);


It fails on:
groovy.lang.MissingMethodException: No signature of method: java.util.TreeMap.take() is applicable for argument types: (java.lang.Integer) values: [1]
Possible solutions: wait(), size(), size(), any(), wait(long), wait(long, int)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:54)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
at script13816767561621072460741.run(script13816767561621072460741.groovy:82)
at com.pmease.quickbuild.plugin.basis.BasisPlugin$25.evaluate(BasisPlugin.java:322)
at com.pmease.quickbuild.DefaultScriptEngine.evaluate(DefaultScriptEngine.java:80)
at com.pmease.quickbuild.DefaultScriptEngine.interpolate(DefaultScriptEngine.java:104)
at com.pmease.quickbuild.DefaultScriptEngine$Interpolator.intercept(DefaultScriptEngine.java:277)
at com.pmease.quickbuild.plugin.basis.CommandBuildStep$$EnhancerByCGLIB$$3596989d.getCommand(<generated>)
at com.pmease.quickbuild.plugin.basis.CommandBuildStep.run(CommandBuildStep.java:152)
at com.pmease.quickbuild.plugin.basis.CommandBuildStep$$EnhancerByCGLIB$$3596989d.CGLIB$run$0(<generated>)
at com.pmease.quickbuild.plugin.basis.CommandBuildStep$$EnhancerByCGLIB$$3596989d$$FastClassByCGLIB$$a2ba07ac.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.pmease.quickbuild.DefaultScriptEngine$Interpolator.intercept(DefaultScriptEngine.java:269)
at com.pmease.quickbuild.plugin.basis.CommandBuildStep$$EnhancerByCGLIB$$3596989d.run(<generated>)
at com.pmease.quickbuild.stepsupport.Step.execute(Step.java:501)
at com.pmease.quickbuild.stepsupport.StepExecutionJob.executeStepAwareJob(StepExecutionJob.java:30)
at com.pmease.quickbuild.stepsupport.StepAwareJob.executeBuildAwareJob(StepAwareJob.java:47)
at com.pmease.quickbuild.BuildAwareJob.execute(BuildAwareJob.java:61)
at com.pmease.quickbuild.grid.GridJob.run(GridJob.java:78)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


How come, is QB 5 using groovy version less than 1.8.1 ?

Thanks,
Noam.
robinshen ADMIN ·
QB ships with groovy 1.7.9. You may put groovy 1.8 jar into "plugins/com.pmease.quickbuild.libs" to use the new groovy version.
nmanos ·
Thanks!
I also added a feature request for that:
http://track.pmease.com/browse/QB-1813