[ 
https://issues.apache.org/jira/browse/TEXT-243?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aryan Ganjoo updated TEXT-243:
------------------------------
    Description: 
h3. Observed

{{StringSubstitutorReader}} inherits {{FilterReader.skip(long)}}, which skips 
characters in the wrapped template reader rather than in the substituted 
output. For example, with template {{${v}Z}} and {{v = abc}}, {{skip(1)}} 
reports one skipped character but the next output is the remaining unexpanded 
template fragment instead of {{bcZ}}. Buffered output and substitutions that 
contract the stream also give incorrect skip positions or counts.

h3. Expected

{{skip(n)}} should consume up to {{n}} characters of the stream returned by 
this reader, consistent with the {{Reader.skip}} contract. It should not call 
{{skip}} on the wrapped template reader.

h3. Reproduction and validation

A local test using {{new StringSubstitutorReader(new StringReader("${v}Z"), new 
StringSubstitutor(Collections.singletonMap("v", "abc")))}} reproduces the 
mismatch. The affected production code is unchanged on current Commons Text 
master {{f5bec9dd7becc3a20f3e949fb2391456a94611c3}}. An earlier pristine-source 
regression run had 10 failures among 14 new cases. A local corrected candidate 
passes 18 focused skip tests and the default Maven build (2,007 tests, zero 
failures/errors, three skips); a separate independent read-only review found no 
concrete P1/P2 issue. Java 8, hosted CI, and downstream usage were not tested.

h3. Possible fix

Implement {{skip(long)}} by consuming the substituted output through this 
reader’s {{read}} path, and reject use after the wrapper is closed. This is a 
local candidate, not a submitted PR. AI assistance was used for discovery, test 
and patch preparation, and validation.

  was:
h3. Observed

{{StringSubstitutorReader}} inherits {{FilterReader.skip(long)}}, which skips 
characters in the wrapped template reader rather than in the substituted 
output. For example, with template {{${v}Z}} and {{v = abc}}, {{skip(1)}} 
reports one skipped character but the next output is {{{v}Z}} instead of 
{{bcZ}}. Buffered output and substitutions that contract the stream also give 
incorrect skip positions or counts.

h3. Expected

{{skip(n)}} should consume up to {{n}} characters of the stream returned by 
this reader, consistent with the {{Reader.skip}} contract. It should not call 
{{skip}} on the wrapped template reader.

h3. Reproduction and validation

A local test using {{new StringSubstitutorReader(new StringReader("${v}Z"), new 
StringSubstitutor(Collections.singletonMap("v", "abc")))}} reproduces the 
mismatch. The affected production code is unchanged on current Commons Text 
master {{f5bec9dd7becc3a20f3e949fb2391456a94611c3}}. An earlier pristine-source 
regression run had 10 failures among 14 new cases. A local corrected candidate 
passes 18 focused skip tests and the default Maven build (2,007 tests, zero 
failures/errors, three skips); a separate independent read-only review found no 
concrete P1/P2 issue. Java 8, hosted CI, and downstream usage were not tested.

h3. Possible fix

Implement {{skip(long)}} by consuming the substituted output through this 
reader’s {{read}} path, and reject use after the wrapper is closed. This is a 
local candidate, not a submitted PR. AI assistance was used for discovery, test 
and patch preparation, and validation.


> StringSubstitutorReader.skip advances the template, not the substituted output
> ------------------------------------------------------------------------------
>
>                 Key: TEXT-243
>                 URL: https://issues.apache.org/jira/browse/TEXT-243
>             Project: Commons Text
>          Issue Type: Bug
>            Reporter: Aryan Ganjoo
>            Priority: Minor
>
> h3. Observed
> {{StringSubstitutorReader}} inherits {{FilterReader.skip(long)}}, which skips 
> characters in the wrapped template reader rather than in the substituted 
> output. For example, with template {{${v}Z}} and {{v = abc}}, {{skip(1)}} 
> reports one skipped character but the next output is the remaining unexpanded 
> template fragment instead of {{bcZ}}. Buffered output and substitutions that 
> contract the stream also give incorrect skip positions or counts.
> h3. Expected
> {{skip(n)}} should consume up to {{n}} characters of the stream returned by 
> this reader, consistent with the {{Reader.skip}} contract. It should not call 
> {{skip}} on the wrapped template reader.
> h3. Reproduction and validation
> A local test using {{new StringSubstitutorReader(new StringReader("${v}Z"), 
> new StringSubstitutor(Collections.singletonMap("v", "abc")))}} reproduces the 
> mismatch. The affected production code is unchanged on current Commons Text 
> master {{f5bec9dd7becc3a20f3e949fb2391456a94611c3}}. An earlier 
> pristine-source regression run had 10 failures among 14 new cases. A local 
> corrected candidate passes 18 focused skip tests and the default Maven build 
> (2,007 tests, zero failures/errors, three skips); a separate independent 
> read-only review found no concrete P1/P2 issue. Java 8, hosted CI, and 
> downstream usage were not tested.
> h3. Possible fix
> Implement {{skip(long)}} by consuming the substituted output through this 
> reader’s {{read}} path, and reject use after the wrapper is closed. This is a 
> local candidate, not a submitted PR. AI assistance was used for discovery, 
> test and patch preparation, and validation.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to