class AbstractDataSourceConverter implements Converter {

    @Override
    public void execute(CommandSender sender) {
        if (destinationType != destination.getType()) {
            if (sender != null) {
                sender.sendMessage("Please configure your connection to "
                    + destinationType + " and re-run this command");
            }
            return;
        }

        S source;
        try {
            source = getSource();
        } catch (Exception e) {
            logAndSendMessage(sender, "The data source to convert from could not be initialized");
            ConsoleLogger.logException("Could not initialize source:", e);
            return;
        }

        List<String> skippedPlayers = new ArrayList<>();
        for (PlayerAuth auth : source.getAllAuths()) {
            if (destination.isAuthAvailable(auth.getNickname())) {
                skippedPlayers.add(auth.getNickname());
            } else {
                adaptPlayerAuth(auth);
                destination.saveAuth(auth);
                destination.updateSession(auth);
                destination.updateQuitLoc(auth);
            }
        }

        if (!skippedPlayers.isEmpty()) {
            logAndSendMessage(sender, "Skipped conversion for players which were already in "
                + destinationType + ": " + String.join(", ", skippedPlayers));
        }
        logAndSendMessage(sender, "Database successfully converted from " + source.getType()
            + " to " + destinationType);
    }

    public  AbstractDataSourceConverter(DataSource destination, DataSourceType destinationType);

}