This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch bugfix/SLING-10215
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-repoinit-parser.git

commit 4455ec51e734a25b85abab5b20fa8cfcb10929b6
Author: Konrad Windszus <[email protected]>
AuthorDate: Tue Mar 16 11:32:33 2021 +0100

    SLING-10215 don't stop reading when Reader.read(...) returns 0.
    
    Improve memory consumption by preventing the copy of the full repoinit
    section
---
 pom.xml                                            |  6 +++-
 .../parser/impl/RepoInitParserService.java         | 39 ++++++++++++++--------
 2 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/pom.xml b/pom.xml
index d8d234b..0d78786 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.sling</groupId>
     <artifactId>sling-bundle-parent</artifactId>
-    <version>40</version>
+    <version>41</version>
     <relativePath />
   </parent>
 
@@ -39,6 +39,10 @@
     <tag>HEAD</tag>
   </scm>
   
+  <properties>
+    
<project.build.outputTimestamp>2020-01-22T15:10:15Z</project.build.outputTimestamp>
+  </properties>
+
   <build>
     <plugins>
       <plugin>
diff --git 
a/src/main/java/org/apache/sling/repoinit/parser/impl/RepoInitParserService.java
 
b/src/main/java/org/apache/sling/repoinit/parser/impl/RepoInitParserService.java
index 8f3935e..4fdc817 100644
--- 
a/src/main/java/org/apache/sling/repoinit/parser/impl/RepoInitParserService.java
+++ 
b/src/main/java/org/apache/sling/repoinit/parser/impl/RepoInitParserService.java
@@ -18,10 +18,9 @@
  */
 package org.apache.sling.repoinit.parser.impl;
 
+import java.io.FilterReader;
 import java.io.IOException;
 import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.List;
 
 import org.apache.sling.repoinit.parser.RepoInitParser;
@@ -40,14 +39,9 @@ public class RepoInitParserService implements RepoInitParser 
{
     @Override
     public List<Operation> parse(final Reader r) throws 
RepoInitParsingException {
         // in order to avoid parsing problems with trailing comments we add a 
line feed at the end
-        try ( final StringWriter sw = new StringWriter()) {
-            final char[] buf = new char[2048];
-            int l;
-            while ( (l = r.read(buf)) > 0 ) {
-                sw.write(buf, 0, l);
-            }
-            try (final StringReader sr = new 
StringReader(sw.toString().concat("\n")) ){
-                return new RepoInitParserImpl(sr).parse();
+        try (final Reader readerWrapper = new 
AddTailingLinefeedFilterReader(r)) {
+            try {
+                return new RepoInitParserImpl(readerWrapper).parse();
             } catch (TokenMgrError tme) {
                 throw new RepoInitParsingException(tme.getMessage(), tme);
             } catch (ParseException pe) {
@@ -55,11 +49,28 @@ public class RepoInitParserService implements 
RepoInitParser {
             }
         } catch ( final IOException ioe ) {
             throw new RepoInitParsingException(ioe.getMessage(), ioe);
-        } finally {
-            try {
-                r.close();
-            } catch(IOException ignore) {
+        }
+    }
+    
+    private static final class AddTailingLinefeedFilterReader extends 
FilterReader {
+
+        private boolean alreadyAddedNewline;
+
+        protected AddTailingLinefeedFilterReader(Reader in) {
+            super(in);
+        }
+
+        @Override
+        public int read(char[] cbuf, int off, int len) throws IOException {
+            int result = super.read(cbuf, off, len);
+            if (result == -1 && !alreadyAddedNewline) {
+                cbuf[off] = '\n';
+                alreadyAddedNewline = true;
+                return 1;
+            } else {
+                return result;
             }
         }
+        
     }
 }

Reply via email to