From f26cccb663b3cd255bbfe3b72499b0efdd3da279 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 04:51:27 +0100 Subject: Optimize TextInput to cache motd and info textfiles. --- .../essentials/textreader/KeywordReplacer.java | 13 ++-- .../earth2me/essentials/textreader/TextInput.java | 77 +++++++++++++++------- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index 782798bff..a7aab67ba 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.DescParseTickFormat; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import java.text.DateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -16,15 +17,17 @@ import org.bukkit.plugin.Plugin; public class KeywordReplacer implements IText { private final transient IText input; + private final transient List replaced; private final transient IEssentials ess; - + public KeywordReplacer(final IText input, final CommandSender sender, final IEssentials ess) { this.input = input; + this.replaced = new ArrayList(this.input.getLines().size()); this.ess = ess; replaceKeywords(sender); } - + private void replaceKeywords(final CommandSender sender) { String displayName, ipAddress, balance, mails, world; @@ -98,7 +101,7 @@ public class KeywordReplacer implements IText date = DateFormat.getDateInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); time = DateFormat.getTimeInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); - + version = ess.getServer().getVersion(); for (int i = 0; i < input.getLines().size(); i++) @@ -120,14 +123,14 @@ public class KeywordReplacer implements IText line = line.replace("{WORLDDATE}", worldDate); line = line.replace("{PLUGINS}", plugins); line = line.replace("{VERSION}", version); - input.getLines().set(i, line); + replaced.add(line); } } @Override public List getLines() { - return input.getLines(); + return replaced; } @Override diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java index b25c30d51..316a0b576 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import java.io.*; +import java.lang.ref.SoftReference; import java.util.*; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -11,9 +12,11 @@ import org.bukkit.entity.Player; public class TextInput implements IText { - private final transient List lines = new ArrayList(); - private final transient List chapters = new ArrayList(); - private final transient Map bookmarks = new HashMap(); + private final transient List lines; + private final transient List chapters; + private final transient Map bookmarks; + private final transient long lastChange; + private final static HashMap> cache = new HashMap>(); public TextInput(final CommandSender sender, final String filename, final boolean createFile, final IEssentials ess) throws IOException { @@ -34,33 +37,62 @@ public class TextInput implements IText } if (file.exists()) { - final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); - try + lastChange = file.lastModified(); + boolean readFromfile; + synchronized (cache) { - int lineNumber = 0; - while (bufferedReader.ready()) + final SoftReference inputRef = cache.get(file.getName()); + TextInput input; + if (inputRef == null || (input = inputRef.get()) == null || input.lastChange < lastChange) { - final String line = bufferedReader.readLine(); - if (line == null) - { - break; - } - if (line.length() > 0 && line.charAt(0) == '#') - { - bookmarks.put(line.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("&[0-9a-f]", ""), lineNumber); - chapters.add(line.substring(1).replace('&', '§').replace("§§", "&")); - } - lines.add(line.replace('&', '§').replace("§§", "&")); - lineNumber++; + lines = new ArrayList(); + chapters = new ArrayList(); + bookmarks = new HashMap(); + cache.put(file.getName(), new SoftReference(this)); + readFromfile = true; + } + else + { + lines = Collections.unmodifiableList(input.getLines()); + chapters = Collections.unmodifiableList(input.getChapters()); + bookmarks = Collections.unmodifiableMap(input.getBookmarks()); + readFromfile = false; } } - finally + if (readFromfile) { - bufferedReader.close(); + final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + try + { + int lineNumber = 0; + while (bufferedReader.ready()) + { + final String line = bufferedReader.readLine(); + if (line == null) + { + break; + } + if (line.length() > 0 && line.charAt(0) == '#') + { + bookmarks.put(line.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("&[0-9a-f]", ""), lineNumber); + chapters.add(line.substring(1).replace('&', '§').replace("§§", "&")); + } + lines.add(line.replace('&', '§').replace("§§", "&")); + lineNumber++; + } + } + finally + { + bufferedReader.close(); + } } } else { + lastChange = 0; + lines = Collections.emptyList(); + chapters = Collections.emptyList(); + bookmarks = Collections.emptyMap(); if (createFile) { final InputStream input = ess.getResource(filename + ".txt"); @@ -68,8 +100,7 @@ public class TextInput implements IText try { final byte[] buffer = new byte[1024]; - int length = 0; - length = input.read(buffer); + int length = input.read(buffer); while (length > 0) { output.write(buffer, 0, length); -- cgit v1.2.3