]> source.dussan.org Git - poi.git/commitdiff
Reduce calls to utf-related methods - the integration test took ages because of poc...
authorAndreas Beeker <kiwiwings@apache.org>
Mon, 16 May 2016 10:02:13 +0000 (10:02 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Mon, 16 May 2016 10:02:13 +0000 (10:02 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1744005 13f79535-47bb-0310-9956-ffa450edef68

src/examples/src/org/apache/poi/xssf/eventusermodel/examples/FromHowTo.java

index 87c6c2ca5e8d396a3c7bbe0186ea29124a593ba1..644cb04efc205cad4787739b821c44166db82e06 100644 (file)
@@ -18,6 +18,8 @@ package org.apache.poi.xssf.eventusermodel.examples;
 
 import java.io.InputStream;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import org.apache.poi.openxml4j.opc.PackageAccess;
 import org.apache.poi.xssf.eventusermodel.XLSX2CSV;
@@ -92,11 +94,26 @@ public class FromHowTo {
         * See org.xml.sax.helpers.DefaultHandler javadocs
         */
        private static class SheetHandler extends DefaultHandler {
-               private SharedStringsTable sst;
+               private final SharedStringsTable sst;
                private String lastContents;
                private boolean nextIsString;
                private boolean inlineStr;
+               private final LruCache<Integer,String> lruCache = new LruCache<Integer,String>(50);
 
+               private static class LruCache<A,B> extends LinkedHashMap<A, B> {
+                   private final int maxEntries;
+
+                   public LruCache(final int maxEntries) {
+                       super(maxEntries + 1, 1.0f, true);
+                       this.maxEntries = maxEntries;
+                   }
+
+                   @Override
+                   protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
+                       return super.size() > maxEntries;
+                   }
+               }
+               
                private SheetHandler(SharedStringsTable sst) {
                        this.sst = sst;
                }
@@ -121,8 +138,12 @@ public class FromHowTo {
                        // Process the last contents as required.
                        // Do now, as characters() may be called more than once
                        if(nextIsString) {
-                               int idx = Integer.parseInt(lastContents);
-                               lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
+                               Integer idx = Integer.valueOf(lastContents);
+                               lastContents = lruCache.get(idx);
+                               if (lastContents == null && !lruCache.containsKey(idx)) {
+                                   lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
+                                   lruCache.put(idx, lastContents);
+                               }
                                nextIsString = false;
                        }