# HG changeset patch # User Jaroslav Tulach # Date 1365920645 -7200 # Node ID 6629bfa8f9732f85c118f967f3da6a4d3e119ee3 # Parent 094cd25a16d95f36934b80f6009779e621165cee Need to convert array values if they are convertible diff -r 094cd25a16d9 -r 6629bfa8f973 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Sat Apr 13 09:14:54 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Sun Apr 14 08:24:05 2013 +0200 @@ -17,9 +17,13 @@ */ package org.apidesign.bck2brwsr.htmlpage; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apidesign.bck2brwsr.core.JavaScriptOnly; /** @@ -144,8 +148,32 @@ private static native int koArray(); public Object koData() { - return toArray(); + Object[] arr = toArray(); + Method toKO = null; + for (int i = 0; i < arr.length; i++) { + if (arr[i] == null) { + continue; + } + if (toKO == null || toKO.getDeclaringClass() != arr[i].getClass()) { + try { + toKO = arr[i].getClass().getDeclaredMethod("koData"); + toKO.setAccessible(true); + } catch (NoSuchMethodException ex) { + LOG.log(Level.FINE, "No koData conversion for " + arr[i], ex); + toKO = null; + } + } + if (toKO != null) { + try { + arr[i] = toKO.invoke(arr[i]); + } catch (IllegalAccessException | InvocationTargetException ex) { + LOG.log(Level.SEVERE, "Problems invoking koData on " + arr[i], ex); + } + } + } + return arr; } + private static final Logger LOG = Logger.getLogger(KOList.class.getName()); private void notifyChange() { Knockout m = model;