pjfanning opened a new pull request, #100:
URL: https://github.com/apache/poi-xmlbeans/pull/100

   Started as the `StscTranslator.buildBigInt` item — parse the numeric facets 
of a schema under the configured limit rather than the hardcoded default. 
Tracing it showed `buildBigInt` was never even reached, and two paths on the 
way to it threw instead of reporting.
   
   ### 1. `buildBigInt` used the default limit — `StscTranslator:1515`
   
   `totalDigits`, `maxLength` and the other numeric facets are numbers in a 
schema document, and schemas are input too — in `scomp`, `xsd2inst` and 
downloaded imports, not always trusted ones. `StscState.setOptions` already 
receives the `XmlOptions` and keeps a handful of fields, so 
`_maxNumberOfCharsForNumbers` joins them.
   
   ### 2. Schema validation dropped the options — `SchemaTypeSystemCompiler:228`
   
   ```java
   XmlOptions validateOptions = new XmlOptions().setErrorListener(errorWatcher);
   if (options != null && options.isValidateTreatLaxAsSkip()) { ... }
   ```
   
   A fresh `XmlOptions` carrying the error listener and one flag, so the limit 
never reached the validation pass that runs over the schema documents. This is 
what made 1 unreachable: validation failed on the facet before compilation 
looked at it.
   
   ### 3. `validate()` threw instead of reporting — `Validator:1113`
   
   Not schema-specific. `validateAtomicType` parsed the decimal outside the 
`ValidationContext`:
   
   ```
   XmlInteger 2000-digit .validate() -> IllegalArgumentException: Number has 
more than 1024 characters
   XmlDecimal 2000-digit .validate() -> IllegalArgumentException: Number has 
more than 1024 characters
   XmlDouble  2000-digit .validate() -> returned false, 1 error
   ```
   
   `xs:double` behaves correctly because `JavaDoubleHolderEx.validateLexical` 
takes the limit and reports through the context. The decimal branch never got 
the same treatment: the lexical check preceding it validates characters but not 
length, so nothing is reported and the parse throws. `validate()` is the method 
that says what is wrong with a document — a number past the limit is bad input 
like any other and now comes back as an error.
   
   ### 4. `buildBigInt` threw while materialising the facet — 
`StscTranslator:1512`
   
   `value.getStringValue()` sat outside the method's own `try`, and it can fail 
in its own right: it triggers the lazy `set_text` on the facet's typed value 
under the schema document's limit. A schema loaded with a lower limit than the 
number it declares threw `XmlValueOutOfRangeException` out of `compileXsd`. 
Moved inside.
   
   ### Note on raising the limit
   
   The limit is fixed when a document is loaded, so a schema has to be *parsed* 
with the raised options as well as compiled with them. Passing raised options 
only to `compileXsd` leaves the schema document itself on the default, and the 
facet is rejected when its text is materialised — now as a reported error 
rather than a thrown one. The tooling paths already pass one `XmlOptions` to 
both.
   
   ### Tests
   
   `testValidateReportsAnOverLongNumber` covers 3 for `xs:integer` and 
`xs:decimal`. `testSchemaCompileHonoursLimit` covers 1 and 2 — a schema whose 
`maxLength` facet is 2000 digits compiles under `maxChars(4096)` and is 
reported invalid under the default.
   
   Full suite: 3090 tests, 0 failures.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to