Files
LoginSystem/src/main/java/fr/xephi/authme/settings/commandconfig/CommandMigrationService.java
T
2016-11-28 21:51:31 +01:00

123 lines
4.9 KiB
Java

package fr.xephi.authme.settings.commandconfig;
import com.github.authme.configme.migration.MigrationService;
import com.github.authme.configme.properties.Property;
import com.github.authme.configme.resource.PropertyResource;
import com.google.common.annotations.VisibleForTesting;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.settings.SettingsMigrationService;
import fr.xephi.authme.util.RandomStringUtils;
import javax.inject.Inject;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Migrates the commands from their old location, in config.yml, to the dedicated commands configuration file.
*/
class CommandMigrationService implements MigrationService {
@Inject
private SettingsMigrationService settingsMigrationService;
CommandMigrationService() {
}
@Override
public boolean checkAndMigrate(PropertyResource resource, List<Property<?>> properties) {
final CommandConfig commandConfig = CommandSettingsHolder.COMMANDS.getValue(resource);
final boolean didMoveCommands = transformOldCommands(commandConfig);
if (didMoveCommands) { // TODO ConfigMe/#29: Check that loaded file isn't completely empty
resource.setValue("", commandConfig);
return true;
}
return false;
}
/**
* Adds command settings from their old location (in config.yml) to the given command configuration object.
*
* @param commandConfig the command config object to move old commands to
* @return true if commands have been moved, false if no migration was necessary
*/
@VisibleForTesting
boolean transformOldCommands(CommandConfig commandConfig) {
boolean didMoveCommands = false;
for (MigratableCommandSection section : MigratableCommandSection.values()) {
didMoveCommands |= section.convertCommands(settingsMigrationService, commandConfig);
}
return didMoveCommands;
}
/**
* Enum defining the forced command settings that should be moved from config.yml to the new commands.yml file.
*/
private enum MigratableCommandSection {
ON_JOIN(
SettingsMigrationService::getOnLoginCommands,
Executor.PLAYER,
CommandConfig::getOnLogin),
ON_JOIN_CONSOLE(
SettingsMigrationService::getOnLoginConsoleCommands,
Executor.CONSOLE,
CommandConfig::getOnLogin),
ON_REGISTER(
SettingsMigrationService::getOnRegisterCommands,
Executor.PLAYER,
CommandConfig::getOnRegister),
ON_REGISTER_CONSOLE(
SettingsMigrationService::getOnRegisterConsoleCommands,
Executor.CONSOLE,
CommandConfig::getOnRegister);
private final Function<SettingsMigrationService, List<String>> legacyCommandsGetter;
private final Executor executor;
private final Function<CommandConfig, Map<String, Command>> commandMapGetter;
/**
* Constructor.
*
* @param legacyCommandsGetter getter on MigrationService to get the deprecated command entries
* @param executor the executor of the commands
* @param commandMapGetter the getter for the commands map in the new settings structure to add the old
* settings to after conversion
*/
MigratableCommandSection(Function<SettingsMigrationService, List<String>> legacyCommandsGetter,
Executor executor,
Function<CommandConfig, Map<String, Command>> commandMapGetter) {
this.legacyCommandsGetter = legacyCommandsGetter;
this.executor = executor;
this.commandMapGetter = commandMapGetter;
}
/**
* Adds the commands from the sections' settings migration service to the appropriate place in the new
* command config object.
*
* @param settingsMigrationService settings migration service to read old commands from
* @param commandConfig command config object to add converted commands to
* @return true if there were commands to migrate, false otherwise
*/
boolean convertCommands(SettingsMigrationService settingsMigrationService, CommandConfig commandConfig) {
List<Command> commands = legacyCommandsGetter.apply(settingsMigrationService).stream()
.map(cmd -> new Command(cmd, executor)).collect(Collectors.toList());
if (commands.isEmpty()) {
return false;
}
Map<String, Command> commandMap = commandMapGetter.apply(commandConfig);
commands.forEach(cmd -> commandMap.put(RandomStringUtils.generate(10), cmd));
ConsoleLogger.info("Moving " + commands.size() + " commands of type " + this
+ " from config.yml to commands.yml");
return true;
}
}
}