summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsnowleo <schneeleo@gmail.com>2012-01-16 04:51:27 +0100
committersnowleo <schneeleo@gmail.com>2012-01-16 04:51:27 +0100
commitf26cccb663b3cd255bbfe3b72499b0efdd3da279 (patch)
tree3ab2991bdd89a38288b9ab3b9f987acffcc23b5f
parent81ec87d893db63a749828fba9af851ed07076cca (diff)
downloadEssentials-f26cccb663b3cd255bbfe3b72499b0efdd3da279.tar
Essentials-f26cccb663b3cd255bbfe3b72499b0efdd3da279.tar.gz
Essentials-f26cccb663b3cd255bbfe3b72499b0efdd3da279.tar.lz
Essentials-f26cccb663b3cd255bbfe3b72499b0efdd3da279.tar.xz
Essentials-f26cccb663b3cd255bbfe3b72499b0efdd3da279.zip
Optimize TextInput to cache motd and info textfiles.
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java13
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/TextInput.java77
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<String> replaced;
private final transient IEssentials ess;
-
+
public KeywordReplacer(final IText input, final CommandSender sender, final IEssentials ess)
{
this.input = input;
+ this.replaced = new ArrayList<String>(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<String> 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<String> lines = new ArrayList<String>();
- private final transient List<String> chapters = new ArrayList<String>();
- private final transient Map<String, Integer> bookmarks = new HashMap<String, Integer>();
+ private final transient List<String> lines;
+ private final transient List<String> chapters;
+ private final transient Map<String, Integer> bookmarks;
+ private final transient long lastChange;
+ private final static HashMap<String, SoftReference<TextInput>> cache = new HashMap<String, SoftReference<TextInput>>();
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<TextInput> 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<String>();
+ chapters = new ArrayList<String>();
+ bookmarks = new HashMap<String, Integer>();
+ cache.put(file.getName(), new SoftReference<TextInput>(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);