UsersTable, processing

This commit is contained in:
Rsl1122 2017-08-23 13:39:14 +03:00
parent a4ae93390c
commit f635ccbf0a
14 changed files with 308 additions and 296 deletions

View File

@ -1,7 +1,10 @@
package main.java.com.djrapitops.plan.data.cache;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Session;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@ -16,11 +19,13 @@ import java.util.UUID;
public class SessionCache {
private static final Map<UUID, Session> activeSessions = new HashMap<>();
protected final Plan plugin;
/**
* Class Constructor.
*/
public SessionCache() {
public SessionCache(Plan plugin) {
this.plugin = plugin;
}
public void cacheSession(UUID uuid, Session session) {
@ -33,25 +38,11 @@ public class SessionCache {
return;
}
session.endSession(time);
// TODO DB Save the session.
}
/**
* Starts a session for a player at the current moment.
*
* @param uuid UUID of the player.
*/
@Deprecated
public void startSession(UUID uuid) {
}
/**
* Ends a session for a player at the current moment.
*
* @param uuid UUID of the player.
*/
@Deprecated
public void endSession(UUID uuid) {
try {
plugin.getDB().getSessionsTable().saveSession(uuid, session);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
/**

View File

@ -0,0 +1,38 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Action;
import main.java.com.djrapitops.plan.database.tables.Actions;
import java.sql.SQLException;
import java.util.UUID;
/**
* Processor for inserting a FIRST_LOGOUT Action.
*
* @author Rsl1122
* @since 4.0.0
*/
public class FirstLeaveProcessor extends PlayerProcessor {
private final Action leaveAction;
public FirstLeaveProcessor(UUID uuid, long time, int messagesSent) {
super(uuid);
leaveAction = new Action(time, Actions.FIRST_LOGOUT, "Messages sent: " + messagesSent);
}
@Override
public void process() {
try {
Plan.getInstance().getDB().getActionsTable().insertAction(getUUID(), leaveAction);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -4,8 +4,11 @@
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.cache.GeolocationCacheHandler;
import java.sql.SQLException;
import java.util.UUID;
/**
@ -26,6 +29,10 @@ public class IPUpdateProcessor extends PlayerProcessor {
public void process() {
UUID uuid = getUUID();
String country = GeolocationCacheHandler.getCountry(ip);
// TODO DB Update IP & Geolocation
try {
Plan.getInstance().getDB().getIpsTable().updateIP(uuid, ip, country);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -4,6 +4,10 @@
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import java.sql.SQLException;
import java.util.UUID;
/**
@ -19,6 +23,10 @@ public class KickProcessor extends PlayerProcessor {
@Override
public void process() {
UUID uuid = getUUID();
// TODO Update DB Kick +1
try {
Plan.getInstance().getDB().getUsersTable().kicked(uuid);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -4,6 +4,11 @@
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.Database;
import java.sql.SQLException;
import java.util.UUID;
/**
@ -25,6 +30,12 @@ public class NameProcessor extends PlayerProcessor {
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Name & Nicknames.
Database db = Plan.getInstance().getDB();
try {
db.getUsersTable().updateName(uuid, playerName);
db.getNicknamesTable().saveUserName(uuid, displayName);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -0,0 +1,28 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class OPProcessor extends PlayerProcessor {
private final boolean banned;
public OPProcessor(UUID uuid, boolean banned) {
super(uuid);
this.banned = banned;
}
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Ban status
}
}

View File

@ -4,8 +4,14 @@
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Action;
import main.java.com.djrapitops.plan.data.listeners.PlanPlayerListener;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.Actions;
import java.sql.SQLException;
import java.util.UUID;
/**
@ -17,19 +23,31 @@ public class RegisterProcessor extends PlayerProcessor {
private final long time;
private final int playersOnline;
private final String name;
public RegisterProcessor(UUID uuid, long time, int playersOnline) {
private final PlanPlayerListener listener;
public RegisterProcessor(PlanPlayerListener listener, UUID uuid, long time, String name, int playersOnline) {
super(uuid);
this.listener = listener;
this.time = time;
this.playersOnline = playersOnline;
this.name = name;
}
@Override
public void process() {
UUID uuid = getUUID();
if (Plan.getInstance().getDB().wasSeenBefore(uuid)) {
Database db = Plan.getInstance().getDB();
if (db.wasSeenBefore(uuid)) {
return;
}
// TODO DB Register
listener.addFirstLeaveCheck(uuid);
try {
db.getUsersTable().registerUser(uuid, time, name);
db.getActionsTable().insertAction(uuid, new Action(time, Actions.REGISTERED, "Online: " + playersOnline + " Players"));
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -38,6 +38,7 @@ public class PlanChatListener implements Listener {
}
Player p = event.getPlayer();
// TODO NameCache to DataCache
plugin.addToProcessQueue(new NameProcessor(p.getUniqueId(), p.getName(), p.getDisplayName()));
}
}

View File

@ -16,6 +16,8 @@ import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
/**
@ -29,6 +31,8 @@ public class PlanPlayerListener implements Listener {
private final Plan plugin;
private final DataCache cache;
private final Set<UUID> playersWithFirstSession;
/**
* Class Constructor.
*
@ -37,6 +41,7 @@ public class PlanPlayerListener implements Listener {
public PlanPlayerListener(Plan plugin) {
this.plugin = plugin;
cache = plugin.getDataCache();
playersWithFirstSession = new HashSet<>();
}
@EventHandler(priority = EventPriority.MONITOR)
@ -95,9 +100,9 @@ public class PlanPlayerListener implements Listener {
cache.cacheSession(uuid, Session.start(time, world, gm));
plugin.addToProcessQueue(
new RegisterProcessor(uuid, time, playersOnline), //TODO Add required variables after UsersTable is done.
new RegisterProcessor(this, uuid, time, playerName, playersOnline),
new IPUpdateProcessor(uuid, ip),
new NameProcessor(uuid, playerName, displayName),
new NameProcessor(uuid, playerName, displayName), // TODO NameCache to DataCache
new DBCommitProcessor(plugin.getDB())
);
}
@ -120,5 +125,16 @@ public class PlanPlayerListener implements Listener {
new BanProcessor(uuid, player.isBanned()),
new EndSessionProcessor(uuid, time)
);
int messagesSent = 0; // TODO messages Sent on first session
if (playersWithFirstSession.contains(uuid)) {
plugin.addToProcessQueue(new FirstLeaveProcessor(uuid, time, messagesSent));
}
}
// TODO MOVE TO DATACACHE
public void addFirstLeaveCheck(UUID uuid) {
playersWithFirstSession.add(uuid);
}
}

View File

@ -328,4 +328,8 @@ public abstract class Database {
}
public abstract void commit() throws SQLException;
public ActionsTable getActionsTable() {
return actionsTable;
}
}

View File

@ -20,6 +20,8 @@ import java.util.stream.Collectors;
*/
public class SessionsTable extends UserIDTable {
// TODO getLastPlayed(UUID, UUID)
private final String columnID = "id";
private final String columnSessionStart = "session_start";
private final String columnSessionEnd = "session_end";

View File

@ -0,0 +1,34 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class UserInfoTable extends UserIDTable {
//TODO Server Specific Table
private final String columnUserID = "user_ id";
private final String columnRegistered = "registered";
private final String columnOP = "opped";
private final String columnBanned = "banned";
private final String columnServerID = "server_id";
private final ServerTable serverTable;
public UserInfoTable(SQLDB db, boolean usingMySQL) {
super("plan_user_info", db, usingMySQL);
serverTable = db.getServerTable();
}
@Override
public boolean createTable() {
return false;
}
}

View File

@ -1,12 +1,9 @@
package main.java.com.djrapitops.plan.database.tables;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.database.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@ -20,36 +17,9 @@ public class UsersTable extends Table {
private final String columnID = "id";
private final String columnUUID = "uuid";
@Deprecated
private final String columnGeolocation;
@Deprecated
private final String columnLastGM;
@Deprecated
private final String columnLastGMSwapTime;
@Deprecated
private final String columnPlayTime;
@Deprecated
private final String columnLoginTimes;
@Deprecated
private final String columnLastPlayed;
@Deprecated
private final String columnDeaths;
@Deprecated
private final String columnMobKills;
private final String columnRegistered;
private final String columnName;
//TODO Server Specific Table (Also has registered on it)
@Deprecated
private final String columnOP;
@Deprecated
private final String columnBanned;
//
@Deprecated
private final String columnContainsBukkitData;
@Deprecated
private final String columnLastWorldSwapTime;
@Deprecated
private final String columnLastWorld;
private final String columnRegistered = "registered";
private final String columnName = "name";
private final String columnTimesKicked = "times_kicked";
public final String statementSelectID;
@ -60,24 +30,6 @@ public class UsersTable extends Table {
public UsersTable(SQLDB db, boolean usingMySQL) {
super("plan_users", db, usingMySQL);
statementSelectID = "(" + Select.from(tableName, tableName + "." + columnID).where(columnUUID + "=?").toString() + ")";
columnGeolocation = "geolocation";
columnLastGM = "last_gamemode";
columnLastGMSwapTime = "last_gamemode_swap";
columnPlayTime = "play_time";
columnLoginTimes = "login_times";
columnLastPlayed = "last_played";
columnMobKills = "mob_kills";
columnDeaths = "deaths";
columnRegistered = "registered";
columnOP = "opped";
columnName = "name";
columnBanned = "banned";
columnContainsBukkitData = "contains_bukkit_data";
columnLastWorldSwapTime = "last_world_swap";
columnLastWorld = "last_world";
}
/**
@ -89,37 +41,12 @@ public class UsersTable extends Table {
execute(TableSqlParser.createTable(tableName)
.primaryKeyIDColumn(usingMySQL, columnID, Sql.INT)
.column(columnUUID, Sql.varchar(36)).notNull().unique()
.column(columnGeolocation, Sql.varchar(50)).notNull()
.column(columnLastGM, Sql.varchar(15)).notNull()
.column(columnLastGMSwapTime, Sql.LONG).notNull()
.column(columnPlayTime, Sql.LONG).notNull()
.column(columnLoginTimes, Sql.INT).notNull()
.column(columnLastPlayed, Sql.LONG).notNull()
.column(columnDeaths, Sql.INT).notNull()
.column(columnMobKills, Sql.INT).notNull()
.column(columnRegistered, Sql.LONG).notNull()
.column(columnOP, Sql.BOOL).notNull().defaultValue(false)
.column(columnName, Sql.varchar(16)).notNull()
.column(columnBanned, Sql.BOOL).notNull().defaultValue(false)
.column(columnContainsBukkitData, Sql.BOOL).notNull().defaultValue(false)
.column(columnLastWorld, Sql.varchar(255)).notNull()
.column(columnLastWorldSwapTime, Sql.LONG).notNull()
.column(columnTimesKicked, Sql.INT).notNull().defaultValue("0")
.primaryKey(usingMySQL, columnID)
.toString()
);
int version = getVersion();
if (version < 3) {
alterTablesV3();
}
if (version < 4) {
alterTablesV4();
}
if (version < 5) {
alterTablesV5();
}
if (version < 8) {
alterTablesV8();
}
return true;
} catch (SQLException ex) {
Log.toLog(this.getClass().getName(), ex);
@ -127,100 +54,15 @@ public class UsersTable extends Table {
}
}
private void alterTablesV8() {
addColumns(
columnLastWorldSwapTime + " bigint NOT NULL DEFAULT 0",
columnLastWorld + " varchar(255) NOT NULL DEFAULT 'Unknown'"
);
}
private void alterTablesV5() {
removeColumns("age", "gender");
}
private void alterTablesV4() {
addColumns(
columnContainsBukkitData + " boolean NOT NULL DEFAULT 0",
columnOP + " boolean NOT NULL DEFAULT 0",
columnBanned + " boolean NOT NULL DEFAULT 0",
columnName + " varchar(16) NOT NULL DEFAULT 'Unknown'",
columnRegistered + " bigint NOT NULL DEFAULT 0"
);
}
private void alterTablesV3() {
addColumns(
columnDeaths + " integer NOT NULL DEFAULT 0",
columnMobKills + " integer NOT NULL DEFAULT 0"
);
removeColumns("player_kills");
}
/**
* @param uuid
* @return
* @throws SQLException
*/
public int getUserId(UUID uuid) throws SQLException {
return getUserId(uuid.toString());
}
/**
* @param uuid
* @return
* @throws SQLException
*/
public int getUserId(String uuid) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
int userId = -1;
statement = prepareStatement("SELECT " + columnID + " FROM " + tableName + " WHERE (" + columnUUID + "=?)");
statement.setString(1, uuid);
set = statement.executeQuery();
while (set.next()) {
userId = set.getInt(columnID);
}
return userId;
} finally {
close(set);
close(statement);
}
}
/**
* @param userID
* @return
* @throws SQLException
*/
public UUID getUserUUID(String userID) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
UUID uuid = null;
statement = prepareStatement("SELECT " + columnUUID + " FROM " + tableName + " WHERE (" + columnID + "=?)");
statement.setString(1, userID);
set = statement.executeQuery();
while (set.next()) {
uuid = UUID.fromString(set.getString(columnUUID));
}
return uuid;
} finally {
close(set);
close(statement);
}
}
/**
* @return @throws SQLException
*/
public Set<UUID> getSavedUUIDs() throws SQLException {
Benchmark.start("Get Saved UUIDS");
PreparedStatement statement = null;
ResultSet set = null;
try {
Set<UUID> uuids = new HashSet<>();
statement = prepareStatement("SELECT " + columnUUID + " FROM " + tableName);
statement = prepareStatement(Select.from(tableName, columnUUID).toString());
set = statement.executeQuery();
while (set.next()) {
UUID uuid = UUID.fromString(set.getString(columnUUID));
@ -228,9 +70,7 @@ public class UsersTable extends Table {
}
return uuids;
} finally {
close(set);
close(statement);
Benchmark.stop("Database", "Get Saved UUIDS");
close(set, statement);
}
}
@ -239,18 +79,10 @@ public class UsersTable extends Table {
* @return
*/
public boolean removeUser(UUID uuid) {
return removeUser(uuid.toString());
}
/**
* @param uuid
* @return
*/
public boolean removeUser(String uuid) {
PreparedStatement statement = null;
try {
statement = prepareStatement("DELETE FROM " + tableName + " WHERE (" + columnUUID + "=?)");
statement.setString(1, uuid);
statement.setString(1, uuid.toString());
statement.execute();
return true;
} catch (SQLException ex) {
@ -260,89 +92,6 @@ public class UsersTable extends Table {
}
}
/**
* @param uuids
* @return
* @throws SQLException
*/
public List<UUID> getContainsBukkitData(Collection<UUID> uuids) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
List<UUID> containsBukkitData = new ArrayList<>();
try {
statement = prepareStatement("SELECT " + columnContainsBukkitData + ", " + columnUUID + " FROM " + tableName);
set = statement.executeQuery();
while (set.next()) {
String uuidS = set.getString(columnUUID);
UUID uuid = UUID.fromString(uuidS);
if (!uuids.contains(uuid)) {
continue;
}
boolean contains = set.getBoolean(columnContainsBukkitData);
if (contains) {
containsBukkitData.add(uuid);
}
}
} finally {
close(statement);
close(set);
}
return containsBukkitData;
}
/**
* @param uuids
* @return
* @throws SQLException
*/
public Map<UUID, Integer> getUserIds(Collection<UUID> uuids) throws SQLException {
Benchmark.start("Get User IDS Multiple");
PreparedStatement statement = null;
ResultSet set = null;
try {
Map<UUID, Integer> ids = new HashMap<>();
statement = prepareStatement("SELECT " + columnUUID + ", " + columnID + " FROM " + tableName);
set = statement.executeQuery();
while (set.next()) {
String uuidS = set.getString(columnUUID);
UUID uuid = UUID.fromString(uuidS);
if (!uuids.contains(uuid)) {
continue;
}
ids.put(uuid, set.getInt(columnID));
}
return ids;
} finally {
close(set);
close(statement);
Benchmark.stop("Database", "Get User IDS Multiple");
}
}
/**
* @return @throws SQLException
*/
public Map<UUID, Integer> getAllUserIds() throws SQLException {
Benchmark.start("Get User IDS ALL");
PreparedStatement statement = null;
ResultSet set = null;
try {
Map<UUID, Integer> ids = new HashMap<>();
statement = prepareStatement("SELECT " + columnUUID + ", " + columnID + " FROM " + tableName);
set = statement.executeQuery();
while (set.next()) {
String uuidS = set.getString(columnUUID);
UUID uuid = UUID.fromString(uuidS);
ids.put(uuid, set.getInt(columnID));
}
return ids;
} finally {
close(set);
close(statement);
Benchmark.stop("Database", "Get User IDS ALL");
}
}
/**
* @return
*/
@ -350,6 +99,10 @@ public class UsersTable extends Table {
return columnID;
}
public String getColumnUUID() {
return columnUUID;
}
/**
* @param playername
* @return
@ -359,7 +112,9 @@ public class UsersTable extends Table {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement("SELECT " + columnUUID + " FROM " + tableName + " WHERE (UPPER(" + columnName + ")=UPPER(?))");
statement = prepareStatement(Select.from(tableName, columnUUID)
.where("UPPER(" + columnName + ")=UPPER(?)")
.toString());
statement.setString(1, playername);
set = statement.executeQuery();
if (set.next()) {
@ -368,17 +123,111 @@ public class UsersTable extends Table {
}
return null;
} finally {
close(set);
close(set, statement);
}
}
public List<Long> getRegisterDates() throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName, columnRegistered).toString());
set = statement.executeQuery();
List<Long> registerDates = new ArrayList<>();
while (set.next()) {
registerDates.add(set.getLong(columnRegistered));
}
return registerDates;
} finally {
close(set, statement);
}
}
/**
* Register a new user (UUID) to the database.
*
* @param uuid UUID of the player.
* @param registered Register date.
* @param name Name of the player.
* @throws SQLException
* @throws IllegalArgumentException If uuid or name are null.
*/
public void registerUser(UUID uuid, long registered, String name) throws SQLException {
Verify.nullCheck(uuid, name);
PreparedStatement statement = null;
try {
statement = prepareStatement(Insert.values(tableName,
columnUUID,
columnRegistered,
columnName));
statement.setString(1, uuid.toString());
statement.setLong(2, registered);
statement.setString(3, name);
statement.execute();
} finally {
close(statement);
}
}
public List<UserData> getUserData(List<UUID> uuids) {
// TODO Rewrite method for new UserData objects.
return new ArrayList<>();
public boolean isRegistered(UUID uuid) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName, columnID)
.where(columnUUID + "=?")
.toString());
statement.setString(1, uuid.toString());
set = statement.executeQuery();
return set.next();
} finally {
close(set, statement);
}
}
public String getColumnUUID() {
return columnUUID;
public void updateName(UUID uuid, String name) throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement(Update.values(tableName, columnName)
.where(columnUUID + "=?")
.toString());
statement.setString(1, name);
statement.setString(2, uuid.toString());
statement.execute();
} finally {
close(statement);
}
}
public int getTimesKicked(UUID uuid) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName, columnTimesKicked)
.where(columnUUID + "=?")
.toString());
statement.setString(1, uuid.toString());
set = statement.executeQuery();
if (set.next()) {
return set.getInt(columnTimesKicked);
}
return 0;
} finally {
close(set, statement);
}
}
public void kicked(UUID uuid) throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement(Update.values(tableName, columnTimesKicked)
.where(columnUUID + "=?")
.toString());
statement.setInt(1, getTimesKicked(uuid) + 1);
statement.setString(2, uuid.toString());
statement.execute();
} finally {
close(statement);
}
}
}

View File

@ -1,5 +1,6 @@
package main.java.com.djrapitops.plan.queue.processing;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.queue.Consumer;
import main.java.com.djrapitops.plan.queue.Queue;
import main.java.com.djrapitops.plan.queue.Setup;
@ -47,7 +48,11 @@ class ProcessConsumer extends Consumer<Processor> {
if (process == null) {
return;
}
process.process();
try {
process.process();
} catch (Exception | NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError e) {
Log.toLog(this.getTaskName() + ":" + process.getClass().getSimpleName(), e);
}
}
@Override