package com.nicewuerfel.blockown.importer; import com.nicewuerfel.blockown.Ownable; import com.nicewuerfel.blockown.OwnedBlock; import com.nicewuerfel.blockown.OwnedEntity; import com.nicewuerfel.blockown.Setting; import com.nicewuerfel.blockown.User; import com.nicewuerfel.blockown.database.Database; import com.nicewuerfel.blockown.database.DatabaseAction; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.ItemFrame; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; public class BlockOwn1 extends Importer { public BlockOwn1(Setting settings, Database db, File pluginsFolder, Runnable runnable) { super(settings, db, pluginsFolder, runnable); } @Override public void run() { Database db = getDatabase(); File configFile = new File(getPluginsFolder(), "BlockOwn1/config.yml"); if (!configFile.exists()) { throw new ImporterException("Old config.yml not found!"); } FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); if (!config.getString("Settings-Version").equalsIgnoreCase("1.3.7")) { throw new ImporterException("Old config must have version 1.3.7"); } String url; try { if (config.getBoolean("ServerSettings.MySQL.enable")) { String type = config.getString("ServerSettings.MySQL.type"); if (type.equalsIgnoreCase("network")) { Class.forName("com.mysql.jdbc.Driver"); String host = config.getString("ServerSettings.MySQL.host"); int port = config.getInt("ServerSettings.MySQL.port"); String databaseName = config.getString("ServerSettings.MySQL.database"); String username = config.getString("ServerSettings.MySQL.user"); String password = config.getString("ServerSettings.MySQL.password"); url = "jdbc:mysql://" + host + ":" + port + "/" + databaseName + "?user=" + username + "&password=" + password + "&autoReconnect=true"; } else { Class.forName("org.sqlite.JDBC"); url = "jdbc:sqlite:" + getPluginsFolder().getPath() + "/BlockOwn1/data.db"; } } else { importClassic(db); return; } } catch (ClassNotFoundException e) { throw new ImporterException("driver class not found"); } try { Connection con = DriverManager.getConnection(url); Statement stmnt = con.createStatement(); ResultSet nameSet = stmnt.executeQuery("SELECT playername FROM player;"); List<String> names = new LinkedList<>(); while (nameSet.next()) { names.add(nameSet.getString("playername")); } stmnt.close(); Map<String, UUID> users; try { users = getUsers(names); } catch (Exception e) { System.out.println("Error while fetching UUIDs"); return; } stmnt = con.createStatement(); ResultSet blockSet = stmnt .executeQuery("SELECT * FROM block INNER JOIN player ON block.ownerid=player.playerid;"); Ownable ownable; DatabaseAction databaseAction; int count = 0; int skipped = 0; while (blockSet.next()) { count++; boolean isBlock = blockSet.getBoolean("isblock"); String worldName = blockSet.getString("world"); int x = blockSet.getInt("x"); int y = blockSet.getInt("y"); int z = blockSet.getInt("z"); User owner; UUID id = users.get(blockSet.getString("playername")); if (id == null) { skipped++; continue; } owner = User.getInstance(id); if (!isBlock) { ItemFrame itemFrame = getItemFrame(worldName, x, y, z); if (itemFrame == null) { skipped++; continue; } ownable = OwnedEntity.newInstance(itemFrame); } else { ownable = OwnedBlock.newInstance(worldName, x, y, z); } if (!db.getOwner(ownable).isPresent()) { databaseAction = DatabaseAction.newOwnInstance(ownable, owner); db.enqueue(databaseAction); } } System.out.println("Import skipped " + skipped + " of " + count + " entries."); stmnt.close(); con.close(); finished(); } catch (SQLException e) { throw new ImporterException(e.getMessage()); } } private void importClassic(Database db) throws ImporterException { File file = new File(getPluginsFolder(), "BlockOwn1/blocks.dat"); if (!file.exists()) { throw new ImporterException("Flat file database doesn't exist"); } try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line; Ownable ownable; int count = 0; int skipped = 0; DatabaseAction databaseAction; while ((line = br.readLine()) != null) { count++; String[] owningDiv = line.split(":"); //$NON-NLS-1$ String worldName = owningDiv[0]; String[] blockCoordinates = owningDiv[1].split("#"); //$NON-NLS-1$ String playerName = owningDiv[2]; boolean isBlock = (owningDiv[3].equalsIgnoreCase("1")); //$NON-NLS-1$ User owner = getUser(playerName); if (owner == null) { skipped++; continue; } int x = Integer.parseInt(blockCoordinates[0]); int y = Integer.parseInt(blockCoordinates[1]); int z = Integer.parseInt(blockCoordinates[2]); if (isBlock) { ownable = OwnedBlock.newInstance(worldName, x, y, z); } else { ItemFrame itemFrame = getItemFrame(worldName, x, y, z); if (itemFrame == null) { skipped++; continue; } ownable = OwnedEntity.newInstance(itemFrame); } if (!db.getOwner(ownable).isPresent()) { databaseAction = DatabaseAction.newOwnInstance(ownable, owner); db.enqueue(databaseAction); } } System.out.println("Import skipped " + skipped + " of " + count + " entries."); br.close(); finished(); } catch (IOException e) { throw new ImporterException(e.getMessage()); } } }