diff --git a/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java b/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java index 245d6d172..69a088b8e 100644 --- a/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java +++ b/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java @@ -407,19 +407,20 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s m = startPos; } - int j; - for (i = startSrc, j = startDest; i < n; i++, j++) { - TypeStoreUser user; - - if (j >= m) { - user = store.add_element_user(elemName); - } else if (set == null) { - user = store.find_element_user(elemName, j); - } else { - user = store.find_element_user(set, j); - } + final int size = Math.min(m - startDest, sources.length - startSrc); + ArrayList users = new ArrayList<>(size); + if (set == null) { + store.find_multiple_element_users(elemName, users, size); + } else { + store.find_multiple_element_users(set, users, size); + } + i = startSrc; + for (XmlObjectBase user : users) { + user.set(sources[i++]); + } - ((XmlObjectBase) user).set(sources[i]); + for (TypeStoreUser u : store.add_elements_users(elemName, n - i)) { + ((XmlObjectBase) u).set(sources[i++]); } // We can't just delegate to array_setter because we need