Skip to content

Commit 9011b12

Browse files
committed
revert xmlbeans-483 changes
git-svn-id: https://svn.apache.org/repos/asf/xmlbeans/trunk@1933236 13f79535-47bb-0310-9956-ffa450edef68
1 parent fc2bc20 commit 9011b12

1 file changed

Lines changed: 21 additions & 67 deletions

File tree

‎src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java‎

Lines changed: 21 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import javax.xml.namespace.QName;
2323
import java.math.BigDecimal;
2424
import java.math.BigInteger;
25-
import java.util.ArrayList;
2625
import java.util.Calendar;
2726
import java.util.Date;
2827
import 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

Comments
 (0)