You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/01/06 17:54:31 UTC

svn commit: r1896764 [1/7] - in /xmlbeans/trunk/src: main/java/org/apache/xmlbeans/ main/java/org/apache/xmlbeans/impl/inst2xsd/ main/java/org/apache/xmlbeans/impl/inst2xsd/util/ main/java/org/apache/xmlbeans/impl/schema/ main/java/org/apache/xmlbeans/...

Author: fanningpj
Date: Thu Jan  6 17:54:30 2022
New Revision: 1896764

URL: http://svn.apache.org/viewvc?rev=1896764&view=rev
Log:
[XMLBEANS-582] Make XmlCursor Autocloseable. Thanks to Robert Marcano. This closes #4

Added:
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/CloseTest.java   (with props)
Removed:
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/DisposeTest.java
Modified:
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlCursor.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlError.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/util/TypeSystemHolder.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaAnnotationImpl.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscTranslator.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCopy.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/tool/SchemaResourceManager.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/NamespaceContext.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/XmlObjectBase.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/xpathgen/XPathGenerator.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
    xmlbeans/trunk/src/test/java/ValidatingXSRTests/checkin/ValidatingXMLStreamReaderTests.java
    xmlbeans/trunk/src/test/java/compile/scomp/checkin/CompilationTests.java
    xmlbeans/trunk/src/test/java/dom/checkin/DirtyCacheTests.java
    xmlbeans/trunk/src/test/java/dom/checkin/DomTests.java
    xmlbeans/trunk/src/test/java/misc/checkin/RuntimeSchemaLoaderTest.java
    xmlbeans/trunk/src/test/java/misc/detailed/JiraRegression1_50Test.java
    xmlbeans/trunk/src/test/java/misc/detailed/JiraRegression50_100Test.java
    xmlbeans/trunk/src/test/java/random/common/Random.java
    xmlbeans/trunk/src/test/java/scomp/attributes/detailed/AttrGroupTest.java
    xmlbeans/trunk/src/test/java/scomp/attributes/detailed/LocalAttrForm.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/detailed/AnonymousTest.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/detailed/ElementOnlyContentTest.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/detailed/EmptyContentTest.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/detailed/MixedContentTest.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/detailed/NamedTest.java
    xmlbeans/trunk/src/test/java/scomp/contentType/complex/modelGroup/detailed/ChoiceTest.java
    xmlbeans/trunk/src/test/java/scomp/derivation/extension/detailed/MixedContentExtension.java
    xmlbeans/trunk/src/test/java/scomp/derivation/restriction/detailed/EmptyContentRestriction.java
    xmlbeans/trunk/src/test/java/scomp/derivation/restriction/detailed/MixedContentRestriction.java
    xmlbeans/trunk/src/test/java/scomp/namespace/checkin/PreserveNamespaces.java
    xmlbeans/trunk/src/test/java/scomp/substGroup/detailed/UserReportedTest.java
    xmlbeans/trunk/src/test/java/scomp/substGroup/restriction/detailed/Block.java
    xmlbeans/trunk/src/test/java/tools/xml/XmlComparator.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/AddToSelectionTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/AnnotationsTests.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ComparePositionTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/CopyTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/CopyXmlContentsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/IsAtSamePositionAsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/IsInSameDocumentTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/MoveCharsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/MoveTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/StoreTests.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToCursorTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToLastChildElementTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToNextBookmarkTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToNextSelectionTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToPrevBookmarkTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/checkin/ToPrevElementTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/common/BasicCursorTestCase.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CopyCharsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CopyTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CursorGeneratedTypedObjectTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CursorLocations.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CursorVsObjectAttributeTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CursorVsObjectInsertRemoveTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/CursorVsObjectSetGetTextTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/MoveXmlTest2.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/MultipleCopyFromCursorTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/MultipleCopyTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/MultipleCursorSetTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/ObjectCursorInteractionTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/SelectionsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/ToBookmarkTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/detailed/XmlLineNumberTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/jsr173/common/CharactersTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/jsr173/common/GeneralMethodsTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/jsr173/common/IsXXXTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/jsr173/common/NamespaceTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/jsr173/common/PITest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/common/XPathCommon.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/common/XPathFunctionAuxTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/common/XPathFunctionTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/checkin/ContainerCommentTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/checkin/XPathTests.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/checkin/XPathTestsMisc.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/DeclareNamespaceTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/NodeCopyTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/XPathExpressionTestImpl.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/XPathFunctionAuxTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/XPathNodeTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/complex/detailed/XPathTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/xbean_xpath/detailed/AxesTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xpath/xbean_xpath/detailed/NodeTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xquery/detailed/StoreTestsXqrl.java
    xmlbeans/trunk/src/test/java/xmlcursor/xquery/detailed/XQueryTest.java
    xmlbeans/trunk/src/test/java/xmlcursor/xquery/detailed/XQueryVariableBindingTest.java
    xmlbeans/trunk/src/test/java/xmlobject/checkin/AssortedTests.java
    xmlbeans/trunk/src/test/java/xmlobject/checkin/InstanceValidationTests.java
    xmlbeans/trunk/src/test/java/xmlobject/checkin/XPathTest.java
    xmlbeans/trunk/src/test/java/xmlobject/common/StringXmlReader.java
    xmlbeans/trunk/src/test/java/xmlobject/detailed/CompareToTest.java
    xmlbeans/trunk/src/test/java/xmlobject/detailed/SetIdentityTest.java
    xmlbeans/trunk/src/test/java/xmlobject/detailed/TypedObjectCursor.java
    xmlbeans/trunk/src/test/java/xmlobject/detailed/TypedSettersTests.java
    xmlbeans/trunk/src/test/java/xmlobject/schematypes/checkin/QNameTests.java
    xmlbeans/trunk/src/test/java/xmlobject/schematypes/checkin/SchemaTypesTests.java
    xmlbeans/trunk/src/test/java/xmlobject/xmlloader/detailed/XmlStreamBeanReader.java
    xmlbeans/trunk/src/test/java/xmltokensource/detailed/NewDomNodeTest.java
    xmlbeans/trunk/src/test/java/xmltokensource/detailed/PrettyPrintNamespaceTest.java
    xmlbeans/trunk/src/test/java/xmltokensource/detailed/RoundTripLoaderTest.java
    xmlbeans/trunk/src/test/java/xmltokensource/detailed/XmlTextTest.java

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlCursor.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlCursor.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlCursor.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlCursor.java Thu Jan  6 17:54:30 2022
@@ -128,7 +128,7 @@ import java.util.Map;
  * creating a brand new instance of an empty document. Also note that
  * attributes may only follow container tokens (STARTDOC or START)
  */
-public interface XmlCursor extends XmlTokenSource {
+public interface XmlCursor extends XmlTokenSource, AutoCloseable {
     /**
      * An enumeration that identifies the type of an XML token.
      */
@@ -335,11 +335,29 @@ public interface XmlCursor extends XmlTo
      * So, explicitly disposing a cursor allows the underlying implementation
      * to release its responsibility of maintaining its position.
      * <p>
-     * After a cursor has been disposed, it may not be used again.  It can
+     * After a cursor has been closed, it may not be used again.  It can
      * throw IllegalStateException or NullPointerException if used after
      * disposal.
+     * <p>
+     * XmlCursor implements <code>java.lang.AutoCloseable</code> and the
+     * try-with-resources pattern is recommended.<br/><br/>
+     * <p>
+     * Note: Future major release will remove this default implementation.
+     */
+
+    default void close() {
+        this.dispose();
+    }
+
+    /**
+     * Deallocates resources needed to manage the cursor. For details see
+     * {@link #close()}. XmlCursor implements <code>java.lang.AutoCloseable</code>
+     * and the try-with-resources pattern is recommended.
+     *
+     * @see #close()
      */
 
+    @Deprecated
     void dispose();
 
     /**

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlError.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlError.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlError.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/XmlError.java Thu Jan  6 17:54:30 2022
@@ -104,22 +104,20 @@ public class XmlError implements java.io
             // Hunt down the line/column/offset
             source = cursor.documentProperties().getSourceName();
 
-            XmlCursor c = cursor.newCursor();
-
-            XmlLineNumber ln =
-                (XmlLineNumber) c.getBookmark(XmlLineNumber.class);
-
-            if (ln == null) {
-                ln = (XmlLineNumber) c.toPrevBookmark(XmlLineNumber.class);
+            try (XmlCursor c = cursor.newCursor()) {
+                XmlLineNumber ln =
+                    (XmlLineNumber) c.getBookmark(XmlLineNumber.class);
+
+                if (ln == null) {
+                    ln = (XmlLineNumber) c.toPrevBookmark(XmlLineNumber.class);
+                }
+
+                if (ln != null) {
+                    line = ln.getLine();
+                    column = ln.getColumn();
+                    offset = ln.getOffset();
+                }
             }
-
-            if (ln != null) {
-                line = ln.getLine();
-                column = ln.getColumn();
-                offset = ln.getOffset();
-            }
-
-            c.dispose();
         }
 
         _message = message;

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java Thu Jan  6 17:54:30 2022
@@ -38,25 +38,27 @@ public class RussianDollStrategy
 
     public void processDoc(XmlObject[] instances, Inst2XsdOptions options, TypeSystemHolder typeSystemHolder) {
         for (XmlObject instance : instances) {
-            XmlCursor xc = instance.newCursor();
-            // xc on start doc
+            try (XmlCursor xc = instance.newCursor()) {
+                // xc on start doc
 
-            StringBuilder comment = new StringBuilder();
+                StringBuilder comment = new StringBuilder();
 
-            while (!xc.isStart()) {
-                xc.toNextToken();
-                if (xc.isComment()) {
-                    comment.append(xc.getTextValue());
-                } else if (xc.isEnddoc()) {
-                    return;
+                while (!xc.isStart()) {
+                    xc.toNextToken();
+                    if (xc.isComment()) {
+                        comment.append(xc.getTextValue());
+                    } else if (xc.isEnddoc()) {
+                        return;
+                    }
                 }
-            }
-            // xc now on the root element
 
-            Element withElem = processElement(xc, comment.toString(), options, typeSystemHolder);
-            withElem.setGlobal(true);
+                // xc now on the root element
+
+                Element withElem = processElement(xc, comment.toString(), options, typeSystemHolder);
+                withElem.setGlobal(true);
 
-            addGlobalElement(withElem, typeSystemHolder, options);
+                addGlobalElement(withElem, typeSystemHolder, options);
+            }
         }
     }
 
@@ -164,27 +166,27 @@ public class RussianDollStrategy
         } else {
             // simple content
             // hack workaround for being able to call xc.getNamespaceForPrefix()
-            XmlCursor xcForNamespaces = xc.newCursor();
-            xcForNamespaces.toParent();
-
-            if (attributes.size() > 0) {
-                elemType.setContentType(Type.COMPLEX_TYPE_SIMPLE_CONTENT);
+            try (XmlCursor xcForNamespaces = xc.newCursor()) {
+                xcForNamespaces.toParent();
 
-                Type extendedType = Type.createNamedType(
-                    processSimpleContentType(textBuff.toString(), options, xcForNamespaces), Type.SIMPLE_TYPE_SIMPLE_CONTENT);
-                elemType.setExtensionType(extendedType);
+                if (attributes.size() > 0) {
+                    elemType.setContentType(Type.COMPLEX_TYPE_SIMPLE_CONTENT);
 
-                processAttributesInComplexType(elemType, attributes);
-            } else {
-                elemType.setContentType(Type.SIMPLE_TYPE_SIMPLE_CONTENT);
-                elemType.setName(processSimpleContentType(textBuff.toString(), options, xcForNamespaces));
-
-                // add enumeration value
-                String enumValue = XmlString.type.getName().equals(elemType.getName()) ? textBuff.toString() : collapsedText;
-                elemType.addEnumerationValue(enumValue, xcForNamespaces);
+                    Type extendedType = Type.createNamedType(
+                        processSimpleContentType(textBuff.toString(), options, xcForNamespaces), Type.SIMPLE_TYPE_SIMPLE_CONTENT);
+                    elemType.setExtensionType(extendedType);
+
+                    processAttributesInComplexType(elemType, attributes);
+                } else {
+                    elemType.setContentType(Type.SIMPLE_TYPE_SIMPLE_CONTENT);
+                    elemType.setName(processSimpleContentType(textBuff.toString(), options, xcForNamespaces));
+
+                    // add enumeration value
+                    String enumValue = XmlString.type.getName().equals(elemType.getName()) ? textBuff.toString() : collapsedText;
+                    elemType.addEnumerationValue(enumValue, xcForNamespaces);
+                }
+                // end hack
             }
-
-            xcForNamespaces.dispose(); // end hack
         }
 
         checkIfReferenceToGlobalTypeIsNeeded(element, typeSystemHolder, options);
@@ -267,13 +269,13 @@ public class RussianDollStrategy
 
         attribute.setName(attName);
 
-        XmlCursor parent = xc.newCursor();
-        parent.toParent();
+        Type simpleContentType;
+        try (XmlCursor parent = xc.newCursor()) {
+            parent.toParent();
 
-        Type simpleContentType = Type.createNamedType(
-            processSimpleContentType(xc.getTextValue(), options, parent), Type.SIMPLE_TYPE_SIMPLE_CONTENT);
-
-        parent.dispose();
+            simpleContentType = Type.createNamedType(
+                processSimpleContentType(xc.getTextValue(), options, parent), Type.SIMPLE_TYPE_SIMPLE_CONTENT);
+        }
 
         attribute.setType(simpleContentType);
 

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/util/TypeSystemHolder.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/util/TypeSystemHolder.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/util/TypeSystemHolder.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/inst2xsd/util/TypeSystemHolder.java Thu Jan  6 17:54:30 2022
@@ -234,10 +234,11 @@ public class TypeSystemHolder
                 XmlQName xqname = XmlQName.Factory.newValue(value);
 
                 org.apache.xmlbeans.impl.xb.xsdschema.NoFixedFacet enumSElem = restriction.addNewEnumeration();
-                XmlCursor xc  = enumSElem.newCursor();
 
-                String newPrefix = xc.prefixForNamespace(value.getNamespaceURI());
-                xc.dispose();
+                String newPrefix;
+                try (XmlCursor xc  = enumSElem.newCursor()) {
+                    newPrefix = xc.prefixForNamespace(value.getNamespaceURI());
+                }
 
                 enumSElem.setValue( XmlQName.Factory.newValue(
                     new QName(value.getNamespaceURI(), value.getLocalPart(), newPrefix)));

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaAnnotationImpl.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaAnnotationImpl.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaAnnotationImpl.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaAnnotationImpl.java Thu Jan  6 17:54:30 2022
@@ -85,7 +85,7 @@ public class SchemaAnnotationImpl implem
             for (int i = 0; i <  n; i++)
             {
                 String doc = _documentationAsXml[i];
-                try 
+                try
                 {
                     _documentation[i] = DocumentationDocument.Factory.
                         parse(doc).getDocumentation();
@@ -154,7 +154,7 @@ public class SchemaAnnotationImpl implem
             // Now the attributes on the annotation element
             addNoSchemaAttributes(ann, attrArray);
         }
-        
+
         result._attributes =
             (AttributeImpl[]) attrArray.toArray(new AttributeImpl[attrArray.size()]);
         return result;
@@ -162,33 +162,33 @@ public class SchemaAnnotationImpl implem
 
     private static void addNoSchemaAttributes(XmlObject elem, List attrList)
     {
-        XmlCursor cursor = elem.newCursor();
-        boolean hasAttributes = cursor.toFirstAttribute();
-        while (hasAttributes)
-        {
-            QName name = cursor.getName();
-            String namespaceURI = name.getNamespaceURI();
-            if ("".equals(namespaceURI) ||
-                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI))
-                ; // no nothing
-            else
+        try (XmlCursor cursor = elem.newCursor()) {
+            boolean hasAttributes = cursor.toFirstAttribute();
+            while (hasAttributes)
             {
-                String attValue = cursor.getTextValue();
-                String valUri;
-                String prefix;
-                if (attValue.indexOf(':') > 0)
-                    prefix = attValue.substring(0, attValue.indexOf(':'));
+                QName name = cursor.getName();
+                String namespaceURI = name.getNamespaceURI();
+                if ("".equals(namespaceURI) ||
+                    "http://www.w3.org/2001/XMLSchema".equals(namespaceURI))
+                    ; // no nothing
                 else
-                    prefix = "";
-                cursor.push();
-                cursor.toParent();
-                valUri = cursor.namespaceForPrefix(prefix);
-                cursor.pop();
-                attrList.add(new AttributeImpl(name, attValue, valUri)); //add the attribute
+                {
+                    String attValue = cursor.getTextValue();
+                    String valUri;
+                    String prefix;
+                    if (attValue.indexOf(':') > 0)
+                        prefix = attValue.substring(0, attValue.indexOf(':'));
+                    else
+                        prefix = "";
+                    cursor.push();
+                    cursor.toParent();
+                    valUri = cursor.namespaceForPrefix(prefix);
+                    cursor.pop();
+                    attrList.add(new AttributeImpl(name, attValue, valUri)); //add the attribute
+                }
+                hasAttributes = cursor.toNextAttribute();
             }
-            hasAttributes = cursor.toNextAttribute();
         }
-        cursor.dispose();
     }
 
     private SchemaAnnotationImpl(SchemaContainer c)

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java Thu Jan  6 17:54:30 2022
@@ -307,8 +307,9 @@ public class SchemaParticleImpl implemen
                         Documentation[] docArray = a.getDocumentationArray();
                         StringBuilder sb = new StringBuilder();
                         for (Documentation documentation : docArray) {
-                            XmlCursor c = documentation.newCursor();
-                            sb.append(c.getTextValue());
+                            try (XmlCursor c = documentation.newCursor()) {
+                                sb.append(c.getTextValue());
+                            }
                         }
                         return sb.toString();
                     }

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java Thu Jan  6 17:54:30 2022
@@ -2419,13 +2419,10 @@ public final class SchemaTypeImpl implem
 
         StringBuilder docBody = new StringBuilder();
         for (Documentation documentation : ann.getDocumentationArray()) {
-            XmlCursor c = documentation.newCursor();
-            try {
+            try (XmlCursor c = documentation.newCursor()) {
                 if (c.getChars() != null) {
                     docBody.append(c.getTextValue());
                 }
-            } finally {
-                c.dispose();
             }
         }
         return docBody.toString();

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java Thu Jan  6 17:54:30 2022
@@ -48,9 +48,7 @@ public class StscComplexTypeResolver {
     }
 
     static Schema getSchema(XmlObject o) {
-        XmlCursor c = o.newCursor();
-
-        try {
+        try (XmlCursor c = o.newCursor()) {
             while (c.toParent()) {
                 o = c.getObject();
 
@@ -58,8 +56,6 @@ public class StscComplexTypeResolver {
                     return (Schema) o;
                 }
             }
-        } finally {
-            c.dispose();
         }
 
         return null;
@@ -823,176 +819,176 @@ public class StscComplexTypeResolver {
             baseModel = baseType.getAttributeModel();
         }
 
-        XmlCursor cur = parseTree.newCursor();
+        try (XmlCursor cur = parseTree.newCursor()) {
+            for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
+                switch (translateAttributeCode(cur.getName())) {
+                    case ATTRIBUTE_CODE: {
+                        Attribute xsdattr = (Attribute) cur.getObject();
+
+                        SchemaLocalAttribute sAttr = StscTranslator.translateAttribute(xsdattr, targetNamespace, formDefault, chameleon, anonymousTypes, outerType, baseModel, true);
+                        if (sAttr == null) {
+                            continue;
+                        }
 
-        for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
-            switch (translateAttributeCode(cur.getName())) {
-                case ATTRIBUTE_CODE: {
-                    Attribute xsdattr = (Attribute) cur.getObject();
+                        if (seenAttributes.contains(sAttr.getName())) {
+                            state.error(XmlErrorCodes.COMPLEX_TYPE_PROPERTIES$DUPLICATE_ATTRIBUTE,
+                                new Object[]{QNameHelper.pretty(sAttr.getName()), QNameHelper.pretty(outerType.getName())},
+                                xsdattr.xgetName());
+                            continue; // ignore the duplicate attr
+                        }
 
-                    SchemaLocalAttribute sAttr = StscTranslator.translateAttribute(xsdattr, targetNamespace, formDefault, chameleon, anonymousTypes, outerType, baseModel, true);
-                    if (sAttr == null) {
-                        continue;
-                    }
+                        seenAttributes.add(sAttr.getName());
 
-                    if (seenAttributes.contains(sAttr.getName())) {
-                        state.error(XmlErrorCodes.COMPLEX_TYPE_PROPERTIES$DUPLICATE_ATTRIBUTE,
-                            new Object[]{QNameHelper.pretty(sAttr.getName()), QNameHelper.pretty(outerType.getName())},
-                            xsdattr.xgetName());
-                        continue; // ignore the duplicate attr
-                    }
-
-                    seenAttributes.add(sAttr.getName());
-
-                    if (baseModel != null) {
-                        SchemaLocalAttribute baseAttr = baseModel.getAttribute(sAttr.getName());
-                        if (baseAttr == null) {
-                            if (!extension) {
-                                if (!baseModel.getWildcardSet().contains(sAttr.getName())) {
-                                    state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_IN_BASE_WILDCARD_SET,
-                                        new Object[]{QNameHelper.pretty(sAttr.getName()), QNameHelper.pretty(outerType.getName())}, xsdattr);
-                                }
-                            }
-                        } else {
-                            if (extension) {
-                                // KHK: cos-ct-extends.1.2?
-                                if (sAttr.getUse() == SchemaLocalAttribute.PROHIBITED) {
-                                    state.error("An extension cannot prohibit an attribute from the base type; use restriction instead.", XmlErrorCodes.DUPLICATE_ATTRIBUTE_NAME, xsdattr.xgetUse());
-                                }
-                            } else {
-                                if (sAttr.getUse() != SchemaLocalAttribute.REQUIRED) {
-                                    if (baseAttr.getUse() == SchemaLocalAttribute.REQUIRED) {
-                                        state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_REQUIRED,
+                        if (baseModel != null) {
+                            SchemaLocalAttribute baseAttr = baseModel.getAttribute(sAttr.getName());
+                            if (baseAttr == null) {
+                                if (!extension) {
+                                    if (!baseModel.getWildcardSet().contains(sAttr.getName())) {
+                                        state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_IN_BASE_WILDCARD_SET,
                                             new Object[]{QNameHelper.pretty(sAttr.getName()), QNameHelper.pretty(outerType.getName())}, xsdattr);
                                     }
-
+                                }
+                            } else {
+                                if (extension) {
+                                    // KHK: cos-ct-extends.1.2?
                                     if (sAttr.getUse() == SchemaLocalAttribute.PROHIBITED) {
-                                        result.removeProhibitedAttribute(sAttr.getName());
+                                        state.error("An extension cannot prohibit an attribute from the base type; use restriction instead.", XmlErrorCodes.DUPLICATE_ATTRIBUTE_NAME, xsdattr.xgetUse());
+                                    }
+                                } else {
+                                    if (sAttr.getUse() != SchemaLocalAttribute.REQUIRED) {
+                                        if (baseAttr.getUse() == SchemaLocalAttribute.REQUIRED) {
+                                            state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_REQUIRED,
+                                                new Object[]{QNameHelper.pretty(sAttr.getName()), QNameHelper.pretty(outerType.getName())}, xsdattr);
+                                        }
+
+                                        if (sAttr.getUse() == SchemaLocalAttribute.PROHIBITED) {
+                                            result.removeProhibitedAttribute(sAttr.getName());
+                                        }
                                     }
                                 }
                             }
                         }
-                    }
 
-                    if (sAttr.getUse() != SchemaLocalAttribute.PROHIBITED) {
-                        result.addAttribute(sAttr);
-                    } else {
-                        // attribute is prohibited. If it has an anonymous type remove
-                        // it from the list (this will prevent inclusion of any anonymous
-                        // types defined within the prohibited attribute which would
-                        // otherwise attempt to refer to the prohibited attribute at
-                        // save() time)
-                        SchemaType attrType = sAttr.getType();
-                        if (anonymousTypes != null) {
-                            anonymousTypes.remove(attrType);
+                        if (sAttr.getUse() != SchemaLocalAttribute.PROHIBITED) {
+                            result.addAttribute(sAttr);
+                        } else {
+                            // attribute is prohibited. If it has an anonymous type remove
+                            // it from the list (this will prevent inclusion of any anonymous
+                            // types defined within the prohibited attribute which would
+                            // otherwise attempt to refer to the prohibited attribute at
+                            // save() time)
+                            SchemaType attrType = sAttr.getType();
+                            if (anonymousTypes != null) {
+                                anonymousTypes.remove(attrType);
+                            }
                         }
-                    }
 
-                    if (sAttr.getDefaultText() != null && !sAttr.isFixed()) {
-                        if (sAttr.getUse() != SchemaLocalAttribute.OPTIONAL) {
-                            state.error(XmlErrorCodes.SCHEMA_ATTR$DEFAULT_AND_USE_OPTIONAL,
-                                new Object[]{QNameHelper.pretty(sAttr.getName())}, xsdattr);
+                        if (sAttr.getDefaultText() != null && !sAttr.isFixed()) {
+                            if (sAttr.getUse() != SchemaLocalAttribute.OPTIONAL) {
+                                state.error(XmlErrorCodes.SCHEMA_ATTR$DEFAULT_AND_USE_OPTIONAL,
+                                    new Object[]{QNameHelper.pretty(sAttr.getName())}, xsdattr);
+                            }
                         }
-                    }
 
 
-                    break;
-                }
-                case ANY_ATTRIBUTE_CODE: {
-                    Wildcard xsdwc = (Wildcard) cur.getObject();
-                    if (seenWildcard) {
-                        // KHK: ?
-                        state.error("Only one attribute wildcard allowed", XmlErrorCodes.DUPLICATE_ANY_ATTRIBUTE, xsdwc);
-                        continue; // ignore the extra wildcard
-                    }
-                    seenWildcard = true;
-                    NamespaceList nsList = xsdwc.xgetNamespace();
-                    String nsText;
-                    if (nsList == null) {
-                        nsText = "##any";
-                    } else {
-                        nsText = nsList.getStringValue();
+                        break;
                     }
-                    QNameSet wcset = QNameSet.forWildcardNamespaceString(nsText, targetNamespace);
-
-                    if (baseModel != null && !extension) {
-                        if (baseModel.getWildcardSet() == null) {
-                            state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$BASE_HAS_ATTR_WILDCARD, null, xsdwc);
+                    case ANY_ATTRIBUTE_CODE: {
+                        Wildcard xsdwc = (Wildcard) cur.getObject();
+                        if (seenWildcard) {
+                            // KHK: ?
+                            state.error("Only one attribute wildcard allowed", XmlErrorCodes.DUPLICATE_ANY_ATTRIBUTE, xsdwc);
                             continue; // ignore the extra wildcard
-                        } else if (!baseModel.getWildcardSet().containsAll(wcset)) {
-                            state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_WILDCARD_SUBSET,
-                                new Object[]{nsText}, xsdwc);
-                            continue; // ignore the restriction
                         }
-                    }
+                        seenWildcard = true;
+                        NamespaceList nsList = xsdwc.xgetNamespace();
+                        String nsText;
+                        if (nsList == null) {
+                            nsText = "##any";
+                        } else {
+                            nsText = nsList.getStringValue();
+                        }
+                        QNameSet wcset = QNameSet.forWildcardNamespaceString(nsText, targetNamespace);
 
-                    int wcprocess = translateWildcardProcess(xsdwc.xgetProcessContents());
-                    if (result.getWildcardProcess() == SchemaAttributeModel.NONE) {
-                        result.setWildcardSet(wcset);
-                        result.setWildcardProcess(wcprocess);
-                    } else {
-                        if (extension) {
-                            result.setWildcardSet(wcset.union(result.getWildcardSet()));
+                        if (baseModel != null && !extension) {
+                            if (baseModel.getWildcardSet() == null) {
+                                state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$BASE_HAS_ATTR_WILDCARD, null, xsdwc);
+                                continue; // ignore the extra wildcard
+                            } else if (!baseModel.getWildcardSet().containsAll(wcset)) {
+                                state.error(XmlErrorCodes.COMPLEX_TYPE_RESTRICTION$ATTR_WILDCARD_SUBSET,
+                                    new Object[]{nsText}, xsdwc);
+                                continue; // ignore the restriction
+                            }
+                        }
+
+                        int wcprocess = translateWildcardProcess(xsdwc.xgetProcessContents());
+                        if (result.getWildcardProcess() == SchemaAttributeModel.NONE) {
+                            result.setWildcardSet(wcset);
                             result.setWildcardProcess(wcprocess);
                         } else {
-                            result.setWildcardSet(wcset.intersect(result.getWildcardSet()));
-                            // keep old process
+                            if (extension) {
+                                result.setWildcardSet(wcset.union(result.getWildcardSet()));
+                                result.setWildcardProcess(wcprocess);
+                            } else {
+                                result.setWildcardSet(wcset.intersect(result.getWildcardSet()));
+                                // keep old process
+                            }
                         }
+                        break;
                     }
-                    break;
-                }
-                case ATTRIBUTE_GROUP_CODE: {
-                    AttributeGroupRef xsdag = (AttributeGroupRef) cur.getObject();
-                    QName ref = xsdag.getRef();
-                    if (ref == null) {
-                        // KHK: s4s
-                        state.error("Attribute group reference must have a ref attribute", XmlErrorCodes.ATTRIBUTE_GROUP_MISSING_REF, xsdag);
-                        continue;
-                    }
-                    SchemaAttributeGroupImpl group;
-                    if (redefinitionFor != null) {
-                        group = state.findRedefinedAttributeGroup(ref, chameleon ? targetNamespace : null, redefinitionFor);
-                        if (group != null &&
-                            redefinitionFor.getName().equals(group.getName())) {
-                            if (seenRedefinition) {
-                                state.error(XmlErrorCodes.SCHEMA_REDEFINE$ATTR_GROUP_SELF_REF,
-                                    new Object[]{QNameHelper.pretty(redefinitionFor.getName())}, xsdag);
+                    case ATTRIBUTE_GROUP_CODE: {
+                        AttributeGroupRef xsdag = (AttributeGroupRef) cur.getObject();
+                        QName ref = xsdag.getRef();
+                        if (ref == null) {
+                            // KHK: s4s
+                            state.error("Attribute group reference must have a ref attribute", XmlErrorCodes.ATTRIBUTE_GROUP_MISSING_REF, xsdag);
+                            continue;
+                        }
+                        SchemaAttributeGroupImpl group;
+                        if (redefinitionFor != null) {
+                            group = state.findRedefinedAttributeGroup(ref, chameleon ? targetNamespace : null, redefinitionFor);
+                            if (group != null &&
+                                redefinitionFor.getName().equals(group.getName())) {
+                                if (seenRedefinition) {
+                                    state.error(XmlErrorCodes.SCHEMA_REDEFINE$ATTR_GROUP_SELF_REF,
+                                        new Object[]{QNameHelper.pretty(redefinitionFor.getName())}, xsdag);
+                                }
+                                seenRedefinition = true;
                             }
-                            seenRedefinition = true;
+                        } else {
+                            group = state.findAttributeGroup(ref, chameleon ? targetNamespace : null, targetNamespace);
                         }
-                    } else {
-                        group = state.findAttributeGroup(ref, chameleon ? targetNamespace : null, targetNamespace);
-                    }
-                    if (group == null) {
-                        state.notFoundError(ref, SchemaType.ATTRIBUTE_GROUP, xsdag.xgetRef(), true);
-                        continue;
-                    }
-                    if (state.isProcessing(group)) {
-                        state.error(XmlErrorCodes.SCHEMA_ATTR_GROUP$SELF_REF,
-                            new Object[]{QNameHelper.pretty(group.getName())}, group.getParseObject());
-                        continue;
+                        if (group == null) {
+                            state.notFoundError(ref, SchemaType.ATTRIBUTE_GROUP, xsdag.xgetRef(), true);
+                            continue;
+                        }
+                        if (state.isProcessing(group)) {
+                            state.error(XmlErrorCodes.SCHEMA_ATTR_GROUP$SELF_REF,
+                                new Object[]{QNameHelper.pretty(group.getName())}, group.getParseObject());
+                            continue;
+                        }
+                        String subTargetNamespace = targetNamespace;
+                        if (group.getTargetNamespace() != null) {
+                            subTargetNamespace = group.getTargetNamespace();
+                            chameleon = group.getChameleonNamespace() != null;
+                        }
+
+                        state.startProcessing(group);
+                        SchemaAttributeGroupImpl nestedRedefinitionFor = null;
+                        if (group.isRedefinition()) {
+                            nestedRedefinitionFor = group;
+                        }
+                        translateAttributeModel(group.getParseObject(), subTargetNamespace, chameleon,
+                            group.getFormDefault(),
+                            anonymousTypes, outerType, seenAttributes, result, baseType,
+                            extension, nestedRedefinitionFor);
+                        state.finishProcessing(group);
+                        break;
                     }
-                    String subTargetNamespace = targetNamespace;
-                    if (group.getTargetNamespace() != null) {
-                        subTargetNamespace = group.getTargetNamespace();
-                        chameleon = group.getChameleonNamespace() != null;
-                    }
-
-                    state.startProcessing(group);
-                    SchemaAttributeGroupImpl nestedRedefinitionFor = null;
-                    if (group.isRedefinition()) {
-                        nestedRedefinitionFor = group;
-                    }
-                    translateAttributeModel(group.getParseObject(), subTargetNamespace, chameleon,
-                        group.getFormDefault(),
-                        anonymousTypes, outerType, seenAttributes, result, baseType,
-                        extension, nestedRedefinitionFor);
-                    state.finishProcessing(group);
-                    break;
+                    default:
+                        // skip things that are not part of the attribute model.
+                        break;
                 }
-                default:
-                    // skip things that are not part of the attribute model.
-                    break;
             }
         }
         // If this is restriction and no wildcard was present, then
@@ -1180,12 +1176,13 @@ public class StscComplexTypeResolver {
                 }
 
                 // no go to the child.
-                XmlCursor cur = group.getParseObject().newCursor();
-                for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
-                    particleCode = translateParticleCode(cur.getName());
-                    if (particleCode != 0) {
-                        parseTree = cur.getObject();
-                        break;
+                try (XmlCursor cur = group.getParseObject().newCursor()) {
+                    for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
+                        particleCode = translateParticleCode(cur.getName());
+                        if (particleCode != 0) {
+                            parseTree = cur.getObject();
+                            break;
+                        }
                     }
                 }
                 if (particleCode == 0) {
@@ -1246,22 +1243,22 @@ public class StscComplexTypeResolver {
         }
 
         if (hasChildren) {
-            XmlCursor cur = parseTree.newCursor();
             List<SchemaParticle> accumulate = new ArrayList<>();
-            for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
-                int code = translateParticleCode(cur.getName());
-                if (code == 0) {
-                    continue;
-                }
-                addMinusPointlessParticles(accumulate,
-                    translateContentModel(outerType,
-                        cur.getObject(), targetNamespace, chameleon,
-                        elemFormDefault, attFormDefault, code,
-                        anonymousTypes, elementModel, true, redefinitionFor),
-                    sPart.getParticleType());
+            try (XmlCursor cur = parseTree.newCursor()) {
+                for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
+                    int code = translateParticleCode(cur.getName());
+                    if (code == 0) {
+                        continue;
+                    }
+                    addMinusPointlessParticles(accumulate,
+                        translateContentModel(outerType,
+                            cur.getObject(), targetNamespace, chameleon,
+                            elemFormDefault, attFormDefault, code,
+                            anonymousTypes, elementModel, true, redefinitionFor),
+                        sPart.getParticleType());
+                }
             }
             sPart.setParticleChildren(accumulate.toArray(new SchemaParticle[0]));
-            cur.dispose();
         }
 
 
@@ -1880,7 +1877,9 @@ public class StscComplexTypeResolver {
         if (parseEg == null) {
             return 0;
         }
-        return translateParticleCode(parseEg.newCursor().getName());
+        try (XmlCursor c = parseEg.newCursor()) {
+            return translateParticleCode(c.getName());
+        }
     }
 
     private static int translateParticleCode(QName name) {

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java Thu Jan  6 17:54:30 2022
@@ -584,272 +584,273 @@ public class StscSimpleTypeResolver {
         List<RegularExpression> patterns = null;
 
         if (restriction != null) {
-            XmlCursor cur = restriction.newCursor();
-            for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
-                QName facetQName = cur.getName();
-                String facetName = facetQName.getLocalPart();
-                int code = translateFacetCode(facetQName);
-                if (code == -1) {
-                    continue;
-                }
+            try (XmlCursor cur = restriction.newCursor()) {
+                for (boolean more = cur.toFirstChild(); more; more = cur.toNextSibling()) {
+                    QName facetQName = cur.getName();
+                    String facetName = facetQName.getLocalPart();
+                    int code = translateFacetCode(facetQName);
+                    if (code == -1) {
+                        continue;
+                    }
+
+                    Facet facet = (Facet) cur.getObject();
+
+                    if (!facetAppliesToType(code, baseImpl)) {
+                        state.error(XmlErrorCodes.FACETS_APPLICABLE,
+                            new Object[]{facetName, QNameHelper.pretty(baseImpl.getName())}, facet);
+                        continue;
+                    } else if (baseImpl.getSimpleVariety() == SchemaType.ATOMIC &&
+                               baseImpl.getPrimitiveType().getBuiltinTypeCode() == SchemaType.BTC_NOTATION
+                               && (code == SchemaType.FACET_LENGTH || code == SchemaType.FACET_MIN_LENGTH ||
+                                   code == SchemaType.FACET_MAX_LENGTH)) {
+                        state.warning(XmlErrorCodes.FACETS_DEPRECATED_NOTATION,
+                            new Object[]{facetName, QNameHelper.pretty(baseImpl.getName())}, facet);
+                    }
+                    if (seenFacet[code] && !isMultipleFacet(code)) {
+                        state.error(XmlErrorCodes.DATATYPE_SINGLE_FACET_VALUE, null, facet);
+                        continue;
+                    }
+                    seenFacet[code] = true;
+
+                    switch (code) {
+                        case SchemaType.FACET_LENGTH:
+//                            if (myFacets[SchemaType.FACET_MIN_LENGTH] != null ||
+//                                myFacets[SchemaType.FACET_MAX_LENGTH] != null)
+//                            {
+//                                state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
+//                                continue;
+//                            }
+                            XmlInteger len = StscTranslator.buildNnInteger(facet.getValue());
+                            if (len == null) {
+                                state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                                continue;
+                            }
+                            if (fixedFacets[code] && !myFacets[code].valueEquals(len)) {
+                                state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
+                                continue;
+                            }
+                            if (myFacets[SchemaType.FACET_MIN_LENGTH] != null) {
+                                // An error for 'length' and 'minLength' to be specified at the same time
+                                // except if the base type had the same value for 'minLength' also
+                                XmlAnySimpleType baseMinLength = baseImpl.getFacet(SchemaType.FACET_MIN_LENGTH);
+                                if (!(baseMinLength != null &&
+                                      baseMinLength.valueEquals(myFacets[SchemaType.FACET_MIN_LENGTH]) &&
+                                      baseMinLength.compareValue(len) <= 0)) {
+                                    state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
+                                    continue;
+                                }
+                            }
+                            if (myFacets[SchemaType.FACET_MAX_LENGTH] != null) {
+                                // An error for 'length' and 'maxLength' to be specified at the same time
+                                // except if the base type had the same value for 'maxLength' also
+                                XmlAnySimpleType baseMaxLength = baseImpl.getFacet(SchemaType.FACET_MAX_LENGTH);
+                                if (!(baseMaxLength != null &&
+                                      baseMaxLength.valueEquals(myFacets[SchemaType.FACET_MAX_LENGTH]) &&
+                                      baseMaxLength.compareValue(len) >= 0)) {
+                                    state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
+                                    continue;
+                                }
+                            }
+                            myFacets[code] = len;
+                            break;
 
-                Facet facet = (Facet) cur.getObject();
+                        case SchemaType.FACET_MIN_LENGTH:
+                        case SchemaType.FACET_MAX_LENGTH:
+                            XmlInteger mlen = StscTranslator.buildNnInteger(facet.getValue());
+                            if (mlen == null) {
+                                state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                                continue;
+                            }
+                            if (fixedFacets[code] && !myFacets[code].valueEquals(mlen)) {
+                                state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
+                                continue;
+                            }
+                            if (myFacets[SchemaType.FACET_LENGTH] != null) {
+                                // It's an error for 'length' and 'minLength'/'maxLength' to be
+                                // specified at the same time, except for the case when
+                                // the base type had the same value for 'minLength'/'maxLength'
+                                // and the two values are consistent
+                                XmlAnySimpleType baseMinMaxLength = baseImpl.getFacet(code);
+                                if (!(baseMinMaxLength != null &&
+                                      baseMinMaxLength.valueEquals(mlen) &&
+                                      (code == SchemaType.FACET_MIN_LENGTH ?
+                                          baseMinMaxLength.compareTo(myFacets[SchemaType.FACET_LENGTH]) <= 0 :
+                                          baseMinMaxLength.compareTo(myFacets[SchemaType.FACET_LENGTH]) >= 0))) {
+                                    state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
+                                    continue;
+                                }
+                            }
+                            if (myFacets[SchemaType.FACET_MAX_LENGTH] != null) {
+                                if (mlen.compareValue(myFacets[SchemaType.FACET_MAX_LENGTH]) > 0) {
+                                    state.error(XmlErrorCodes.DATATYPE_MAX_LENGTH_RESTRICTION, null, facet);
+                                    continue;
+                                }
+                            }
+                            if (myFacets[SchemaType.FACET_MIN_LENGTH] != null) {
+                                if (mlen.compareValue(myFacets[SchemaType.FACET_MIN_LENGTH]) < 0) {
+                                    state.error(XmlErrorCodes.DATATYPE_MIN_LENGTH_RESTRICTION, null, facet);
+                                    continue;
+                                }
+                            }
+                            myFacets[code] = mlen;
+                            break;
 
-                if (!facetAppliesToType(code, baseImpl)) {
-                    state.error(XmlErrorCodes.FACETS_APPLICABLE,
-                        new Object[]{facetName, QNameHelper.pretty(baseImpl.getName())}, facet);
-                    continue;
-                } else if (baseImpl.getSimpleVariety() == SchemaType.ATOMIC &&
-                           baseImpl.getPrimitiveType().getBuiltinTypeCode() == SchemaType.BTC_NOTATION
-                           && (code == SchemaType.FACET_LENGTH || code == SchemaType.FACET_MIN_LENGTH ||
-                               code == SchemaType.FACET_MAX_LENGTH)) {
-                    state.warning(XmlErrorCodes.FACETS_DEPRECATED_NOTATION,
-                        new Object[]{facetName, QNameHelper.pretty(baseImpl.getName())}, facet);
-                }
-                if (seenFacet[code] && !isMultipleFacet(code)) {
-                    state.error(XmlErrorCodes.DATATYPE_SINGLE_FACET_VALUE, null, facet);
-                    continue;
-                }
-                seenFacet[code] = true;
+                        case SchemaType.FACET_TOTAL_DIGITS:
+                            XmlPositiveInteger dig = StscTranslator.buildPosInteger(facet.getValue());
+                            if (dig == null) {
+                                state.error("Must be a positive integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                                break;
+                            }
+                            if (fixedFacets[code] && !myFacets[code].valueEquals(dig)) {
+                                state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
+                                continue;
+                            }
+                            if (myFacets[SchemaType.FACET_TOTAL_DIGITS] != null) {
+                                if (dig.compareValue(myFacets[SchemaType.FACET_TOTAL_DIGITS]) > 0) {
+                                    state.error(XmlErrorCodes.DATATYPE_TOTAL_DIGITS_RESTRICTION, null, facet);
+                                }
+                            }
+                            myFacets[code] = dig;
+                            break;
+
+                        case SchemaType.FACET_FRACTION_DIGITS:
+                            XmlNonNegativeInteger fdig = StscTranslator.buildNnInteger(facet.getValue());
+                            if (fdig == null) {
+                                state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                                break;
+                            }
+                            if (fixedFacets[code] && !myFacets[code].valueEquals(fdig)) {
+                                state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
+                                continue;
+                            }
+                            if (myFacets[SchemaType.FACET_FRACTION_DIGITS] != null) {
+                                if (fdig.compareValue(myFacets[SchemaType.FACET_FRACTION_DIGITS]) > 0) {
+                                    state.error(XmlErrorCodes.DATATYPE_FRACTION_DIGITS_RESTRICTION, null, facet);
+                                }
+                            }
+                            if (myFacets[SchemaType.FACET_TOTAL_DIGITS] != null) {
+                                if (fdig.compareValue(myFacets[SchemaType.FACET_TOTAL_DIGITS]) > 0) {
+                                    state.error(XmlErrorCodes.DATATYPE_FRACTION_DIGITS_LE_TOTAL_DIGITS, null, facet);
+                                }
+                            }
+                            myFacets[code] = fdig;
+                            break;
+
+                        case SchemaType.FACET_MIN_EXCLUSIVE:
+                        case SchemaType.FACET_MIN_INCLUSIVE:
+                        case SchemaType.FACET_MAX_INCLUSIVE:
+                        case SchemaType.FACET_MAX_EXCLUSIVE:
 
-                switch (code) {
-                    case SchemaType.FACET_LENGTH:
-//                        if (myFacets[SchemaType.FACET_MIN_LENGTH] != null ||
-//                            myFacets[SchemaType.FACET_MAX_LENGTH] != null)
-//                        {
-//                            state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
-//                            continue;
-//                        }
-                        XmlInteger len = StscTranslator.buildNnInteger(facet.getValue());
-                        if (len == null) {
-                            state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
-                            continue;
-                        }
-                        if (fixedFacets[code] && !myFacets[code].valueEquals(len)) {
-                            state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
-                            continue;
-                        }
-                        if (myFacets[SchemaType.FACET_MIN_LENGTH] != null) {
-                            // An error for 'length' and 'minLength' to be specified at the same time
-                            // except if the base type had the same value for 'minLength' also
-                            XmlAnySimpleType baseMinLength = baseImpl.getFacet(SchemaType.FACET_MIN_LENGTH);
-                            if (!(baseMinLength != null &&
-                                  baseMinLength.valueEquals(myFacets[SchemaType.FACET_MIN_LENGTH]) &&
-                                  baseMinLength.compareValue(len) <= 0)) {
-                                state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
-                                continue;
-                            }
-                        }
-                        if (myFacets[SchemaType.FACET_MAX_LENGTH] != null) {
-                            // An error for 'length' and 'maxLength' to be specified at the same time
-                            // except if the base type had the same value for 'maxLength' also
-                            XmlAnySimpleType baseMaxLength = baseImpl.getFacet(SchemaType.FACET_MAX_LENGTH);
-                            if (!(baseMaxLength != null &&
-                                  baseMaxLength.valueEquals(myFacets[SchemaType.FACET_MAX_LENGTH]) &&
-                                  baseMaxLength.compareValue(len) >= 0)) {
-                                state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
-                                continue;
-                            }
-                        }
-                        myFacets[code] = len;
-                        break;
-
-                    case SchemaType.FACET_MIN_LENGTH:
-                    case SchemaType.FACET_MAX_LENGTH:
-                        XmlInteger mlen = StscTranslator.buildNnInteger(facet.getValue());
-                        if (mlen == null) {
-                            state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
-                            continue;
-                        }
-                        if (fixedFacets[code] && !myFacets[code].valueEquals(mlen)) {
-                            state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
-                            continue;
-                        }
-                        if (myFacets[SchemaType.FACET_LENGTH] != null) {
-                            // It's an error for 'length' and 'minLength'/'maxLength' to be
-                            // specified at the same time, except for the case when
-                            // the base type had the same value for 'minLength'/'maxLength'
-                            // and the two values are consistent
-                            XmlAnySimpleType baseMinMaxLength = baseImpl.getFacet(code);
-                            if (!(baseMinMaxLength != null &&
-                                  baseMinMaxLength.valueEquals(mlen) &&
-                                  (code == SchemaType.FACET_MIN_LENGTH ?
-                                      baseMinMaxLength.compareTo(myFacets[SchemaType.FACET_LENGTH]) <= 0 :
-                                      baseMinMaxLength.compareTo(myFacets[SchemaType.FACET_LENGTH]) >= 0))) {
-                                state.error(XmlErrorCodes.DATATYPE_LENGTH, null, facet);
-                                continue;
-                            }
-                        }
-                        if (myFacets[SchemaType.FACET_MAX_LENGTH] != null) {
-                            if (mlen.compareValue(myFacets[SchemaType.FACET_MAX_LENGTH]) > 0) {
-                                state.error(XmlErrorCodes.DATATYPE_MAX_LENGTH_RESTRICTION, null, facet);
-                                continue;
-                            }
-                        }
-                        if (myFacets[SchemaType.FACET_MIN_LENGTH] != null) {
-                            if (mlen.compareValue(myFacets[SchemaType.FACET_MIN_LENGTH]) < 0) {
-                                state.error(XmlErrorCodes.DATATYPE_MIN_LENGTH_RESTRICTION, null, facet);
-                                continue;
-                            }
-                        }
-                        myFacets[code] = mlen;
-                        break;
-
-                    case SchemaType.FACET_TOTAL_DIGITS:
-                        XmlPositiveInteger dig = StscTranslator.buildPosInteger(facet.getValue());
-                        if (dig == null) {
-                            state.error("Must be a positive integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                            if (seenFacet[other_similar_limit(code)]) {
+                                state.error("Cannot define both inclusive and exclusive limit in the same restriciton", XmlErrorCodes.FACET_DUPLICATED, facet);
+                                continue;
+                            }
+                            boolean ismin = (code == SchemaType.FACET_MIN_EXCLUSIVE || code == SchemaType.FACET_MIN_INCLUSIVE);
+                            boolean isexclusive = (code == SchemaType.FACET_MIN_EXCLUSIVE || code == SchemaType.FACET_MAX_EXCLUSIVE);
+
+                            XmlAnySimpleType limit;
+                            try {
+                                limit = baseImpl.newValue(facet.getValue(), true);
+                            } catch (XmlValueOutOfRangeException e) {
+                                // note: this guarantees that the limit is a valid number in the
+                                // base data type!!
+                                switch (code) {
+                                    case SchemaType.FACET_MIN_EXCLUSIVE:
+                                        state.error(XmlErrorCodes.DATATYPE_MIN_EXCLUSIVE_RESTRICTION,
+                                            new Object[]{e.getMessage()}, facet);
+                                        break;
+                                    case SchemaType.FACET_MIN_INCLUSIVE:
+                                        state.error(XmlErrorCodes.DATATYPE_MIN_INCLUSIVE_RESTRICTION,
+                                            new Object[]{e.getMessage()}, facet);
+                                        break;
+                                    case SchemaType.FACET_MAX_INCLUSIVE:
+                                        state.error(XmlErrorCodes.DATATYPE_MAX_INCLUSIVE_RESTRICTION,
+                                            new Object[]{e.getMessage()}, facet);
+                                        break;
+                                    case SchemaType.FACET_MAX_EXCLUSIVE:
+                                        state.error(XmlErrorCodes.DATATYPE_MAX_EXCLUSIVE_RESTRICTION,
+                                            new Object[]{e.getMessage()}, facet);
+                                        break;
+                                }
+
+                                // BUGBUG: if there are actual schemas that redefine min/maxExclusive,
+                                // they will need this rule relaxed for them!!
+                                continue;
+                            }
+                            if (fixedFacets[code] && !myFacets[code].valueEquals(limit)) {
+                                state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
+                                continue;
+                            }
+                            if (myFacets[code] != null) {
+                                SchemaType limitSType = limit.schemaType();
+                                if (limitSType != null && !limitSType.isSimpleType() &&
+                                    limitSType.getContentType() == SchemaType.SIMPLE_CONTENT) {
+                                    // in the case of complex types with simple content that has facets
+                                    // we need to compare values based on the content type
+                                    limit = baseImpl.getContentBasedOnType().newValue(facet.getValue());
+                                }
+
+                                int comparison = limit.compareValue(myFacets[code]);
+                                if (comparison == 2 || comparison == (ismin ? -1 : 1)) {
+                                    state.error(ismin ?
+                                            (isexclusive ?
+                                                "Must be greater than or equal to previous minExclusive" :
+                                                "Must be greater than or equal to previous minInclusive") :
+                                            (isexclusive ?
+                                                "Must be less than or equal to previous maxExclusive" :
+                                                "Must be less than or equal to previous maxInclusive"),
+                                        XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+                                    continue;
+                                }
+                            }
+                            myFacets[code] = limit;
+                            myFacets[other_similar_limit(code)] = null;
                             break;
-                        }
-                        if (fixedFacets[code] && !myFacets[code].valueEquals(dig)) {
-                            state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
-                            continue;
-                        }
-                        if (myFacets[SchemaType.FACET_TOTAL_DIGITS] != null) {
-                            if (dig.compareValue(myFacets[SchemaType.FACET_TOTAL_DIGITS]) > 0) {
-                                state.error(XmlErrorCodes.DATATYPE_TOTAL_DIGITS_RESTRICTION, null, facet);
-                            }
-                        }
-                        myFacets[code] = dig;
-                        break;
-
-                    case SchemaType.FACET_FRACTION_DIGITS:
-                        XmlNonNegativeInteger fdig = StscTranslator.buildNnInteger(facet.getValue());
-                        if (fdig == null) {
-                            state.error("Must be a nonnegative integer", XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
+
+                        case SchemaType.FACET_WHITE_SPACE:
+                            wsr = translateWhitespaceCode(facet.getValue());
+                            if (baseImpl.getWhiteSpaceRule() > wsr) {
+                                wsr = SchemaType.WS_UNSPECIFIED;
+                                state.error(XmlErrorCodes.DATATYPE_WHITESPACE_RESTRICTION, null, facet);
+                                continue;
+                            }
+                            myFacets[code] = StscState.build_wsstring(wsr).get();
                             break;
-                        }
-                        if (fixedFacets[code] && !myFacets[code].valueEquals(fdig)) {
-                            state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
-                            continue;
-                        }
-                        if (myFacets[SchemaType.FACET_FRACTION_DIGITS] != null) {
-                            if (fdig.compareValue(myFacets[SchemaType.FACET_FRACTION_DIGITS]) > 0) {
-                                state.error(XmlErrorCodes.DATATYPE_FRACTION_DIGITS_RESTRICTION, null, facet);
-                            }
-                        }
-                        if (myFacets[SchemaType.FACET_TOTAL_DIGITS] != null) {
-                            if (fdig.compareValue(myFacets[SchemaType.FACET_TOTAL_DIGITS]) > 0) {
-                                state.error(XmlErrorCodes.DATATYPE_FRACTION_DIGITS_LE_TOTAL_DIGITS, null, facet);
-                            }
-                        }
-                        myFacets[code] = fdig;
-                        break;
-
-                    case SchemaType.FACET_MIN_EXCLUSIVE:
-                    case SchemaType.FACET_MIN_INCLUSIVE:
-                    case SchemaType.FACET_MAX_INCLUSIVE:
-                    case SchemaType.FACET_MAX_EXCLUSIVE:
-
-                        if (seenFacet[other_similar_limit(code)]) {
-                            state.error("Cannot define both inclusive and exclusive limit in the same restriciton", XmlErrorCodes.FACET_DUPLICATED, facet);
-                            continue;
-                        }
-                        boolean ismin = (code == SchemaType.FACET_MIN_EXCLUSIVE || code == SchemaType.FACET_MIN_INCLUSIVE);
-                        boolean isexclusive = (code == SchemaType.FACET_MIN_EXCLUSIVE || code == SchemaType.FACET_MAX_EXCLUSIVE);
-
-                        XmlAnySimpleType limit;
-                        try {
-                            limit = baseImpl.newValue(facet.getValue(), true);
-                        } catch (XmlValueOutOfRangeException e) {
-                            // note: this guarantees that the limit is a valid number in the
-                            // base data type!!
-                            switch (code) {
-                                case SchemaType.FACET_MIN_EXCLUSIVE:
-                                    state.error(XmlErrorCodes.DATATYPE_MIN_EXCLUSIVE_RESTRICTION,
-                                        new Object[]{e.getMessage()}, facet);
-                                    break;
-                                case SchemaType.FACET_MIN_INCLUSIVE:
-                                    state.error(XmlErrorCodes.DATATYPE_MIN_INCLUSIVE_RESTRICTION,
-                                        new Object[]{e.getMessage()}, facet);
-                                    break;
-                                case SchemaType.FACET_MAX_INCLUSIVE:
-                                    state.error(XmlErrorCodes.DATATYPE_MAX_INCLUSIVE_RESTRICTION,
-                                        new Object[]{e.getMessage()}, facet);
-                                    break;
-                                case SchemaType.FACET_MAX_EXCLUSIVE:
-                                    state.error(XmlErrorCodes.DATATYPE_MAX_EXCLUSIVE_RESTRICTION,
-                                        new Object[]{e.getMessage()}, facet);
-                                    break;
-                            }
-
-                            // BUGBUG: if there are actual schemas that redefine min/maxExclusive,
-                            // they will need this rule relaxed for them!!
-                            continue;
-                        }
-                        if (fixedFacets[code] && !myFacets[code].valueEquals(limit)) {
-                            state.error(XmlErrorCodes.FACET_FIXED, new Object[]{facetName}, facet);
-                            continue;
-                        }
-                        if (myFacets[code] != null) {
-                            SchemaType limitSType = limit.schemaType();
-                            if (limitSType != null && !limitSType.isSimpleType() &&
-                                limitSType.getContentType() == SchemaType.SIMPLE_CONTENT) {
-                                // in the case of complex types with simple content that has facets
-                                // we need to compare values based on the content type
-                                limit = baseImpl.getContentBasedOnType().newValue(facet.getValue());
-                            }
-
-                            int comparison = limit.compareValue(myFacets[code]);
-                            if (comparison == 2 || comparison == (ismin ? -1 : 1)) {
-                                state.error(ismin ?
-                                        (isexclusive ?
-                                            "Must be greater than or equal to previous minExclusive" :
-                                            "Must be greater than or equal to previous minInclusive") :
-                                        (isexclusive ?
-                                            "Must be less than or equal to previous maxExclusive" :
-                                            "Must be less than or equal to previous maxInclusive"),
-                                    XmlErrorCodes.FACET_VALUE_MALFORMED, facet);
-                                continue;
-                            }
-                        }
-                        myFacets[code] = limit;
-                        myFacets[other_similar_limit(code)] = null;
-                        break;
-
-                    case SchemaType.FACET_WHITE_SPACE:
-                        wsr = translateWhitespaceCode(facet.getValue());
-                        if (baseImpl.getWhiteSpaceRule() > wsr) {
-                            wsr = SchemaType.WS_UNSPECIFIED;
-                            state.error(XmlErrorCodes.DATATYPE_WHITESPACE_RESTRICTION, null, facet);
-                            continue;
-                        }
-                        myFacets[code] = StscState.build_wsstring(wsr).get();
-                        break;
-
-                    case SchemaType.FACET_ENUMERATION:
-                        XmlAnySimpleType enumval;
-                        try {
-                            enumval = baseImpl.newValue(facet.getValue(), true);
-                            // enumval.set(facet.getValue());
-                            // ((XmlObjectBase)enumval).setImmutable();
-                        } catch (XmlValueOutOfRangeException e) {
-                            state.error(XmlErrorCodes.DATATYPE_ENUM_RESTRICTION, new Object[]{facet.getValue().getStringValue(), e.getMessage()}, facet);
-                            continue;
-                        }
-                        if (enumeratedValues == null) {
-                            enumeratedValues = new ArrayList<>();
-                        }
-                        enumeratedValues.add(enumval);
-                        break;
-
-                    case SchemaType.FACET_PATTERN:
-                        RegularExpression p;
-                        try {
-                            p = new RegularExpression(facet.getValue().getStringValue(), "X");
-                        } catch (ParseException e) {
-                            state.error(XmlErrorCodes.PATTERN_REGEX, new Object[]{facet.getValue().getStringValue(), e.getMessage()}, facet);
-                            continue;
-                        }
-                        if (patterns == null) {
-                            patterns = new ArrayList<>();
-                        }
-                        patterns.add(p);
-                        break;
-                }
 
-                if (facet.getFixed()) {
-                    fixedFacets[code] = true;
+                        case SchemaType.FACET_ENUMERATION:
+                            XmlAnySimpleType enumval;
+                            try {
+                                enumval = baseImpl.newValue(facet.getValue(), true);
+                                // enumval.set(facet.getValue());
+                                // ((XmlObjectBase)enumval).setImmutable();
+                            } catch (XmlValueOutOfRangeException e) {
+                                state.error(XmlErrorCodes.DATATYPE_ENUM_RESTRICTION, new Object[]{facet.getValue().getStringValue(), e.getMessage()}, facet);
+                                continue;
+                            }
+                            if (enumeratedValues == null) {
+                                enumeratedValues = new ArrayList<>();
+                            }
+                            enumeratedValues.add(enumval);
+                            break;
+
+                        case SchemaType.FACET_PATTERN:
+                            RegularExpression p;
+                            try {
+                                p = new RegularExpression(facet.getValue().getStringValue(), "X");
+                            } catch (ParseException e) {
+                                state.error(XmlErrorCodes.PATTERN_REGEX, new Object[]{facet.getValue().getStringValue(), e.getMessage()}, facet);
+                                continue;
+                            }
+                            if (patterns == null) {
+                                patterns = new ArrayList<>();
+                            }
+                            patterns.add(p);
+                            break;
+                    }
+
+                    if (facet.getFixed()) {
+                        fixedFacets[code] = true;
+                    }
                 }
             }
         }

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscTranslator.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscTranslator.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscTranslator.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/StscTranslator.java Thu Jan  6 17:54:30 2022
@@ -697,13 +697,14 @@ public class StscTranslator {
     }
 
     static FormChoice findElementFormDefault(XmlObject obj) {
-        XmlCursor cur = obj.newCursor();
-        while (cur.getObject().schemaType() != Schema.type) {
-            if (!cur.toParent()) {
-                return null;
+        try (XmlCursor cur = obj.newCursor()) {
+            while (cur.getObject().schemaType() != Schema.type) {
+                if (!cur.toParent()) {
+                    return null;
+                }
             }
+            return ((Schema) cur.getObject()).xgetElementFormDefault();
         }
-        return ((Schema) cur.getObject()).xgetElementFormDefault();
     }
 
     public static boolean uriMatch(String s1, String s2) {
@@ -993,9 +994,10 @@ public class StscTranslator {
         }
 
         SOAPArrayType wat = null;
-        XmlCursor c = xsdElt.newCursor();
-        String arrayType = c.getAttributeText(WSDL_ARRAYTYPE_NAME);
-        c.dispose();
+        String arrayType;
+        try (XmlCursor c = xsdElt.newCursor()) {
+            arrayType = c.getAttributeText(WSDL_ARRAYTYPE_NAME);
+        }
         if (arrayType != null) {
             try {
                 wat = new SOAPArrayType(arrayType, new NamespaceContext(xsdElt));
@@ -1206,13 +1208,12 @@ public class StscTranslator {
         ic.setUserData(getUserData(parseIC));
 
         // Set the ns map
-        XmlCursor c = parseIC.newCursor();
         Map<String, String> nsMap = new HashMap<>();
-
-        c.getAllNamespaces(nsMap);
+        try (XmlCursor c = parseIC.newCursor()) {
+            c.getAllNamespaces(nsMap);
+        }
         nsMap.remove(""); // Remove the default mapping. This cannot be used by the xpath expressions.
         ic.setNSMap(nsMap);
-        c.dispose();
 
         String[] fields = new String[fieldElts.length];
         for (int j = 0; j < fields.length; j++) {
@@ -1271,13 +1272,14 @@ public class StscTranslator {
     }
 
     static FormChoice findAttributeFormDefault(XmlObject obj) {
-        XmlCursor cur = obj.newCursor();
-        while (cur.getObject().schemaType() != Schema.type) {
-            if (!cur.toParent()) {
-                return null;
+        try (XmlCursor cur = obj.newCursor()) {
+            while (cur.getObject().schemaType() != Schema.type) {
+                if (!cur.toParent()) {
+                    return null;
+                }
             }
+            return ((Schema) cur.getObject()).xgetAttributeFormDefault();
         }
-        return ((Schema) cur.getObject()).xgetAttributeFormDefault();
     }
 
     static SchemaLocalAttributeImpl translateAttribute(
@@ -1461,9 +1463,10 @@ public class StscTranslator {
         }
 
         SOAPArrayType wat = null;
-        XmlCursor c = xsdAttr.newCursor();
-        String arrayType = c.getAttributeText(WSDL_ARRAYTYPE_NAME);
-        c.dispose();
+        String arrayType;
+        try (XmlCursor c = xsdAttr.newCursor()) {
+            arrayType = c.getAttributeText(WSDL_ARRAYTYPE_NAME);
+        }
         if (arrayType != null) {
             try {
                 wat = new SOAPArrayType(arrayType, new NamespaceContext(xsdAttr));
@@ -1551,7 +1554,10 @@ public class StscTranslator {
 
 
     private static Object getUserData(XmlObject pos) {
-        XmlCursor.XmlBookmark b = pos.newCursor().getBookmark(SchemaBookmark.class);
+        XmlCursor.XmlBookmark b;
+        try (XmlCursor c = pos.newCursor()) {
+            b = c.getBookmark(SchemaBookmark.class);
+        }
         if (b instanceof SchemaBookmark) {
             return ((SchemaBookmark) b).getValue();
         } else {
@@ -1560,10 +1566,9 @@ public class StscTranslator {
     }
 
     private static boolean isEmptySchema(Schema schema) {
-        XmlCursor cursor = schema.newCursor();
-        boolean result = !cursor.toFirstChild();
-        cursor.dispose();
-        return result;
+        try (XmlCursor cursor = schema.newCursor()) {
+            return !cursor.toFirstChild();
+        }
     }
 
     private static boolean isReservedTypeName(QName name) {

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java?rev=1896764&r1=1896763&r2=1896764&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java Thu Jan  6 17:54:30 2022
@@ -614,10 +614,9 @@ public final class Cursor implements Xml
 
         boolean seenElement = false;
 
-        XmlCursor c = newCursor();
-        int token = c.toNextToken().intValue();
+        try (XmlCursor c = newCursor()) {
+            int token = c.toNextToken().intValue();
 
-        try {
             LOOP:
             for (; ; ) {
                 switch (token) {
@@ -655,8 +654,6 @@ public final class Cursor implements Xml
                         break LOOP;
                 }
             }
-        } finally {
-            c.dispose();
         }
 
         return !seenElement;
@@ -1908,12 +1905,19 @@ public final class Cursor implements Xml
         return _cur._locale.noSync();
     }
 
-    public void dispose() {
+    @Override
+    public void close() {
         if (_cur != null) {
             syncWrap(this::_dispose);
         }
     }
 
+    @Override
+    @Deprecated
+    public void dispose() {
+        close();
+    }
+
     public Object monitor() {
         return syncWrap(this::_monitor);
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org