Merge branch 'master' of github.com:essentials/Essentials into essmaster

This commit is contained in:
KHobbits 2011-11-18 12:07:11 +00:00
commit 37bd9bc9b5
3 changed files with 50 additions and 38 deletions

View File

@ -1,12 +1,17 @@
package com.earth2me.essentials; package com.earth2me.essentials;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
public class ExecuteTimer public class ExecuteTimer
{ {
private final List<ExecuteRecord> times; private final transient List<ExecuteRecord> times;
private final transient DecimalFormat decimalFormat = new DecimalFormat("#0.000", DecimalFormatSymbols.getInstance(Locale.US));
public ExecuteTimer() public ExecuteTimer()
{ {
@ -24,7 +29,7 @@ public class ExecuteTimer
{ {
if (!times.isEmpty() || "start".equals(label)) if (!times.isEmpty() || "start".equals(label))
{ {
times.add(new ExecuteRecord(label, System.currentTimeMillis())); times.add(new ExecuteRecord(label, System.nanoTime()));
} }
} }
@ -36,7 +41,7 @@ public class ExecuteTimer
long time0 = 0; long time0 = 0;
long time1 = 0; long time1 = 0;
long time2 = 0; long time2 = 0;
long duration; double duration;
for (ExecuteRecord pair : times) for (ExecuteRecord pair : times)
{ {
@ -44,8 +49,8 @@ public class ExecuteTimer
time2 = (Long)pair.getTime(); time2 = (Long)pair.getTime();
if (time1 > 0) if (time1 > 0)
{ {
duration = time2 - time1; duration = (time2 - time1)/1000000.0;
output.append(mark).append(": ").append(duration).append("ms - "); output.append(mark).append(": ").append(decimalFormat.format(duration)).append("ms - ");
} }
else else
{ {
@ -53,8 +58,8 @@ public class ExecuteTimer
} }
time1 = time2; time1 = time2;
} }
duration = time1 - time0; duration = (time1 - time0)/1000000.0;
output.append("Total: ").append(duration).append("ms"); output.append("Total: ").append(decimalFormat.format(duration)).append("ms");
times.clear(); times.clear();
return output.toString(); return output.toString();
} }

View File

@ -1,24 +1,27 @@
package com.earth2me.essentials; package com.earth2me.essentials;
import com.google.common.base.Function; import com.google.common.cache.Cache;
import com.google.common.collect.ComputationException; import com.google.common.cache.CacheBuilder;
import com.google.common.collect.MapMaker; import com.google.common.cache.CacheLoader;
import com.google.common.collect.ConcurrentHashMultiset;
import java.io.File; import java.io.File;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class UserMap implements Function<String, User>, IConf public class UserMap extends CacheLoader<String, User> implements IConf
{ {
private final transient IEssentials ess; private final transient IEssentials ess;
private final transient ConcurrentMap<String, User> users = new MapMaker().softValues().makeComputingMap(this); private final transient Cache<String, User> users = CacheBuilder.newBuilder().softValues().build(this);
private final transient ConcurrentHashMultiset<String> keys = ConcurrentHashMultiset.create();
public UserMap(final IEssentials ess) public UserMap(final IEssentials ess)
{ {
super();
this.ess = ess; this.ess = ess;
loadAllUsersAsync(ess); loadAllUsersAsync(ess);
} }
@ -35,6 +38,8 @@ public class UserMap implements Function<String, User>, IConf
{ {
return; return;
} }
keys.clear();
users.invalidateAll();
for (String string : userdir.list()) for (String string : userdir.list())
{ {
if (!string.endsWith(".yml")) if (!string.endsWith(".yml"))
@ -42,18 +47,7 @@ public class UserMap implements Function<String, User>, IConf
continue; continue;
} }
final String name = string.substring(0, string.length() - 4); final String name = string.substring(0, string.length() - 4);
try keys.add(name.toLowerCase());
{
users.get(name.toLowerCase());
}
catch (NullPointerException ex)
{
// Ignore these
}
catch (ComputationException ex)
{
Bukkit.getLogger().log(Level.INFO, "Failed to preload user " + name, ex);
}
} }
} }
}); });
@ -61,21 +55,29 @@ public class UserMap implements Function<String, User>, IConf
public boolean userExists(final String name) public boolean userExists(final String name)
{ {
return users.containsKey(name.toLowerCase()); return keys.contains(name.toLowerCase());
} }
public User getUser(final String name) throws NullPointerException public User getUser(final String name) throws NullPointerException
{ {
return users.get(name.toLowerCase()); try
{
return users.get(name.toLowerCase());
}
catch (ExecutionException ex)
{
throw new NullPointerException();
}
} }
@Override @Override
public User apply(final String name) public User load(final String name) throws Exception
{ {
for (Player player : ess.getServer().getOnlinePlayers()) for (Player player : ess.getServer().getOnlinePlayers())
{ {
if (player.getName().equalsIgnoreCase(name)) if (player.getName().equalsIgnoreCase(name))
{ {
keys.add(name.toLowerCase());
return new User(player, ess); return new User(player, ess);
} }
} }
@ -83,37 +85,43 @@ public class UserMap implements Function<String, User>, IConf
final File userFile = new File(userFolder, Util.sanitizeFileName(name) + ".yml"); final File userFile = new File(userFolder, Util.sanitizeFileName(name) + ".yml");
if (userFile.exists()) if (userFile.exists())
{ {
keys.add(name.toLowerCase());
return new User(new OfflinePlayer(name, ess), ess); return new User(new OfflinePlayer(name, ess), ess);
} }
return null; throw new Exception("User not found!");
} }
@Override @Override
public void reloadConfig() public void reloadConfig()
{ {
for (User user : users.values()) loadAllUsersAsync(ess);
{
user.reloadConfig();
}
} }
public void removeUser(final String name) public void removeUser(final String name)
{ {
users.remove(name.toLowerCase()); keys.remove(name.toLowerCase());
users.invalidate(name.toLowerCase());
} }
public Set<User> getAllUsers() public Set<User> getAllUsers()
{ {
final Set<User> userSet = new HashSet<User>(); final Set<User> userSet = new HashSet<User>();
for (String name : users.keySet()) for (String name : keys)
{ {
userSet.add(users.get(name)); try
{
userSet.add(users.get(name));
}
catch (ExecutionException ex)
{
Bukkit.getLogger().log(Level.INFO, "Failed to load user " + name, ex);
}
} }
return userSet; return userSet;
} }
public int getUniqueUsers() public int getUniqueUsers()
{ {
return users.size(); return keys.size();
} }
} }

View File

@ -17,7 +17,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import quicktime.streaming.Stream;
public class TextInput implements IText public class TextInput implements IText