2222import javax .xml .namespace .QName ;
2323import java .math .BigDecimal ;
2424import java .math .BigInteger ;
25- import java .util .ArrayList ;
2625import java .util .Calendar ;
2726import java .util .Date ;
2827import java .util .List ;
@@ -343,14 +342,7 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s
343342 }
344343 }
345344 if (i < sources .length ) {
346- // Get all existing elements upfront to avoid O(n^2) from repeated find_element_user calls
347- List <XmlObject > existingList = new ArrayList <>(m );
348- if (set == null ) {
349- store .find_all_element_users (elemName , existingList );
350- } else {
351- store .find_all_element_users (set , existingList );
352- }
353- TypeStoreUser current = existingList .isEmpty () ? null : (TypeStoreUser ) existingList .get (0 );
345+ TypeStoreUser current = (set == null ) ? store .find_element_user (elemName , 0 ) : store .find_element_user (set , 0 );
354346 if (current == sources [i ]) {
355347 // The new object matches what already exists in the array
356348 // Heuristic: we optimize for the case where the new elements
@@ -359,26 +351,16 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s
359351
360352 // First insert the new element in the array at position 0
361353 int j ;
362- int originalI = i ; // capture for index arithmetic in the inner loop
363354 for (j = 0 ; j < i ; j ++) {
364355 TypeStoreUser user = (set == null ) ? store .insert_element_user (elemName , j ) : store .insert_element_user (set , elemName , j );
365356 ((XmlObjectBase ) user ).set (sources [j ]);
366357 }
367- // Track inserts made inside this loop so we can compute the correct
368- // index into existingList without calling find_element_user each time.
369- int insertCount = 0 ;
370358 for (i ++, j ++; i < sources .length ; i ++, j ++) {
371359 // Cursor is implicitly closed
372360 XmlCursor c = sources [i ].isImmutable () ? null : sources [i ].newCursor ();
373361 if (c != null && c .toParent () && c .getObject () == this ) {
374362 c .close ();
375- // Each of the originalI pre-inserts shifted existing elements right by
376- // originalI positions; each subsequent insert in this loop shifts them
377- // one more. So j (the current store position) maps to
378- // existingList[j - originalI - insertCount], where originalI accounts
379- // for pre-loop inserts and insertCount for in-loop inserts so far.
380- int existingIdx = j - originalI - insertCount ;
381- current = (existingIdx < existingList .size ()) ? (TypeStoreUser ) existingList .get (existingIdx ) : null ;
363+ current = (set == null ) ? store .find_element_user (elemName , j ) : store .find_element_user (set , j );
382364 if (current != sources [i ]) {
383365 // Fall back to the general case
384366 break ;
@@ -390,12 +372,11 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s
390372 // Insert before the current element
391373 TypeStoreUser user = (set == null ) ? store .insert_element_user (elemName , j ) : store .insert_element_user (set , elemName , j );
392374 ((XmlObjectBase ) user ).set (sources [i ]);
393- insertCount ++;
394375 }
395376 }
396377 startDest = j ;
397378 startSrc = i ;
398- m = ( set == null ) ? store .count_elements (elemName ) : store . count_elements ( set );
379+ m = store .count_elements (elemName );
399380 }
400381 // Fall through
401382 } else {
@@ -426,28 +407,19 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s
426407 }
427408 }
428409
429- // Get existing elements upfront to avoid O(n^2) from repeated find_element_user calls.
430- // The list is built lazily since it may not be needed when all remaining elements are new.
431- List <XmlObject > finalList = null ;
432410 int j ;
433411 for (i = startSrc , j = startDest ; i < n ; i ++, j ++) {
434- XmlObjectBase user ;
412+ TypeStoreUser user ;
435413
436414 if (j >= m ) {
437- user = (XmlObjectBase ) store .add_element_user (elemName );
415+ user = store .add_element_user (elemName );
416+ } else if (set == null ) {
417+ user = store .find_element_user (elemName , j );
438418 } else {
439- if (finalList == null ) {
440- finalList = new ArrayList <>(m );
441- if (set == null ) {
442- store .find_all_element_users (elemName , finalList );
443- } else {
444- store .find_all_element_users (set , finalList );
445- }
446- }
447- user = (XmlObjectBase ) finalList .get (j );
419+ user = store .find_element_user (set , j );
448420 }
449421
450- user .set (sources [i ]);
422+ (( XmlObjectBase ) user ) .set (sources [i ]);
451423 }
452424
453425 // We can't just delegate to array_setter because we need
@@ -474,26 +446,17 @@ private void commonSetterHelper(QName elemName, QNameSet set, int n, BiConsumer<
474446 }
475447 }
476448
477- // Get existing elements upfront to avoid O(n^2) from repeated find_element_user calls
478- List <XmlObject > existing = new ArrayList <>(m );
479- if (m > 0 ) {
480- if (set == null ) {
481- store .find_all_element_users (elemName , existing );
482- } else {
483- store .find_all_element_users (set , existing );
484- }
485- }
486-
487449 for (int i = 0 ; i < n ; i ++) {
488- XmlObjectBase user ;
450+ TypeStoreUser user ;
489451
490452 if (i >= m ) {
491- user = (XmlObjectBase ) store .add_element_user (elemName );
453+ user = store .add_element_user (elemName );
454+ } else if (set == null ) {
455+ user = store .find_element_user (elemName , i );
492456 } else {
493- user = ( XmlObjectBase ) existing . get ( i );
457+ user = store . find_element_user ( set , i );
494458 }
495-
496- fun .accept (user , i );
459+ fun .accept ((XmlObjectBase ) user , i );
497460 }
498461 }
499462
@@ -512,26 +475,17 @@ private <T> void commonSetterHelper2(QName elemName, QNameSet set, T[] sources,
512475 }
513476 }
514477
515- // Get existing elements upfront to avoid O(n^2) from repeated find_element_user calls
516- List <XmlObject > existing = new ArrayList <>(m );
517- if (m > 0 ) {
518- if (set == null ) {
519- store .find_all_element_users (elemName , existing );
520- } else {
521- store .find_all_element_users (set , existing );
522- }
523- }
524-
525478 for (int i = 0 ; i < n ; i ++) {
526- XmlObjectBase user ;
479+ TypeStoreUser user ;
527480
528481 if (i >= m ) {
529- user = (XmlObjectBase ) store .add_element_user (elemName );
482+ user = store .add_element_user (elemName );
483+ } else if (set == null ) {
484+ user = store .find_element_user (elemName , i );
530485 } else {
531- user = ( XmlObjectBase ) existing . get ( i );
486+ user = store . find_element_user ( set , i );
532487 }
533-
534- c .accept (user , sources [i ]);
488+ c .accept ((XmlObjectBase ) user , sources [i ]);
535489 }
536490 }
537491}
0 commit comments