On Jul 8, 11:21 am, [EMAIL PROTECTED] wrote:
> I've had success initializing my JS scope, injecting various Java
> objects using code like the following:
>
>    String globalName = "SomeGlobal";
>    Object jsObject = Context.javaToJS(anObject, this.jsScope);
>    ScriptableObject.putProperty(jsScope, globalName, jsObject);
>
> Now I'd like to (in Java code) construct a JS array that contains JS
> objects.  Each of the JS objects in the array is formed from a
> java.util.Map where the keys become property names and the values
> become property values.  The values are to be native Java objects
> (presumably wrapped). The keys are strings.
>
>    [{key1:value1, key2:value2, key3:value3},
>      {key1:value1, key2:value2, key3:value3},
>      {key1:value1, key2:value2, key3:value3},
>      ...]
>
> I have the following utility method that builds the JS object
>
> public static Scriptable inputDataToJSArray(Workbook wb, Scriptable
> scope,
>                         Context context) {
>                 Iterator<Map<String, Object>> rowIterator = WorkbookDataUtil
>                                 .createInputDataRowInterator(wb);
>                 // Create a JS array for the return value
>                 Scriptable returnJSArray = context.newArray(scope, 1);
>                 // For every row create a new JS object and insert it
>                 int rowIndex = 0;
>                 while(rowIterator.hasNext()) {
>                         Scriptable rowJSObject = context.newObject(scope);
>                         Map<String,Object> rowMap = rowIterator.next();
>                         for (Map.Entry<String, Object> columnEntry : 
> rowMap.entrySet()) {
>                                 String columnName = columnEntry.getKey();
>                                 Object cellValue = columnEntry.getValue();
>                                 scope.put(columnName, rowJSObject, 
> Context.javaToJS(cellValue,
> rowJSObject));
>                         }
>                         scope.put(rowIndex, returnJSArray, rowJSObject);
>                         rowIndex++;
>                 }
>                 return returnJSArray;
>         }
>
> And I add the result to my scope using:
>
> protected void addToScopeJS(String globalName, Object jsObject,
>                         org.apache.commons.chain.Context chainContext) {
>                 logger.trace("addToScope - added {} to scope as global name 
> {}",
>                                 jsObject.toString(), globalName);
>                 ScriptableObject.putProperty(jsScope, globalName, jsObject);
>                 chainContext.put(globalName, jsObject);
>         }
>
> Note: globalName = "InputData"
>
> But in my scripts, when I attempt to access the properties of each row
> I get undefined (see row["First_Name"] & row["Last_Name"]):
>
> function main1() {
>         Logger.trace("Begin UploadHelloService.js");
>         var aSheet = OutputWorkbook.createSheet("SayHello Results", 0);
>         var rowIndex = 1;
>         addLabelCell("Response",aSheet,0,0);
>         var row;
>         var column;
>         var response;
>         for(row in InputData) {
>                 response = sayHello(row["First_Name"],row["Last_Name"]);
>                 addLabelCell(response,aSheet,rowIndex,0);
>         }
>         Logger.trace("End UploadHelloService.js");
>
> }
>
> I've done detailed inspection of the JS array and contained JS objects
> in the debugger and they appear to be well formed.  I've tried
> variants where I don't call javaToJS and turning off primitive
> wrapping to no avail.
>
> Any hints greatly appreciated,
>
> Ron

>From a quick scan of your code I think the problem is here:
    scope.put(columnName, rowJSObject, Context.javaToJS(cellValue,
rowJSObject));
I think you want to change it to
    returnJSArray.put(columnName, rowJSObject,
Context.javaToJS(cellValue, rowJSObject));

--N
_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino

Reply via email to