Author: fanningpj
Date: Wed Jul 16 19:22:24 2025
New Revision: 1927272
URL: http://svn.apache.org/viewvc?rev=1927272&view=rev
Log:
[XMLBeans-438] Remove elements between
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Xobj.java
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/TypeStore.java
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Xobj.java
URL:
http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Xobj.java?rev=1927272&r1=1927271&r2=1927272&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Xobj.java
(original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Xobj.java Wed
Jul 16 19:22:24 2025
@@ -2304,6 +2304,39 @@ abstract class Xobj implements TypeStore
}
@Override
+ public void remove_elements_between(final QName name, final int m, final
int n) {
+ if (m < 0 || n < 0) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ if (!isContainer()) {
+ throw new IllegalStateException();
+ }
+
+ if (m >= n) {
+ return;
+ }
+
+ ArrayList<Xobj> toRemove = new ArrayList<>();
+ Xobj x;
+ int i = m;
+ int count = 0;
+ for (x = _firstChild; x != null; x = x._nextSibling) {
+ if (x.isElem() && x._name.equals(name) && --i < 0) {
+ toRemove.add(x);
+ count++;
+ if (count >= n - m) {
+ break; // no need to continue if we've removed enough
+ }
+ }
+ }
+ final int size = toRemove.size();
+ for (int j = size - 1; j >= 0; j--) {
+ removeElement(toRemove.get(j));
+ }
+ }
+
+ @Override
public void remove_element(QNameSet names, int i) {
if (i < 0) {
throw new IndexOutOfBoundsException();
@@ -2343,6 +2376,39 @@ abstract class Xobj implements TypeStore
}
}
+ @Override
+ public void remove_elements_between(final QNameSet names, final int m,
final int n) {
+ if (m < 0 || n < 0) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ if (!isContainer()) {
+ throw new IllegalStateException();
+ }
+
+ if (m >= n) {
+ return;
+ }
+
+ ArrayList<Xobj> toRemove = new ArrayList<>();
+ Xobj x;
+ int i = m;
+ int count = 0;
+ for (x = _firstChild; x != null; x = x._nextSibling) {
+ if (x.isElem() && names.contains(x._name) && --i < 0) {
+ toRemove.add(x);
+ count++;
+ if (count >= n - m) {
+ break; // no need to continue if we've removed enough
+ }
+ }
+ }
+ final int size = toRemove.size();
+ for (int j = size - 1; j >= 0; j--) {
+ removeElement(toRemove.get(j));
+ }
+ }
+
public TypeStoreUser find_attribute_user(QName name) {
Xobj a = getAttr(name);
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/TypeStore.java
URL:
http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/TypeStore.java?rev=1927272&r1=1927271&r2=1927272&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/TypeStore.java
(original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/TypeStore.java
Wed Jul 16 19:22:24 2025
@@ -276,16 +276,30 @@ public interface TypeStore extends Names
void remove_element(QNameSet names, int i);
/**
- * Removes all elements after the i-th element with the given name.
+ * Removes all elements from the i-th element with the given name.
* @since 5.4.0
*/
void remove_elements_after(QName name, int i);
/**
- * Removes all elements after the i-th element with the given name.
+ * Removes all elements from the i-th element with the given names.
* @since 5.4.0
*/
- void remove_elements_after(QNameSet name, int i);
+ void remove_elements_after(QNameSet names, int i);
+
+ /**
+ * Removes all elements from the m-th element with the given name up to
the n-th
+ * element with the given name but not including the n-th element.
+ * @since 5.4.0
+ */
+ void remove_elements_between(QName name, int m, int n);
+
+ /**
+ * Removes all elements from the m-th element with the given name up to
the n-th
+ * element with the given name but not including the n-th element.
+ * @since 5.4.0
+ */
+ void remove_elements_between(QNameSet names, int m, int n);
/**
* Returns the TypeStoreUser underneath the attribute with the given
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
URL:
http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java?rev=1927272&r1=1927271&r2=1927272&view=diff
==============================================================================
---
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
(original)
+++
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
Wed Jul 16 19:22:24 2025
@@ -396,13 +396,15 @@ public class XmlComplexContentImpl exten
// ... then come back and insert the elements starting with startSource
// up to i from the sources array into the current array, starting with
// startDest
- int n = i;
- for (; m > n - startSrc + startDest; m--) {
+ final int n = i;
+ final int startPos = n - startSrc + startDest;
+ if (m > startPos) {
if (set == null) {
- store.remove_element(elemName, m - 1);
+ store.remove_elements_between(elemName, startPos, m);
} else {
- store.remove_element(set, m - 1);
+ store.remove_elements_between(set, startPos, m);
}
+ m = startPos;
}
int j;
@@ -531,14 +533,16 @@ public class XmlComplexContentImpl exten
// up to i from the sources array into the current array, starting with
// startDest
final int n = i;
-
- if (set == null) {
- store.remove_elements_after(elemName, n - startSrc + startDest);
- } else {
- store.remove_elements_after(set, n - startSrc + startDest);
+ final int startPos = n - startSrc + startDest;
+ if (m > startPos) {
+ if (set == null) {
+ store.remove_elements_between(elemName, startPos, m);
+ } else {
+ store.remove_elements_between(set, startPos, m);
+ }
+ m = startPos;
}
-
final int size = Math.min(m - startDest, sources.length - startSrc);
ArrayList<XmlObjectBase> users = new ArrayList<>(size);
if (set == null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]