StoreProviderTransaction

- Removes duplicate code by replacing 5 different
  Store___ProviderTransaction classes with
  a single one.

  Null value is inserted where possible / makes sense
This commit is contained in:
Rsl1122 2019-12-24 19:45:13 +02:00
parent 0b1ae59c48
commit 2c19e0e980
17 changed files with 114 additions and 687 deletions

View File

@ -148,7 +148,7 @@ public class ExtensionServiceImplementation implements ExtensionService {
}
public void updatePlayerValues(ProviderValueGatherer gatherer, UUID playerUUID, String playerName, CallEvents event) {
if (!gatherer.canCallEvent(event)) return;
if (gatherer.shouldSkipEvent(event)) return;
if (playerUUID == null && playerName == null) return;
try {
@ -190,7 +190,7 @@ public class ExtensionServiceImplementation implements ExtensionService {
}
public void updateServerValues(ProviderValueGatherer gatherer, CallEvents event) {
if (!gatherer.canCallEvent(event)) return;
if (gatherer.shouldSkipEvent(event)) return;
try {
logger.getDebugLogger().logOn(DebugChannels.DATA_EXTENSIONS, "Gathering values for server");

View File

@ -58,7 +58,7 @@ public class BooleanDataProvider extends DataProvider<Boolean> {
dataProviders.put(new BooleanDataProvider(providerInformation, methodWrapper, annotation.conditionName(), annotation.hidden()));
}
public static Optional<String> getProvidedCondition(DataProvider<Boolean> provider) {
public static Optional<String> getProvidedCondition(DataProvider<?> provider) {
if (provider instanceof BooleanDataProvider) {
return ((BooleanDataProvider) provider).getProvidedCondition();
}
@ -69,7 +69,7 @@ public class BooleanDataProvider extends DataProvider<Boolean> {
return providedCondition == null || providedCondition.isEmpty() ? Optional.empty() : Optional.of(StringUtils.truncate(providedCondition, 50));
}
public static boolean isHidden(DataProvider<Boolean> provider) {
public static boolean isHidden(DataProvider<?> provider) {
return provider instanceof BooleanDataProvider && ((BooleanDataProvider) provider).isHidden();
}

View File

@ -23,6 +23,7 @@ import com.djrapitops.plan.extension.icon.Icon;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import java.lang.reflect.Method;
import java.util.Optional;
/**
* Represents a DataExtension API method annotated with {@link NumberProvider} annotation.
@ -54,11 +55,11 @@ public class NumberDataProvider extends DataProvider<Long> {
dataProviders.put(new NumberDataProvider(providerInformation, methodWrapper, annotation.format()));
}
public static FormatType getFormatType(DataProvider<Long> provider) {
public static Optional<FormatType> getFormatType(DataProvider<?> provider) {
if (provider instanceof NumberDataProvider) {
return ((NumberDataProvider) provider).getFormatType();
return Optional.of(((NumberDataProvider) provider).getFormatType());
}
return FormatType.NONE;
return Optional.empty();
}
public FormatType getFormatType() {

View File

@ -55,7 +55,7 @@ public class StringDataProvider extends DataProvider<String> {
dataProviders.put(new StringDataProvider(providerInformation, methodWrapper, playerName));
}
public static boolean isPlayerName(DataProvider<String> provider) {
public static boolean isPlayerName(DataProvider<?> provider) {
if (provider instanceof StringDataProvider) {
return ((StringDataProvider) provider).isPlayerName();
}

View File

@ -24,7 +24,7 @@ import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.DataProviders;
import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreBooleanProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerBooleanResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerBooleanResultTransaction;
import com.djrapitops.plan.storage.database.Database;
@ -121,8 +121,6 @@ class BooleanProviderValueGatherer {
}
Optional<String> providedCondition = BooleanDataProvider.getProvidedCondition(booleanProvider);
boolean hidden = BooleanDataProvider.isHidden(booleanProvider);
MethodWrapper<Boolean> method = booleanProvider.getMethod();
Boolean result = getMethodResult(methodCaller.apply(method), method);
if (result == null) {
@ -143,7 +141,7 @@ class BooleanProviderValueGatherer {
satisfied.add(booleanProvider); // Prevents further attempts to call this provider for this player.
database.executeTransaction(new StoreIconTransaction(providerInformation.getIcon()));
database.executeTransaction(new StoreBooleanProviderTransaction(booleanProvider, providedCondition.orElse(null), hidden, serverUUID));
database.executeTransaction(new StoreProviderTransaction(booleanProvider, serverUUID));
database.executeTransaction(storeTransactionCreator.apply(method, result));
}
return satisfied;

View File

@ -24,7 +24,7 @@ import com.djrapitops.plan.extension.implementation.providers.DataProviders;
import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.providers.PercentageDataProvider;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreDoubleProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerDoubleResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerPercentageResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerDoubleResultTransaction;
@ -108,7 +108,7 @@ class DoubleAndPercentageProviderValueGatherer {
}
database.executeTransaction(new StoreIconTransaction(providerInformation.getIcon()));
database.executeTransaction(new StoreDoubleProviderTransaction(doubleProvider, serverUUID));
database.executeTransaction(new StoreProviderTransaction(doubleProvider, serverUUID));
if (doubleProvider instanceof PercentageDataProvider) {
database.executeTransaction(percStoreTransactionCreator.apply(method, result));

View File

@ -23,7 +23,7 @@ import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.DataProviders;
import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreGroupProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerGroupsResultTransaction;
import com.djrapitops.plan.storage.database.Database;
@ -81,7 +81,7 @@ class GroupProviderValueGatherer {
}
database.executeTransaction(new StoreIconTransaction(providerInformation.getIcon()));
database.executeTransaction(new StoreGroupProviderTransaction(groupProvider, serverUUID));
database.executeTransaction(new StoreProviderTransaction(groupProvider, serverUUID));
database.executeTransaction(new StorePlayerGroupsResultTransaction(pluginName, serverUUID, method.getMethodName(), playerUUID, result));
} catch (Exception | NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError e) {
throw new DataExtensionMethodCallException(e, pluginName, method);

View File

@ -18,14 +18,12 @@ package com.djrapitops.plan.extension.implementation.providers.gathering;
import com.djrapitops.plan.exceptions.DataExtensionMethodCallException;
import com.djrapitops.plan.extension.DataExtension;
import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.DataProviders;
import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.providers.NumberDataProvider;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreNumberProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerNumberResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerNumberResultTransaction;
import com.djrapitops.plan.storage.database.Database;
@ -102,10 +100,8 @@ class NumberProviderValueGatherer {
return; // Error during call
}
FormatType formatType = NumberDataProvider.getFormatType(numberProvider);
database.executeTransaction(new StoreIconTransaction(providerInformation.getIcon()));
database.executeTransaction(new StoreNumberProviderTransaction(numberProvider, formatType, serverUUID));
database.executeTransaction(new StoreProviderTransaction(numberProvider, serverUUID));
database.executeTransaction(storeTransactionCreator.apply(method, result));
}

View File

@ -29,7 +29,7 @@ import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.StorePluginTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreTabInformationTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreNumberProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.RemoveInvalidResultsTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerNumberResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerNumberResultTransaction;
@ -104,25 +104,25 @@ public class ProviderValueGatherer {
serverNumberGatherer = new Gatherer<>(
Long.class,
method -> method.callMethod(extension),
StoreNumberProviderTransaction::new,
StoreProviderTransaction::new,
(provider, result) -> new StoreServerNumberResultTransaction(provider, serverUUID, result)
);
}
public void disableMethodFromUse(MethodWrapper method) {
public void disableMethodFromUse(MethodWrapper<?> method) {
dataProviders.removeProviderWithMethod(method);
}
public boolean canCallEvent(CallEvents event) {
public boolean shouldSkipEvent(CallEvents event) {
if (event == CallEvents.MANUAL) {
return true;
return false;
}
for (CallEvents accepted : callEvents) {
if (event == accepted) {
return true;
return false;
}
}
return false;
return true;
}
public String getPluginName() {
@ -153,7 +153,7 @@ public class ProviderValueGatherer {
UUID serverUUID = serverInfo.getServerUUID();
playerNumberGatherer = new Gatherer<>(
Long.class, method -> method.callMethod(extension, playerUUID, playerName),
StoreNumberProviderTransaction::new,
StoreProviderTransaction::new,
(provider, result) -> new StorePlayerNumberResultTransaction(provider, serverUUID, playerUUID, result)
);
playerNumberGatherer.gather(conditions);

View File

@ -22,9 +22,8 @@ import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.DataProviders;
import com.djrapitops.plan.extension.implementation.providers.MethodWrapper;
import com.djrapitops.plan.extension.implementation.providers.StringDataProvider;
import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreStringProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerStringResultTransaction;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerStringResultTransaction;
import com.djrapitops.plan.storage.database.Database;
@ -106,7 +105,7 @@ class StringProviderValueGatherer {
result = StringUtils.truncate(result, 50);
database.executeTransaction(new StoreIconTransaction(providerInformation.getIcon()));
database.executeTransaction(new StoreStringProviderTransaction(stringProvider, StringDataProvider.isPlayerName(stringProvider), serverUUID));
database.executeTransaction(new StoreProviderTransaction(stringProvider, serverUUID));
database.executeTransaction(storeTransactionCreator.apply(method, result));
}

View File

@ -1,150 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.extension.implementation.storage.transactions.providers;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable;
import com.djrapitops.plan.storage.database.transactions.ExecStatement;
import com.djrapitops.plan.storage.database.transactions.Executable;
import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.storage.database.sql.building.Sql.AND;
import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
import static com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable.*;
/**
* Transaction to store information about a dobule {@link DataProvider}.
* <p>
* Includes:
* {@link com.djrapitops.plan.extension.implementation.providers.DoubleDataProvider}.
* {@link com.djrapitops.plan.extension.implementation.providers.PercentageDataProvider}.
*
* @author Rsl1122
*/
public class StoreDoubleProviderTransaction extends ThrowawayTransaction {
private final UUID serverUUID;
private final ProviderInformation providerInformation;
public StoreDoubleProviderTransaction(DataProvider<Double> provider, UUID serverUUID) {
this.serverUUID = serverUUID;
this.providerInformation = provider.getProviderInformation();
}
@Override
protected void performOperations() {
execute(storeProvider());
}
private Executable storeProvider() {
return connection -> {
if (!updateProvider().execute(connection)) {
return insertProvider().execute(connection);
}
return false;
};
}
private Executable updateProvider() {
String sql = "UPDATE " + TABLE_NAME +
" SET " +
TEXT + "=?," +
DESCRIPTION + "=?," +
PRIORITY + "=?," +
CONDITION + "=?," +
TAB_ID + "=" + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ICON_ID + "=" + ExtensionIconTable.STATEMENT_SELECT_ICON_ID + ',' +
SHOW_IN_PLAYERS_TABLE + "=?" +
WHERE + PLUGIN_ID + "=" + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID +
AND + PROVIDER_NAME + "=?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(2, description.get());
} else {
statement.setNull(2, Types.VARCHAR);
}
statement.setInt(3, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(4, condition.get());
} else {
statement.setNull(4, Types.VARCHAR);
}
ExtensionTabTable.set3TabValuesToStatement(statement, 5, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 8, providerInformation.getIcon());
statement.setBoolean(11, providerInformation.isShownInPlayersTable());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 12, providerInformation.getPluginName(), serverUUID);
statement.setString(14, providerInformation.getName());
}
};
}
private Executable insertProvider() {
String sql = "INSERT INTO " + TABLE_NAME + "(" +
PROVIDER_NAME + "," +
TEXT + "," +
DESCRIPTION + "," +
PRIORITY + "," +
CONDITION + "," +
SHOW_IN_PLAYERS_TABLE + ',' +
TAB_ID + "," +
ICON_ID + "," +
PLUGIN_ID +
") VALUES (?,?,?,?,?,?," +
ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ExtensionIconTable.STATEMENT_SELECT_ICON_ID + "," +
ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + ")";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getName());
statement.setString(2, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(3, description.get());
} else {
statement.setNull(3, Types.VARCHAR);
}
statement.setInt(4, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(5, condition.get());
} else {
statement.setNull(5, Types.VARCHAR);
}
statement.setBoolean(6, providerInformation.isShownInPlayersTable());
ExtensionTabTable.set3TabValuesToStatement(statement, 7, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 10, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 13, providerInformation.getPluginName(), serverUUID);
}
};
}
}

View File

@ -1,126 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.extension.implementation.storage.transactions.providers;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable;
import com.djrapitops.plan.storage.database.transactions.ExecStatement;
import com.djrapitops.plan.storage.database.transactions.Executable;
import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.storage.database.sql.building.Sql.AND;
import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
import static com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable.*;
/**
* Transaction to store information about a {@link com.djrapitops.plan.extension.implementation.providers.GroupDataProvider}.
*
* @author Rsl1122
*/
public class StoreGroupProviderTransaction extends ThrowawayTransaction {
private final UUID serverUUID;
private final ProviderInformation providerInformation;
public StoreGroupProviderTransaction(DataProvider<String[]> provider, UUID serverUUID) {
this.serverUUID = serverUUID;
providerInformation = provider.getProviderInformation();
}
@Override
protected void performOperations() {
execute(storeProvider());
}
private Executable storeProvider() {
return connection -> {
if (!updateProvider().execute(connection)) {
return insertProvider().execute(connection);
}
return false;
};
}
private Executable updateProvider() {
String sql = "UPDATE " + TABLE_NAME +
" SET " +
TEXT + "=?," +
CONDITION + "=?," +
TAB_ID + "=" + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ICON_ID + "=" + ExtensionIconTable.STATEMENT_SELECT_ICON_ID +
WHERE + PLUGIN_ID + "=" + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID +
AND + PROVIDER_NAME + "=?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getText());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(2, condition.get());
} else {
statement.setNull(2, Types.VARCHAR);
}
ExtensionTabTable.set3TabValuesToStatement(statement, 3, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 6, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 9, providerInformation.getPluginName(), serverUUID);
statement.setString(11, providerInformation.getName());
}
};
}
private Executable insertProvider() {
String sql = "INSERT INTO " + TABLE_NAME + "(" +
PROVIDER_NAME + "," +
TEXT + "," +
CONDITION + "," +
SHOW_IN_PLAYERS_TABLE + "," +
TAB_ID + "," +
ICON_ID + "," +
PLUGIN_ID +
") VALUES (?,?,?,?," +
ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ExtensionIconTable.STATEMENT_SELECT_ICON_ID + "," +
ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + ")";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getName());
statement.setString(2, providerInformation.getText());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(3, condition.get());
} else {
statement.setNull(3, Types.VARCHAR);
}
statement.setBoolean(4, providerInformation.isShownInPlayersTable());
ExtensionTabTable.set3TabValuesToStatement(statement, 5, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 8, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 11, providerInformation.getPluginName(), serverUUID);
}
};
}
}

View File

@ -1,158 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.extension.implementation.storage.transactions.providers;
import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.NumberDataProvider;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable;
import com.djrapitops.plan.storage.database.transactions.ExecStatement;
import com.djrapitops.plan.storage.database.transactions.Executable;
import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.storage.database.sql.building.Sql.AND;
import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
import static com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable.*;
/**
* Transaction to store information about a {@link com.djrapitops.plan.extension.implementation.providers.NumberDataProvider}.
*
* @author Rsl1122
*/
@SuppressWarnings("Duplicates")
public class StoreNumberProviderTransaction extends ThrowawayTransaction {
private final FormatType formatType;
private final UUID serverUUID;
private final ProviderInformation providerInformation;
public StoreNumberProviderTransaction(DataProvider<Long> provider, FormatType formatType, UUID serverUUID) {
this.formatType = formatType;
this.serverUUID = serverUUID;
this.providerInformation = provider.getProviderInformation();
}
public StoreNumberProviderTransaction(DataProvider<Long> provider, UUID serverUUID) {
this(provider, NumberDataProvider.getFormatType(provider), serverUUID);
}
@Override
protected void performOperations() {
execute(storeProvider());
}
private Executable storeProvider() {
return connection -> {
if (!updateProvider().execute(connection)) {
return insertProvider().execute(connection);
}
return false;
};
}
private Executable updateProvider() {
String sql = "UPDATE " + TABLE_NAME + " SET " +
TEXT + "=?," +
DESCRIPTION + "=?," +
PRIORITY + "=?," +
CONDITION + "=?," +
SHOW_IN_PLAYERS_TABLE + "=?," +
FORMAT_TYPE + "=?," +
TAB_ID + "=" + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ICON_ID + "=" + ExtensionIconTable.STATEMENT_SELECT_ICON_ID +
WHERE + PLUGIN_ID + "=" + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID +
AND + PROVIDER_NAME + "=?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(2, description.get());
} else {
statement.setNull(2, Types.VARCHAR);
}
statement.setInt(3, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(4, condition.get());
} else {
statement.setNull(4, Types.VARCHAR);
}
statement.setBoolean(5, providerInformation.isShownInPlayersTable());
statement.setString(6, formatType.name());
ExtensionTabTable.set3TabValuesToStatement(statement, 7, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 10, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 13, providerInformation.getPluginName(), serverUUID);
statement.setString(15, providerInformation.getName());
}
};
}
private Executable insertProvider() {
String sql = "INSERT INTO " + TABLE_NAME + "(" +
PROVIDER_NAME + "," +
TEXT + "," +
DESCRIPTION + "," +
PRIORITY + "," +
CONDITION + "," +
SHOW_IN_PLAYERS_TABLE + ',' +
FORMAT_TYPE + "," +
TAB_ID + "," +
ICON_ID + "," +
PLUGIN_ID +
") VALUES (?,?,?,?,?,?,?," +
ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ExtensionIconTable.STATEMENT_SELECT_ICON_ID + "," +
ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + ")";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getName());
statement.setString(2, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(3, description.get());
} else {
statement.setNull(3, Types.VARCHAR);
}
statement.setInt(4, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(5, condition.get());
} else {
statement.setNull(5, Types.VARCHAR);
}
statement.setBoolean(6, providerInformation.isShownInPlayersTable());
statement.setString(7, formatType.name());
ExtensionTabTable.set3TabValuesToStatement(statement, 8, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 11, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 14, providerInformation.getPluginName(), serverUUID);
}
};
}
}

View File

@ -16,8 +16,13 @@
*/
package com.djrapitops.plan.extension.implementation.storage.transactions.providers;
import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.BooleanDataProvider;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.extension.implementation.providers.NumberDataProvider;
import com.djrapitops.plan.extension.implementation.providers.StringDataProvider;
import com.djrapitops.plan.storage.database.sql.building.Sql;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable;
@ -27,8 +32,6 @@ import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.storage.database.sql.building.Sql.AND;
@ -36,22 +39,18 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
import static com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable.*;
/**
* Transaction to store information about a {@link com.djrapitops.plan.extension.implementation.providers.BooleanDataProvider}.
* Transaction to store information about a simple {@link DataProvider}.
*
* @author Rsl1122
*/
public class StoreBooleanProviderTransaction extends ThrowawayTransaction {
public class StoreProviderTransaction extends ThrowawayTransaction {
private final String providedCondition;
private final boolean hidden;
private final DataProvider<?> provider;
private final UUID serverUUID;
private final ProviderInformation providerInformation;
public StoreBooleanProviderTransaction(DataProvider<Boolean> booleanProvider, String providedCondition, boolean hidden, UUID serverUUID) {
this.providedCondition = providedCondition;
this.hidden = hidden;
public StoreProviderTransaction(DataProvider<?> provider, UUID serverUUID) {
this.provider = provider;
this.serverUUID = serverUUID;
this.providerInformation = booleanProvider.getProviderInformation();
}
@Override
@ -75,91 +74,100 @@ public class StoreBooleanProviderTransaction extends ThrowawayTransaction {
DESCRIPTION + "=?," +
PRIORITY + "=?," +
CONDITION + "=?," +
PROVIDED_CONDITION + "=?," +
TAB_ID + '=' + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + ',' +
ICON_ID + '=' + ExtensionIconTable.STATEMENT_SELECT_ICON_ID + ',' +
TAB_ID + '=' + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + ',' +
SHOW_IN_PLAYERS_TABLE + "=?," +
HIDDEN + "=?," +
SHOW_IN_PLAYERS_TABLE + "=?" +
PROVIDED_CONDITION + "=?," +
FORMAT_TYPE + "=?," +
IS_PLAYER_NAME + "=?" +
WHERE + PLUGIN_ID + '=' + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID +
AND + PROVIDER_NAME + "=?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(2, description.get());
} else {
statement.setNull(2, Types.VARCHAR);
}
statement.setInt(3, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(4, condition.get());
} else {
statement.setNull(4, Types.VARCHAR);
}
if (providedCondition != null) {
statement.setString(5, providedCondition);
} else {
statement.setNull(5, Types.VARCHAR);
}
ExtensionTabTable.set3TabValuesToStatement(statement, 6, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 9, providerInformation.getIcon());
statement.setBoolean(12, hidden);
statement.setBoolean(13, providerInformation.isShownInPlayersTable());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 14, providerInformation.getPluginName(), serverUUID);
statement.setString(16, providerInformation.getName());
ProviderInformation info = provider.getProviderInformation();
// Found for all providers
statement.setString(1, info.getText());
Sql.setStringOrNull(statement, 2, info.getDescription().orElse(null));
statement.setInt(3, info.getPriority());
Sql.setStringOrNull(statement, 4, info.getCondition().orElse(null));
ExtensionTabTable.set3TabValuesToStatement(statement, 5, info.getTab().orElse(null), info.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 8, info.getIcon());
statement.setBoolean(11, info.isShownInPlayersTable());
// Specific provider cases
statement.setBoolean(12, BooleanDataProvider.isHidden(provider));
Sql.setStringOrNull(statement, 13, BooleanDataProvider.getProvidedCondition(provider).orElse(null));
Sql.setStringOrNull(statement, 14, NumberDataProvider.getFormatType(provider).map(FormatType::name).orElse(null));
statement.setBoolean(15, StringDataProvider.isPlayerName(provider));
// Find appropriate provider
ExtensionPluginTable.set2PluginValuesToStatement(statement, 16, info.getPluginName(), serverUUID);
statement.setString(18, info.getName());
}
};
}
private Executable insertProvider() {
/* PROVIDER_NAME
PLUGIN_ID
TEXT
DESCRIPTION // Can be null
PRIORITY
GROUPABLE // default false
CONDITION // Can be null, related to @Conditional
ICON_ID
TAB_ID // Can be null, related to @Tab
SHOW_IN_PLAYERS_TABLE // default false
HIDDEN // default false, related to @BooleanProvider
PROVIDED_CONDITION // Can be null, related to @BooleanProvider
FORMAT_TYPE // Can be null, related to @NumberProvider
IS_PLAYER_NAME // default false, related to @StringProvider */
String sql = "INSERT INTO " + TABLE_NAME + '(' +
PROVIDER_NAME + ',' +
TEXT + ',' +
DESCRIPTION + ',' +
PRIORITY + ',' +
CONDITION + ',' +
PROVIDED_CONDITION + ',' +
HIDDEN + ',' +
SHOW_IN_PLAYERS_TABLE + ',' +
HIDDEN + ',' +
PROVIDED_CONDITION + ',' +
FORMAT_TYPE + ',' +
IS_PLAYER_NAME + ',' +
TAB_ID + ',' +
ICON_ID + ',' +
PLUGIN_ID +
") VALUES (?,?,?,?,?,?,?,?," +
") VALUES (?,?,?,?,?,?,?,?,?,?," +
ExtensionTabTable.STATEMENT_SELECT_TAB_ID + ',' +
ExtensionIconTable.STATEMENT_SELECT_ICON_ID + ',' +
ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + ')';
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getName());
statement.setString(2, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(3, description.get());
} else {
statement.setNull(3, Types.VARCHAR);
}
statement.setInt(4, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(5, condition.get());
} else {
statement.setNull(5, Types.VARCHAR);
}
if (providedCondition != null) {
statement.setString(6, providedCondition);
} else {
statement.setNull(6, Types.VARCHAR);
}
statement.setBoolean(7, hidden);
statement.setBoolean(8, providerInformation.isShownInPlayersTable());
ExtensionTabTable.set3TabValuesToStatement(statement, 9, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 12, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 15, providerInformation.getPluginName(), serverUUID);
ProviderInformation info = provider.getProviderInformation();
// Found for all providers
statement.setString(1, info.getName());
statement.setString(2, info.getText());
Sql.setStringOrNull(statement, 3, info.getDescription().orElse(null));
statement.setInt(4, info.getPriority());
Sql.setStringOrNull(statement, 5, info.getCondition().orElse(null));
statement.setBoolean(6, info.isShownInPlayersTable());
// Specific provider cases
statement.setBoolean(7, BooleanDataProvider.isHidden(provider));
Sql.setStringOrNull(statement, 8, BooleanDataProvider.getProvidedCondition(provider).orElse(null));
Sql.setStringOrNull(statement, 9, NumberDataProvider.getFormatType(provider).map(FormatType::name).orElse(null));
statement.setBoolean(10, StringDataProvider.isPlayerName(provider));
// Found for all providers
ExtensionTabTable.set3TabValuesToStatement(statement, 11, info.getTab().orElse(null), info.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 14, info.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 17, info.getPluginName(), serverUUID);
}
};
}

View File

@ -1,152 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.extension.implementation.storage.transactions.providers;
import com.djrapitops.plan.extension.implementation.ProviderInformation;
import com.djrapitops.plan.extension.implementation.providers.DataProvider;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable;
import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable;
import com.djrapitops.plan.storage.database.transactions.ExecStatement;
import com.djrapitops.plan.storage.database.transactions.Executable;
import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.storage.database.sql.building.Sql.AND;
import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
import static com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable.*;
/**
* Transaction to store information about a {@link com.djrapitops.plan.extension.implementation.providers.StringDataProvider}.
*
* @author Rsl1122
*/
public class StoreStringProviderTransaction extends ThrowawayTransaction {
private final boolean playerName;
private final UUID serverUUID;
private final ProviderInformation providerInformation;
public StoreStringProviderTransaction(DataProvider<String> provider, boolean playerName, UUID serverUUID) {
this.playerName = playerName;
this.serverUUID = serverUUID;
providerInformation = provider.getProviderInformation();
}
@Override
protected void performOperations() {
execute(storeProvider());
}
private Executable storeProvider() {
return connection -> {
if (!updateProvider().execute(connection)) {
return insertProvider().execute(connection);
}
return false;
};
}
private Executable updateProvider() {
String sql = "UPDATE " + TABLE_NAME +
" SET " +
TEXT + "=?," +
DESCRIPTION + "=?," +
PRIORITY + "=?," +
CONDITION + "=?," +
SHOW_IN_PLAYERS_TABLE + "=?," +
IS_PLAYER_NAME + "=?," +
TAB_ID + "=" + ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ICON_ID + "=" + ExtensionIconTable.STATEMENT_SELECT_ICON_ID +
WHERE + PLUGIN_ID + "=" + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID +
AND + PROVIDER_NAME + "=?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(2, description.get());
} else {
statement.setNull(2, Types.VARCHAR);
}
statement.setInt(3, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(4, condition.get());
} else {
statement.setNull(4, Types.VARCHAR);
}
statement.setBoolean(5, providerInformation.isShownInPlayersTable());
statement.setBoolean(6, playerName);
ExtensionTabTable.set3TabValuesToStatement(statement, 7, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 10, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 13, providerInformation.getPluginName(), serverUUID);
statement.setString(15, providerInformation.getName());
}
};
}
private Executable insertProvider() {
String sql = "INSERT INTO " + TABLE_NAME + "(" +
PROVIDER_NAME + "," +
TEXT + "," +
DESCRIPTION + "," +
PRIORITY + "," +
CONDITION + "," +
SHOW_IN_PLAYERS_TABLE + "," +
IS_PLAYER_NAME + "," +
TAB_ID + "," +
ICON_ID + "," +
PLUGIN_ID +
") VALUES (?,?,?,?,?,?,?," +
ExtensionTabTable.STATEMENT_SELECT_TAB_ID + "," +
ExtensionIconTable.STATEMENT_SELECT_ICON_ID + "," +
ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + ")";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, providerInformation.getName());
statement.setString(2, providerInformation.getText());
Optional<String> description = providerInformation.getDescription();
if (description.isPresent()) {
statement.setString(3, description.get());
} else {
statement.setNull(3, Types.VARCHAR);
}
statement.setInt(4, providerInformation.getPriority());
Optional<String> condition = providerInformation.getCondition();
if (condition.isPresent()) {
statement.setString(5, condition.get());
} else {
statement.setNull(5, Types.VARCHAR);
}
statement.setBoolean(6, providerInformation.isShownInPlayersTable());
statement.setBoolean(7, playerName);
ExtensionTabTable.set3TabValuesToStatement(statement, 8, providerInformation.getTab().orElse("No Tab"), providerInformation.getPluginName(), serverUUID);
ExtensionIconTable.set3IconValuesToStatement(statement, 11, providerInformation.getIcon());
ExtensionPluginTable.set2PluginValuesToStatement(statement, 14, providerInformation.getPluginName(), serverUUID);
}
};
}
}

View File

@ -16,6 +16,9 @@
*/
package com.djrapitops.plan.storage.database.sql.building;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.concurrent.TimeUnit;
/**
@ -61,6 +64,14 @@ public abstract class Sql {
return TimeUnit.DAYS.toMillis(day + 2L);
}
public static void setStringOrNull(PreparedStatement statement, int index, String value) throws SQLException {
if (value != null) {
statement.setString(index, value);
} else {
statement.setNull(index, Types.VARCHAR);
}
}
public abstract String epochSecondToDate(String sql);
public abstract String dateToEpochSecond(String sql);

View File

@ -49,7 +49,7 @@ public class ExtensionTabTable {
AND + PLUGIN_ID + "=" + ExtensionPluginTable.STATEMENT_SELECT_PLUGIN_ID + " LIMIT 1)";
public static void set3TabValuesToStatement(PreparedStatement statement, int parameterIndex, String tabName, String pluginName, UUID serverUUID) throws SQLException {
statement.setString(parameterIndex, tabName);
Sql.setStringOrNull(statement, parameterIndex, tabName);
ExtensionPluginTable.set2PluginValuesToStatement(statement, parameterIndex + 1, pluginName, serverUUID);
}