Dateien nach "src/main/java/net/licks92/wirelessredstone/storage" hochladen
This commit is contained in:
@@ -0,0 +1,770 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
import com.tylersuehr.sql.ContentValues;
|
||||||
|
import com.tylersuehr.sql.SQLiteDatabase;
|
||||||
|
import com.tylersuehr.sql.SQLiteOpenHelper;
|
||||||
|
import net.licks92.wirelessredstone.ConfigManager;
|
||||||
|
import net.licks92.wirelessredstone.Utils;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import net.licks92.wirelessredstone.signs.SignType;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessPoint;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiver;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverClock;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverDelayer;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverInverter;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverSwitch;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessScreen;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessTransmitter;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class DatabaseClient extends SQLiteOpenHelper {
|
||||||
|
private static final String DB_NAME = "WirelessRedstoneDatabase";
|
||||||
|
private static final int DB_VERSION = 1;
|
||||||
|
|
||||||
|
private static final String TB_CHANNELS = "channel";
|
||||||
|
private static final String TB_OWNERS = "owner";
|
||||||
|
private static final String TB_TRANSMITTERS = "transmitter";
|
||||||
|
private static final String TB_RECEIVERS = "receiver";
|
||||||
|
private static final String TB_SCREENS = "screen";
|
||||||
|
private static final String TB_INVERTERS = "inverter";
|
||||||
|
private static final String TB_DELAYERS = "delayer";
|
||||||
|
private static final String TB_SWITCH = "switch";
|
||||||
|
private static final String TB_CLOCKS = "clock";
|
||||||
|
|
||||||
|
private static volatile DatabaseClient instance;
|
||||||
|
private final SQLiteDatabase db;
|
||||||
|
|
||||||
|
|
||||||
|
private DatabaseClient(String channelFolder) {
|
||||||
|
super(channelFolder + File.separator + DB_NAME, DB_VERSION);
|
||||||
|
this.db = getWritableInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static synchronized DatabaseClient getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
throw new IllegalStateException("DatabaseClient hasn't been initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static synchronized DatabaseClient init(String channelFolder) {
|
||||||
|
if (instance == null) {
|
||||||
|
Objects.requireNonNull(channelFolder, "Channel folder can't be null");
|
||||||
|
|
||||||
|
instance = new DatabaseClient(channelFolder);
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(SQLiteDatabase db) {
|
||||||
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||||
|
Objects.requireNonNull(WirelessRedstone.getInstance().getResource("database/Database_1.sql")),
|
||||||
|
StandardCharsets.UTF_8))) {
|
||||||
|
String sql = br.lines().collect(Collectors.joining(System.lineSeparator()));;
|
||||||
|
db.execSql(sql);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
WirelessRedstone.getWRLogger().info("There was an error while initializing the database.");
|
||||||
|
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onUpdate(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
|
WirelessRedstone.getWRLogger().info("Updating SQLite database. This could take a while. As a precaution, a backup will be created.");
|
||||||
|
if (WirelessRedstone.getStorage().backupData()) {
|
||||||
|
if (oldVersion == 0) {
|
||||||
|
try {
|
||||||
|
performUpdate1(db);
|
||||||
|
} catch (SQLException | IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
throw new RuntimeException("There was an error while performing database update 1.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("There was an error while backing up the database. The channels folder couldn't be accessed.");
|
||||||
|
}
|
||||||
|
WirelessRedstone.getWRLogger().info("Updating SQLite database done.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose the SQLiteDatabase to anything that wants to use it.
|
||||||
|
*/
|
||||||
|
protected SQLiteDatabase getDatabase() {
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Collection<WirelessChannel> getAllChannels() {
|
||||||
|
Collection<WirelessChannel> channels = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ResultSet resultSet = getDatabase().query(TB_CHANNELS, null, null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
channels.add(new WirelessChannel(resultSet.getString("name"), resultSet.getBoolean("locked")));
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
Iterator<WirelessChannel> iterator = channels.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
WirelessChannel channel = iterator.next();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_OWNERS, new String[]{"user"}, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
channel.addOwner(resultSet.getString("user"));
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_TRANSMITTERS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessTransmitter(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Transmitter found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_RECEIVERS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessReceiver(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Receiver found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_SCREENS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessScreen(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Screen found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_INVERTERS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessReceiverInverter(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inverter found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_DELAYERS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessReceiverDelayer(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner"),
|
||||||
|
resultSet.getInt("delay")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Delayer found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_SWITCH, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessReceiverSwitch(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner"),
|
||||||
|
resultSet.getBoolean("powered")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Switch found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
resultSet = getDatabase().query(TB_CLOCKS, "[channel_name]='" + channel.getName() + "'", null, null);
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessPoint point = new WirelessReceiverClock(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("is_wallsign") != 0,
|
||||||
|
BlockFace.valueOf(resultSet.getString("direction")),
|
||||||
|
resultSet.getString("owner"),
|
||||||
|
resultSet.getInt("delay")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Clock found: " + point);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
WirelessRedstone.getWRLogger().severe("Couldn't retrieve channels from the database!");
|
||||||
|
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void recreateDatabase() {
|
||||||
|
onCreate(getDatabase());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean insertWirelessPoint(WirelessChannel channel, WirelessPoint point) {
|
||||||
|
if (point == null) {
|
||||||
|
throw new IllegalArgumentException("WirelessPoint can not be null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (isWirelessPointInDb(point)) {
|
||||||
|
WirelessRedstone.getWRLogger().warning("WirelesPoint " + point + " is a duplicate in the storage. Skipping saving the WirelessPoint");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
WirelessRedstone.getWRLogger().warning("Database exception, enable debug mode to see the full stacktrace.");
|
||||||
|
|
||||||
|
if (ConfigManager.getConfig().getDebugMode()) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
try {
|
||||||
|
if (!isChannelInDb(channel.getName())) {
|
||||||
|
values.put("name", escape(channel.getName()));
|
||||||
|
values.put("locked", channel.isLocked());
|
||||||
|
getDatabase().insert(TB_CHANNELS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Channel created in database. " + channel.getName());
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
WirelessRedstone.getWRLogger().warning("Database exception, enable debug mode to see the full stacktrace.");
|
||||||
|
|
||||||
|
if (ConfigManager.getConfig().getDebugMode()) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String table;
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
|
||||||
|
if (point instanceof WirelessTransmitter) {
|
||||||
|
table = TB_TRANSMITTERS;
|
||||||
|
} else if (point instanceof WirelessScreen) {
|
||||||
|
table = TB_SCREENS;
|
||||||
|
} else if (point instanceof WirelessReceiver) {
|
||||||
|
if (point instanceof WirelessReceiverInverter) {
|
||||||
|
table = TB_INVERTERS;
|
||||||
|
} else if (point instanceof WirelessReceiverDelayer) {
|
||||||
|
table = TB_DELAYERS;
|
||||||
|
values.put("delay", ((WirelessReceiverDelayer) point).getDelay());
|
||||||
|
} else if (point instanceof WirelessReceiverSwitch) {
|
||||||
|
table = TB_SWITCH;
|
||||||
|
values.put("powered", ((WirelessReceiverSwitch) point).isActive());
|
||||||
|
} else if (point instanceof WirelessReceiverClock) {
|
||||||
|
table = TB_CLOCKS;
|
||||||
|
values.put("delay", ((WirelessReceiverClock) point).getDelay());
|
||||||
|
} else {
|
||||||
|
table = TB_RECEIVERS;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
WirelessRedstone.getWRLogger().debug("Can't add wirelesspoint to database. Couldn't find what type the wirelesspoint is.");
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
getDatabase().insert(table, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Placed new WirelessPoint in the database");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateSwitch(WirelessReceiverSwitch receiver) {
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put("powered", receiver.isActive());
|
||||||
|
getDatabase().update(TB_SWITCH, values,
|
||||||
|
"[x]=" + receiver.getX() + " AND [y]=" + receiver.getY() + " AND [z]=" + receiver.getZ() + " AND [world]='" + receiver.getWorld() + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isChannelInDb(String channelName) throws SQLException {
|
||||||
|
boolean exists = false;
|
||||||
|
|
||||||
|
ResultSet resultSet = getDatabase().query(TB_CHANNELS, "[name]='" + escape(channelName) + "'", null, null);
|
||||||
|
while (resultSet.next() && !exists) {
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
return exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isWirelessPointInDb(WirelessPoint point) throws SQLException {
|
||||||
|
boolean exists = false;
|
||||||
|
String table;
|
||||||
|
|
||||||
|
if (point instanceof WirelessTransmitter) {
|
||||||
|
table = TB_TRANSMITTERS;
|
||||||
|
} else if (point instanceof WirelessScreen) {
|
||||||
|
table = TB_SCREENS;
|
||||||
|
} else if (point instanceof WirelessReceiver) {
|
||||||
|
if (point instanceof WirelessReceiverInverter) {
|
||||||
|
table = TB_INVERTERS;
|
||||||
|
} else if (point instanceof WirelessReceiverDelayer) {
|
||||||
|
table = TB_DELAYERS;
|
||||||
|
} else if (point instanceof WirelessReceiverSwitch) {
|
||||||
|
table = TB_SWITCH;
|
||||||
|
} else if (point instanceof WirelessReceiverClock) {
|
||||||
|
table = TB_CLOCKS;
|
||||||
|
} else {
|
||||||
|
table = TB_RECEIVERS;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
WirelessRedstone.getWRLogger().debug("Can't find wirelesspoint in database. Couldn't find what type the wirelesspoint is.");
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultSet resultSet = getDatabase().query(table,
|
||||||
|
"[x]=" + point.getX() + " AND [y]=" + point.getY() + " AND [z]=" + point.getZ() + " AND [world]='" + point.getWorld() + "'",
|
||||||
|
null, null);
|
||||||
|
while (resultSet.next() && !exists) {
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
return exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performUpdate1(SQLiteDatabase db) throws SQLException, IOException {
|
||||||
|
Collection<WirelessChannel> channels = new ArrayList<>();
|
||||||
|
Collection<String> channelNames = new ArrayList<>();
|
||||||
|
int channelIteration = 0;
|
||||||
|
int progress = 0;
|
||||||
|
|
||||||
|
ResultSet resultSet = db.rawQuery("SELECT [name] FROM [sqlite_master] WHERE [type] = 'table'");
|
||||||
|
|
||||||
|
while (resultSet.next()) {
|
||||||
|
WirelessRedstone.getWRLogger().debug("Found channel: " + resultSet.getString(1));
|
||||||
|
channelNames.add(resultSet.getString(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
resultSet.close();
|
||||||
|
|
||||||
|
for (String channelName : channelNames) {
|
||||||
|
if ((int) Math.floor((float) channelIteration / (float) channelNames.size() * 100) % 5 == 0
|
||||||
|
&& (int) Math.floor((float) channelIteration / (float) channelNames.size() * 100) != progress) {
|
||||||
|
progress = (int) Math.floor((float) channelIteration / (float) channelNames.size() * 100);
|
||||||
|
WirelessRedstone.getWRLogger().info("Database upgrade stage 1/2; Progress: " + progress + "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessChannel channel = null;
|
||||||
|
int channelInfoIteration = 0;
|
||||||
|
resultSet = db.query(channelName, null, null, null);
|
||||||
|
|
||||||
|
while (resultSet.next()) {
|
||||||
|
if (channelInfoIteration == 0) {
|
||||||
|
if (resultSet.getString("name") != null) {
|
||||||
|
WirelessRedstone.getWRLogger().debug("---------------");
|
||||||
|
WirelessRedstone.getWRLogger().debug("Created channel: " + resultSet.getString("name") + " | " +
|
||||||
|
Collections.singletonList(resultSet.getString("owners")) + " | " +
|
||||||
|
resultSet.getBoolean("locked")
|
||||||
|
);
|
||||||
|
|
||||||
|
channel = new WirelessChannel(
|
||||||
|
resultSet.getString("name"),
|
||||||
|
Collections.singletonList(resultSet.getString("owners")),
|
||||||
|
resultSet.getBoolean("locked")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channelInfoIteration > 0 && channel == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug("---------------");
|
||||||
|
|
||||||
|
if (channelInfoIteration > 0) {
|
||||||
|
if (resultSet.getString("signType") != null) {
|
||||||
|
String signTypeSerialized = resultSet.getString("signType");
|
||||||
|
SignType signType = getSignType(signTypeSerialized);
|
||||||
|
WirelessRedstone.getWRLogger().debug("SignType " + signType);
|
||||||
|
|
||||||
|
if (signType == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (signType) {
|
||||||
|
case TRANSMITTER:
|
||||||
|
WirelessPoint point = new WirelessTransmitter(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case RECEIVER:
|
||||||
|
point = new WirelessReceiver(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case SCREEN:
|
||||||
|
point = new WirelessScreen(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case RECEIVER_INVERTER:
|
||||||
|
point = new WirelessReceiverInverter(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner")
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case RECEIVER_DELAYER:
|
||||||
|
int delay;
|
||||||
|
|
||||||
|
try {
|
||||||
|
delay = Integer.parseInt(signTypeSerialized.split("_")[2]);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
point = new WirelessReceiverDelayer(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner"),
|
||||||
|
delay
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case RECEIVER_SWITCH:
|
||||||
|
boolean state;
|
||||||
|
|
||||||
|
state = Boolean.parseBoolean(signTypeSerialized.split("_")[2]);
|
||||||
|
|
||||||
|
point = new WirelessReceiverSwitch(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner"),
|
||||||
|
state
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
case RECEIVER_CLOCK:
|
||||||
|
try {
|
||||||
|
delay = Integer.parseInt(signTypeSerialized.split("_")[2]);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
point = new WirelessReceiverClock(
|
||||||
|
resultSet.getInt("x"),
|
||||||
|
resultSet.getInt("y"),
|
||||||
|
resultSet.getInt("z"),
|
||||||
|
resultSet.getString("world"),
|
||||||
|
resultSet.getInt("isWallSign") != 0,
|
||||||
|
getBlockFaceOldDatabase(resultSet),
|
||||||
|
resultSet.getString("signOwner"),
|
||||||
|
delay
|
||||||
|
);
|
||||||
|
channel.addWirelessPoint(point);
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug(point.toString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
channelInfoIteration++;
|
||||||
|
}
|
||||||
|
resultSet.close();
|
||||||
|
channels.add(channel);
|
||||||
|
channelIteration++;
|
||||||
|
|
||||||
|
db.execSql("DROP TABLE IF EXISTS [" + channelName + "];");
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug("---------------");
|
||||||
|
|
||||||
|
onCreate(db);
|
||||||
|
|
||||||
|
progress = 0;
|
||||||
|
channelIteration = 0;
|
||||||
|
for (WirelessChannel channel : channels) {
|
||||||
|
if ((int) Math.floor((float) channelIteration / (float) channels.size() * 100) % 5 == 0
|
||||||
|
&& (int) Math.floor((float) channelIteration / (float) channels.size() * 100) != progress) {
|
||||||
|
progress = (int) Math.floor((float) channelIteration / (float) channels.size() * 100);
|
||||||
|
WirelessRedstone.getWRLogger().info("Database upgrade stage 2/2; Progress: " + progress + "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put("name", channel.getName());
|
||||||
|
values.put("locked", channel.isLocked());
|
||||||
|
db.insert(TB_CHANNELS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted channel " + channel.getName());
|
||||||
|
|
||||||
|
for (String owner : channel.getOwners()) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("user", owner);
|
||||||
|
db.insert(TB_OWNERS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted owner " + owner + "|" + channel.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (WirelessTransmitter point : channel.getTransmitters()) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
db.insert(TB_TRANSMITTERS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted transmitter " + point.toString() + "|" + channel.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (WirelessScreen point : channel.getScreens()) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
db.insert(TB_SCREENS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted screen " + point.toString() + "|" + channel.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (WirelessReceiver point : channel.getReceivers()) {
|
||||||
|
if (point instanceof WirelessReceiverInverter) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
db.insert(TB_INVERTERS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted inverter " + point.toString() + "|" + channel.getName());
|
||||||
|
} else if (point instanceof WirelessReceiverDelayer) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
values.put("delay", ((WirelessReceiverDelayer) point).getDelay());
|
||||||
|
db.insert(TB_DELAYERS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted delayer " + point.toString() + "|" + channel.getName());
|
||||||
|
} else if (point instanceof WirelessReceiverSwitch) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
values.put("powered", ((WirelessReceiverSwitch) point).isActive());
|
||||||
|
db.insert(TB_SWITCH, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted switch " + point.toString() + "|" + channel.getName());
|
||||||
|
} else if (point instanceof WirelessReceiverClock) {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
values.put("delay", ((WirelessReceiverClock) point).getDelay());
|
||||||
|
db.insert(TB_CLOCKS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted clock " + point.toString() + "|" + channel.getName());
|
||||||
|
} else {
|
||||||
|
values = new ContentValues();
|
||||||
|
values.put("x", point.getX());
|
||||||
|
values.put("y", point.getY());
|
||||||
|
values.put("z", point.getZ());
|
||||||
|
values.put("world", point.getWorld());
|
||||||
|
values.put("channel_name", channel.getName());
|
||||||
|
values.put("direction", point.getDirection().toString());
|
||||||
|
values.put("owner", point.getOwner());
|
||||||
|
values.put("is_wallsign", point.isWallSign());
|
||||||
|
db.insert(TB_RECEIVERS, values);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Inserted receiver " + point.toString() + "|" + channel.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
channelIteration++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SignType getSignType(String signTypeSerialized) {
|
||||||
|
if (signTypeSerialized.equalsIgnoreCase("transmitter")) {
|
||||||
|
return SignType.TRANSMITTER;
|
||||||
|
} else if (signTypeSerialized.equalsIgnoreCase("receiver")) {
|
||||||
|
return SignType.RECEIVER;
|
||||||
|
} else if (signTypeSerialized.equalsIgnoreCase("screen")) {
|
||||||
|
return SignType.SCREEN;
|
||||||
|
} else if (signTypeSerialized.contains("receiver")) {
|
||||||
|
String[] receiver = signTypeSerialized.split("_");
|
||||||
|
|
||||||
|
if (receiver[1].equalsIgnoreCase("inverter")) {
|
||||||
|
return SignType.RECEIVER_INVERTER;
|
||||||
|
} else if (receiver[1].equalsIgnoreCase("delayer")) {
|
||||||
|
return SignType.RECEIVER_DELAYER;
|
||||||
|
} else if (receiver[1].equalsIgnoreCase("switch")) {
|
||||||
|
return SignType.RECEIVER_SWITCH;
|
||||||
|
} else if (receiver[1].equalsIgnoreCase("clock")) {
|
||||||
|
return SignType.RECEIVER_CLOCK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockFace getBlockFaceOldDatabase(ResultSet resultSet) throws SQLException {
|
||||||
|
Object directionObject = resultSet.getObject("direction");
|
||||||
|
|
||||||
|
if (directionObject instanceof Integer) {
|
||||||
|
return Utils.getBlockFace(false, (int) directionObject);
|
||||||
|
} else if (directionObject instanceof String) {
|
||||||
|
return BlockFace.valueOf(directionObject.toString().toUpperCase());
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Direction (" + directionObject + ") row inside database isn't parsable.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String escape(String str) {
|
||||||
|
if (str == null || str.length() == 0) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
str = str.replace("\\", "\\\\");
|
||||||
|
str = str.replace("'", "\\'");
|
||||||
|
str = str.replace("\0", "\\0");
|
||||||
|
str = str.replace("\n", "\\n");
|
||||||
|
str = str.replace("\r", "\\r");
|
||||||
|
str = str.replace("\"", "\\\"");
|
||||||
|
str = str.replace("\\x1a", "\\Z");
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,113 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessPoint;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiver;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverSwitch;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class SQLiteStorage extends StorageConfiguration {
|
||||||
|
|
||||||
|
private final File channelFolder;
|
||||||
|
|
||||||
|
public SQLiteStorage(String channelFolder) {
|
||||||
|
this.channelFolder = new File(WirelessRedstone.getInstance().getDataFolder(), channelFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean initStorage() {
|
||||||
|
try {
|
||||||
|
DatabaseClient.init(channelFolder.toString());
|
||||||
|
WirelessRedstone.getStorageManager().updateChannels(false);
|
||||||
|
|
||||||
|
StorageType oldStorageType = canConvertFromType();
|
||||||
|
if (oldStorageType != null) {
|
||||||
|
return WirelessRedstone.getStorageManager().moveStorageFromType(oldStorageType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (RuntimeException ex) {
|
||||||
|
WirelessRedstone.getWRLogger().severe("There was an error accessing the database!");
|
||||||
|
ex.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean close() {
|
||||||
|
DatabaseClient.getInstance().getDatabase().close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Collection<WirelessChannel> getAllChannels() {
|
||||||
|
return DatabaseClient.getInstance().getAllChannels();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createChannel(WirelessChannel channel) {
|
||||||
|
channel.getSigns()
|
||||||
|
.forEach(wirelessPoint -> DatabaseClient.getInstance().insertWirelessPoint(channel, wirelessPoint));
|
||||||
|
|
||||||
|
return super.createChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
channel.addWirelessPoint(wirelessPoint);
|
||||||
|
|
||||||
|
DatabaseClient.getInstance().insertWirelessPoint(channel, wirelessPoint);
|
||||||
|
|
||||||
|
return super.createWirelessPoint(channelName, wirelessPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
channel.removeWirelessPoint(wirelessPoint);
|
||||||
|
|
||||||
|
return super.removeWirelessPoint(channelName, wirelessPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateChannel(String channelName, WirelessChannel channel) {
|
||||||
|
return super.updateChannel(channelName, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeChannel(String channelName, boolean removeSigns) {
|
||||||
|
return super.removeChannel(channelName, removeSigns);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean wipeData() {
|
||||||
|
DatabaseClient.getInstance().recreateDatabase();
|
||||||
|
|
||||||
|
return super.wipeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected StorageType canConvertFromType() {
|
||||||
|
for (File file : Objects.requireNonNull(channelFolder.listFiles())) {
|
||||||
|
if (file.getName().contains(".yml")) {
|
||||||
|
return StorageType.YAML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSwitchState(WirelessChannel channel) {
|
||||||
|
for (WirelessReceiver receiver : channel.getReceivers()) {
|
||||||
|
if (receiver instanceof WirelessReceiverSwitch) {
|
||||||
|
DatabaseClient.getInstance().updateSwitch((WirelessReceiverSwitch) receiver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,164 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessPoint;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
public abstract class StorageConfiguration {
|
||||||
|
|
||||||
|
public abstract boolean initStorage();
|
||||||
|
|
||||||
|
public abstract boolean close();
|
||||||
|
|
||||||
|
protected abstract Collection<WirelessChannel> getAllChannels();
|
||||||
|
|
||||||
|
public abstract void updateSwitchState(WirelessChannel channel);
|
||||||
|
|
||||||
|
protected abstract StorageType canConvertFromType();
|
||||||
|
|
||||||
|
public boolean createChannel(WirelessChannel channel) {
|
||||||
|
WirelessRedstone.getStorageManager().updateList(channel.getName(), channel);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean createWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
//TODO: Investigate if this duplicates the wirelesspoint into the channel
|
||||||
|
channel.addWirelessPoint(wirelessPoint);
|
||||||
|
WirelessRedstone.getStorageManager().updateList(channelName, channel);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
//TODO: Investigate if this duplicates the wirelesspoint into the channel
|
||||||
|
channel.removeWirelessPoint(wirelessPoint);
|
||||||
|
|
||||||
|
if (channel.isEmpty()) {
|
||||||
|
WirelessRedstone.getStorage().removeChannel(channelName, false);
|
||||||
|
} else {
|
||||||
|
WirelessRedstone.getStorageManager().updateList(channelName, channel);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean updateChannel(String channelName, WirelessChannel channel) {
|
||||||
|
WirelessRedstone.getStorageManager().updateList(channel.getName(), channel);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeChannel(String channelName, boolean removeSigns) {
|
||||||
|
if (removeSigns) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
|
||||||
|
for (WirelessPoint point : channel.getSigns()) {
|
||||||
|
World world = Bukkit.getWorld(point.getWorld());
|
||||||
|
|
||||||
|
if (world == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Location loc = new Location(world, point.getX(), point.getY(), point.getZ());
|
||||||
|
loc.getBlock().setType(Material.AIR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WirelessRedstone.getStorageManager().updateList(channelName, null);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int purgeData() {
|
||||||
|
int response = 0;
|
||||||
|
|
||||||
|
for (Map.Entry<WirelessChannel, Collection<WirelessPoint>> entry : WirelessRedstone.getSignManager().getAllInvalidPoints().entrySet()) {
|
||||||
|
for (WirelessPoint point : entry.getValue()) {
|
||||||
|
if (!WirelessRedstone.getStorage().removeWirelessPoint(entry.getKey().getName(), point)) {
|
||||||
|
response = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessRedstone.getWRLogger().debug("Purged WirelessPoint " + point.getLocation().toString() + " because the location is invalid.");
|
||||||
|
|
||||||
|
response++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<WirelessChannel> emptyChannels = new ArrayList<>();
|
||||||
|
for (WirelessChannel channel : WirelessRedstone.getStorageManager().getChannels()) {
|
||||||
|
if (channel.isEmpty()) {
|
||||||
|
emptyChannels.add(channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (WirelessChannel channel : emptyChannels) {
|
||||||
|
WirelessRedstone.getStorage().removeChannel(channel.getName(), false);
|
||||||
|
response++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean backupData() {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
|
||||||
|
if (!(new File(WirelessRedstone.getInstance().getDataFolder(), WirelessRedstone.CHANNEL_FOLDER).exists())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
String zipName = "WRBackup "
|
||||||
|
+ Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-"
|
||||||
|
+ Calendar.getInstance().get(Calendar.MONTH) + "-"
|
||||||
|
+ Calendar.getInstance().get(Calendar.YEAR) + "_"
|
||||||
|
+ Calendar.getInstance().get(Calendar.HOUR_OF_DAY) + "."
|
||||||
|
+ Calendar.getInstance().get(Calendar.MINUTE) + "."
|
||||||
|
+ Calendar.getInstance().get(Calendar.SECOND);
|
||||||
|
FileOutputStream fos = new FileOutputStream(WirelessRedstone.getInstance().getDataFolder() + File.separator + zipName + ".zip");
|
||||||
|
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||||
|
|
||||||
|
for (File file : (new File(WirelessRedstone.getInstance().getDataFolder(), WirelessRedstone.CHANNEL_FOLDER)).listFiles()) {
|
||||||
|
|
||||||
|
ZipEntry ze = new ZipEntry(file.getName());
|
||||||
|
zos.putNextEntry(ze);
|
||||||
|
|
||||||
|
FileInputStream in = new FileInputStream(file);
|
||||||
|
|
||||||
|
int len;
|
||||||
|
while ((len = in.read(buffer)) > 0) {
|
||||||
|
zos.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
zos.closeEntry();
|
||||||
|
zos.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean wipeData() {
|
||||||
|
WirelessRedstone.getStorageManager().wipeList();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,150 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.ConfigManager;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessPoint;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class StorageManager {
|
||||||
|
|
||||||
|
private final ConcurrentHashMap<String, WirelessChannel> allChannels = new ConcurrentHashMap<>();
|
||||||
|
private final BukkitTask refreshingTask;
|
||||||
|
private final StorageType storageType;
|
||||||
|
private final StorageConfiguration storage;
|
||||||
|
private final String channelFolder;
|
||||||
|
private final File channelFolderFile;
|
||||||
|
|
||||||
|
public StorageManager(StorageType type, String channelFolder) {
|
||||||
|
this.storageType = type;
|
||||||
|
this.channelFolder = channelFolder;
|
||||||
|
|
||||||
|
this.channelFolderFile = new File(WirelessRedstone.getInstance().getDataFolder(), channelFolder);
|
||||||
|
this.channelFolderFile.mkdir();
|
||||||
|
switch (type) {
|
||||||
|
case SQLITE:
|
||||||
|
storage = new SQLiteStorage(channelFolder);
|
||||||
|
break;
|
||||||
|
case YAML:
|
||||||
|
storage = new YamlStorage(channelFolder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
storage = new YamlStorage(channelFolder);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int refreshRate = ConfigManager.getConfig().getCacheRefreshRate();
|
||||||
|
if (refreshRate < 60) {
|
||||||
|
refreshRate = 60;
|
||||||
|
ConfigManager.getConfig().setValue(ConfigManager.ConfigPaths.CACHEREFRESHRATE, 60);
|
||||||
|
}
|
||||||
|
if (refreshRate > 480) {
|
||||||
|
refreshRate = 480;
|
||||||
|
ConfigManager.getConfig().setValue(ConfigManager.ConfigPaths.CACHEREFRESHRATE, 480);
|
||||||
|
}
|
||||||
|
|
||||||
|
int timeInTicks = refreshRate * 20;
|
||||||
|
refreshingTask = Bukkit.getScheduler().runTaskTimerAsynchronously(WirelessRedstone.getInstance(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//TODO: Check if this is necessary
|
||||||
|
// updateList();
|
||||||
|
}
|
||||||
|
}, timeInTicks, timeInTicks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateChannels(boolean async) {
|
||||||
|
if (async) {
|
||||||
|
Bukkit.getServer().getScheduler().runTaskAsynchronously(WirelessRedstone.getInstance(), this::updateList);
|
||||||
|
} else {
|
||||||
|
updateList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateList() {
|
||||||
|
allChannels.clear();
|
||||||
|
Collection<WirelessChannel> channels = getStorage().getAllChannels();
|
||||||
|
|
||||||
|
channels.forEach(channel -> allChannels.put(channel.getName(), channel));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateList(String channelName, WirelessChannel channel) {
|
||||||
|
if (channel == null) {
|
||||||
|
allChannels.remove(channelName);
|
||||||
|
} else {
|
||||||
|
allChannels.put(channelName, channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void wipeList() {
|
||||||
|
allChannels.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageConfiguration getStorage() {
|
||||||
|
return storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<WirelessChannel> getChannels() {
|
||||||
|
return allChannels.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WirelessChannel getChannel(String channelName) {
|
||||||
|
return allChannels.get(channelName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<WirelessPoint> getAllSigns() {
|
||||||
|
List<WirelessPoint> collection = new ArrayList<>();
|
||||||
|
getChannels().stream()
|
||||||
|
.map(WirelessChannel::getSigns)
|
||||||
|
.forEach(collection::addAll);
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean moveStorageFromType(StorageType storageType) {
|
||||||
|
if (!getStorage().backupData()) {
|
||||||
|
WirelessRedstone.getWRLogger().severe("Porting data to other storage type failed due to a backup problem!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageConfiguration storage;
|
||||||
|
if (storageType == StorageType.YAML) {
|
||||||
|
storage = new YamlStorage(channelFolder);
|
||||||
|
} else if (storageType == StorageType.SQLITE) {
|
||||||
|
storage = new SQLiteStorage(channelFolder);
|
||||||
|
DatabaseClient.init(new File(WirelessRedstone.getInstance().getDataFolder(), channelFolder).toString());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<WirelessChannel> channels = storage.getAllChannels();
|
||||||
|
channels.forEach(getStorage()::createChannel);
|
||||||
|
storage.close();
|
||||||
|
|
||||||
|
if (storageType == StorageType.YAML) {
|
||||||
|
final FilenameFilter filter = (dir, name) -> name.toLowerCase().endsWith(".yml");
|
||||||
|
|
||||||
|
Arrays.stream(Objects.requireNonNull(channelFolderFile.listFiles(filter)))
|
||||||
|
.forEach(File::delete);
|
||||||
|
} else {
|
||||||
|
final FilenameFilter filter = (dir, name) -> name.toLowerCase().endsWith(".db");
|
||||||
|
|
||||||
|
Arrays.stream(Objects.requireNonNull(channelFolderFile.listFiles(filter)))
|
||||||
|
.forEach(File::delete);
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessRedstone.getStorageManager().updateChannels(false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,5 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
public enum StorageType {
|
||||||
|
SQLITE, YAML
|
||||||
|
}
|
@@ -0,0 +1,208 @@
|
|||||||
|
package net.licks92.wirelessredstone.storage;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessPoint;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiver;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverClock;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverDelayer;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverInverter;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessReceiverSwitch;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessScreen;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessTransmitter;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||||
|
public class YamlStorage extends StorageConfiguration {
|
||||||
|
|
||||||
|
private final File channelFolder;
|
||||||
|
private final FilenameFilter yamlFilter = (dir, name) -> name.toLowerCase().endsWith(".yml");
|
||||||
|
|
||||||
|
public YamlStorage(String channelFolder) {
|
||||||
|
this.channelFolder = new File(WirelessRedstone.getInstance().getDataFolder(), channelFolder);
|
||||||
|
|
||||||
|
//Initialize the serialization
|
||||||
|
ConfigurationSerialization.registerClass(WirelessChannel.class, "WirelessChannel");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessTransmitter.class, "WirelessTransmitter");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessScreen.class, "WirelessScreen");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessReceiver.class, "WirelessReceiver");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessReceiverInverter.class, "WirelessReceiverInverter");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessReceiverDelayer.class, "WirelessReceiverDelayer");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessReceiverClock.class, "WirelessReceiverClock");
|
||||||
|
ConfigurationSerialization.registerClass(WirelessReceiverSwitch.class, "WirelessReceiverSwitch");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean initStorage() {
|
||||||
|
//TODO: Initstorage
|
||||||
|
|
||||||
|
WirelessRedstone.getStorageManager().updateChannels(false);
|
||||||
|
|
||||||
|
StorageType oldStorageType = canConvertFromType();
|
||||||
|
if (oldStorageType != null) {
|
||||||
|
return WirelessRedstone.getStorageManager().moveStorageFromType(oldStorageType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean close() {
|
||||||
|
//TODO: See if there is a better way to save active state
|
||||||
|
for (WirelessChannel channel : WirelessRedstone.getStorageManager().getChannels()) {
|
||||||
|
setChannel(channel.getName(), channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Collection<WirelessChannel> getAllChannels() {
|
||||||
|
Collection<WirelessChannel> channels = new ArrayList<>();
|
||||||
|
|
||||||
|
for (File f : Objects.requireNonNull(channelFolder.listFiles(yamlFilter))) {
|
||||||
|
FileConfiguration channelConfig = new YamlConfiguration();
|
||||||
|
try {
|
||||||
|
channelConfig.load(f);
|
||||||
|
} catch (InvalidConfigurationException | IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
String channelName;
|
||||||
|
try {
|
||||||
|
channelName = f.getName().split(".yml")[0];
|
||||||
|
} catch (ArrayIndexOutOfBoundsException ex) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object channel = channelConfig.get(channelName);
|
||||||
|
if (channel instanceof WirelessChannel) {
|
||||||
|
channels.add((WirelessChannel) channel);
|
||||||
|
WirelessRedstone.getWRLogger().debug("Found channel: " + ((WirelessChannel) channel).getName());
|
||||||
|
} else if (channel == null) {
|
||||||
|
WirelessRedstone.getWRLogger().debug("File " + f.getName() + " does not contain a Wireless Channel. Removing it.");
|
||||||
|
f.delete();
|
||||||
|
} else
|
||||||
|
WirelessRedstone.getWRLogger().warning("Channel " + channel + " is not of type WirelessChannel.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createChannel(WirelessChannel channel) {
|
||||||
|
if (!setChannel(channel.getName(), channel))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return super.createChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
channel.addWirelessPoint(wirelessPoint);
|
||||||
|
|
||||||
|
if (!setChannel(channelName, channel))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return super.createWirelessPoint(channelName, wirelessPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeWirelessPoint(String channelName, WirelessPoint wirelessPoint) {
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(channelName);
|
||||||
|
channel.removeWirelessPoint(wirelessPoint);
|
||||||
|
|
||||||
|
if (!setChannel(channelName, channel))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return super.removeWirelessPoint(channelName, wirelessPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateChannel(String channelName, WirelessChannel channel) {
|
||||||
|
if (!setChannel(channelName, channel))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return super.updateChannel(channelName, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeChannel(String channelName, boolean removeSigns) {
|
||||||
|
File file = new File(channelFolder, channelName + ".yml");
|
||||||
|
|
||||||
|
if (file.exists())
|
||||||
|
file.delete();
|
||||||
|
|
||||||
|
return super.removeChannel(channelName, removeSigns);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean wipeData() {
|
||||||
|
for (File f : Objects.requireNonNull(channelFolder.listFiles(yamlFilter))) {
|
||||||
|
f.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.wipeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSwitchState(WirelessChannel channel) {
|
||||||
|
for (WirelessReceiver receiver : channel.getReceivers()) {
|
||||||
|
if (receiver instanceof WirelessReceiverSwitch) {
|
||||||
|
setChannel(channel.getName(), channel);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected StorageType canConvertFromType() {
|
||||||
|
for (File file : Objects.requireNonNull(channelFolder.listFiles())) {
|
||||||
|
if (file.getName().contains(".db")) {
|
||||||
|
return StorageType.SQLITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean setChannel(String channelName, WirelessChannel channel) {
|
||||||
|
FileConfiguration channelConfig = new YamlConfiguration();
|
||||||
|
try {
|
||||||
|
File channelFile = new File(channelFolder, channelName + ".yml");
|
||||||
|
|
||||||
|
if (channel != null)
|
||||||
|
channelFile.createNewFile();
|
||||||
|
|
||||||
|
channelConfig.load(channelFile);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
return false;
|
||||||
|
} catch (IOException | InvalidConfigurationException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
channelConfig.set(channelName, channel);
|
||||||
|
|
||||||
|
try {
|
||||||
|
channelConfig.save(new File(channelFolder, channelName + ".yml"));
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user