SteamWar/SpigotCore
Archiviert
13
0

Merge pull request 'Add SchematicNode.java to Standalone' (#166) from standalone_schematicsystem into standalone
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Reviewed-on: #166
Dieser Commit ist enthalten in:
Lixfel 2022-02-02 16:59:50 +01:00
Commit f4e90146fe
4 geänderte Dateien mit 406 neuen und 195 gelöschten Zeilen

Datei anzeigen

@ -21,6 +21,7 @@ package de.steamwar.sql;
import de.steamwar.core.Core;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.List;
@ -80,4 +81,24 @@ public interface Provider {
String getConfig(int player, String config);
void updatePlayerConfig(int id, String config, String value);
void removePlayerConfig(int id, String config);
void createSchematicNode(int owner, String name, Integer parent, String type, String item);
SchematicNode getSchematicNode(int owner, String name, Integer parent);
List<SchematicNode> getSchematicNodeInNode(Integer parent);
List<SchematicNode> getSchematicDirectoryInNode(Integer parent);
SchematicNode getSchematicDirectory(String name, Integer parent);
SchematicNode getSchematicNode(String name, Integer parent);
SchematicNode getSchematicNode(int id);
List<SchematicNode> getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent);
List<SchematicNode> getAllAccessibleSchematicsOfType(int user, String schemType);
List<SchematicNode> getAllSchematicsOfType(int owner, String schemType);
List<SchematicNode> getAllSchematicsOfType(String schemType);
List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent);
List<SchematicNode> getAllSchematicsAccessibleByUser(int user);
List<SchematicNode> getAllParentsOfNode(int node);
Integer countNodes();
void updateSchematicNode(SchematicNode node);
void deleteSchematicNode(SchematicNode node);
InputStream getSchematicData(SchematicNode node) throws IOException;
void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat);
}

Datei anzeigen

@ -19,12 +19,15 @@
package de.steamwar.sql;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.*;
import java.util.function.Consumer;
import java.util.zip.GZIPInputStream;
public class SQLProvider implements Provider {
@ -354,4 +357,249 @@ public class SQLProvider implements Provider {
public void removePlayerConfig(int id, String config) {
deleteConfig.update(id, config);
}
private static final Statement createNode = new Statement("INSERT INTO SchematicNode (NodeName, NodeOwner, ParentNode, NodeType, NodeItem) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE NodeName = VALUES(NodeName), ParentNode = VALUES(ParentNode), NodeItem = VALUES(NodeItem), NodeType = VALUES(NodeType), NodeItem = VALUES(NodeItem)");
private static final Statement getSchematicNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode is NULL");
private static final Statement getSchematicNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode = ?");
private static final Statement getSchematicsInNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode is NULL ORDER BY NodeName");
private static final Statement getSchematicsInNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode = ? ORDER BY NodeName");
private static final Statement getDirsInNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode is NULL AND NodeType is NULL ORDER BY NodeName");
private static final Statement getDirsInNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode = ? AND NodeType is NULL ORDER BY NodeName");
private static final Statement getSchematicDirectory_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL ORDER BY NodeName");
private static final Statement getSchematicDirectory = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ? ORDER BY NodeName");
private static final Statement getSchematicNodeO_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL ");
private static final Statement getSchematicNodeO = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ? ORDER BY NodeName");
private static final Statement getSchematicNodeId = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ?");
private static final Statement getAllSchemsOfTypeOwner = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeType = ? ORDER BY NodeName");
private static final Statement getAllSchemsOfType = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeType = ? ORDER BY NodeName");
private static final Statement getAccessibleByUser = new Statement("SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) AND ((s.NodeOwner = ? AND s.ParentNode IS NULL) OR NOT s.NodeOwner = ?) GROUP BY s.NodeId ORDER BY s.NodeName");
private static final Statement getAccessibleByUserByTypeInNode = new Statement("WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode = ? ORDER BY NodeName");
private static final Statement getAccessibleByUserByTypeInNode_Null = new Statement("WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode is null ORDER BY NodeName");
private static final Statement getAccessibleByUserByType = new Statement("WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? ORDER BY NodeName");
private static final Statement getAllSchematicsAccessibleByUser = new Statement("WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
private static final Statement isSchematicAccessibleForUser = new Statement("WITH RECURSIVE RSN AS (SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.ParentNode, SN.NodeType, SN.NodeItem, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode SN, RSN WHERE RSN.ParentNode = SN.NodeId) SELECT COUNT(RSN.NodeId) AS `Accessible` FROM RSN LEFT Join NodeMember NM On NM.NodeId = RSN.NodeId WHERE NodeOwner = ? OR UserId = ? LIMIT 1");
private static final Statement getAllParentsOfNode = new Statement("WITH RECURSIVE RSN AS (SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ? UNION SELECT SN.NodeId, SN.NodeName, SN.NodeOwner, SN.ParentNode, SN.NodeType, SN.NodeItem, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode SN, RSN WHERE RSN.ParentNode = SN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
private static final Statement countNodes = new Statement("SELECT COUNT(NodeId) AS 'count' FROM SchematicNode");
private static final Statement updateDB = new Statement("UPDATE SchematicNode SET NodeName = ?, NodeOwner = ?, ParentNode = ?, NodeItem = ?, NodeType = ?, NodeRank = ? WHERE NodeId = ?");
private static final Statement updateDatabase = new Statement("UPDATE SchematicNode SET NodeData = ?, NodeFormat = ? WHERE NodeId = ?");
private static final Statement selSchemData = new Statement("SELECT NodeData FROM SchematicNode WHERE NodeId = ?");
private static final Statement deleteNode = new Statement("DELETE FROM SchematicNode WHERE NodeId = ?");
private static final Statement.ResultSetUser<List<SchematicNode>> toSchematicList = rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next()) {
nodes.add(nodeFromResultSet(rs));
}
return nodes;
};
private static final Statement.ResultSetUser<SchematicNode> toSchematicNode = rs -> {
if (rs.next()) {
return nodeFromResultSet(rs);
}
return null;
};
private static SchematicNode nodeFromResultSet(ResultSet set) throws SQLException {
Integer parent = set.getInt("ParentNode");
if(set.wasNull()) {
parent = null;
}
String type = set.getString("NodeType");
boolean isDir = true;
Integer rank = null;
boolean schemFormat = false;
if (type != null) {
isDir = false;
rank = set.getInt("NodeRank");
schemFormat = set.getBoolean("NodeFormat");
}
return new SchematicNode(
set.getInt("NodeId"),
set.getInt("NodeOwner"),
set.getString("NodeName"),
parent,
set.getString("NodeItem"),
type,
isDir,
rank,
set.getTimestamp("LastUpdate"),
schemFormat
);
}
@Override
public void createSchematicNode(int owner, String name, Integer parent, String type, String item) {
createNode.update(owner, name, parent, type, item);
}
@Override
public SchematicNode getSchematicNode(int owner, String name, Integer parent) {
if(parent == null) {
return getSchematicNode_Null.select(toSchematicNode, owner, name);
} else {
return getSchematicNode.select(toSchematicNode, owner, name, parent);
}
}
@Override
public List<SchematicNode> getSchematicNodeInNode(Integer parent) {
if(parent == null) {
return getSchematicsInNode_Null.select(toSchematicList);
}else {
return getSchematicsInNode.select(toSchematicList, parent);
}
}
@Override
public List<SchematicNode> getSchematicDirectoryInNode(Integer parent) {
if(parent == null) {
return getDirsInNode_Null.select(toSchematicList);
}else {
return getDirsInNode.select(toSchematicList, parent);
}
}
@Override
public SchematicNode getSchematicDirectory(String name, Integer parent) {
Statement.ResultSetUser<SchematicNode> user = rs -> {
while (rs.next()) {
SchematicNode node = nodeFromResultSet(rs);
if(node.isDir())
return node;
}
return null;
};
if(parent == null) {
return getSchematicDirectory_Null.select(user, name);
}else {
return getSchematicDirectory.select(user, name, parent);
}
}
@Override
public SchematicNode getSchematicNode(String name, Integer parent) {
if(parent == null) {
return getSchematicNodeO_Null.select(toSchematicNode, name);
}else {
return getSchematicNodeO.select(toSchematicNode, name, parent);
}
}
@Override
public SchematicNode getSchematicNode(int id) {
return getSchematicNodeId.select(rs -> {
if (!rs.next())
return null;
return nodeFromResultSet(rs);
}, id);
}
@Override
public List<SchematicNode> getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent) {
if(parent == null || parent == 0) {
return getAccessibleByUserByTypeInNode_Null.select(toSchematicList, owner, owner, schemType);
} else {
return getAccessibleByUserByTypeInNode.select(toSchematicList, owner, owner, schemType, parent);
}
}
@Override
public List<SchematicNode> getAllAccessibleSchematicsOfType(int user, String schemType) {
return getAccessibleByUserByType.select(toSchematicList, user, user, schemType);
}
@Override
public List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
return getAllSchemsOfTypeOwner.select(toSchematicList, owner, schemType);
}
@Override
public List<SchematicNode> getAllSchematicsOfType(String schemType) {
return getAllSchemsOfType.select(toSchematicList, schemType);
}
@Override
public List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) {
if (parent != null && parent != 0) {
if(Boolean.TRUE.equals(isSchematicAccessibleForUser.select(rs -> {
rs.next();
return rs.getInt("Accessible") > 0;
}, parent, user, user))) {
return getSchematicNodeInNode(parent);
}
} else {
return getAccessibleByUser.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while(rs.next())
nodes.add(nodeFromResultSet(rs));
return nodes;
}, user, user, user, user);
}
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllSchematicsAccessibleByUser(int user) {
return getAllSchematicsAccessibleByUser.select(toSchematicList, user, user);
}
@Override
public List<SchematicNode> getAllParentsOfNode(int node) {
return getAllParentsOfNode.select(toSchematicList, node);
}
@Override
public Integer countNodes() {
return countNodes.select(rs -> {
if (rs.next()) {
return rs.getInt("count");
}
return 0;
});
}
@Override
public void updateSchematicNode(SchematicNode node) {
updateDB.update(
node.getName(),
node.getOwner(),
node.getParent(),
node.getItem(),
node.getType(),
node.getRank(),
node.getId()
);
}
@Override
public void deleteSchematicNode(SchematicNode node) {
deleteNode.update(node.getId());
}
@Override
public InputStream getSchematicData(SchematicNode node) throws IOException {
try {
return selSchemData.select(rs -> {
rs.next();
Blob schemData = rs.getBlob("NodeData");
if(schemData == null) {
throw new SecurityException("SchemData is null");
}
try {
return new GZIPInputStream(schemData.getBinaryStream());
} catch (IOException e) {
throw new SecurityException("SchemData is wrong", e);
}
}, node.getId());
} catch (Exception e) {
throw new IOException(e);
}
}
@Override
public void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat) {
updateDatabase.update(blob, newFormat, node.getId());
}
}

Datei anzeigen

@ -39,33 +39,6 @@ import java.util.zip.GZIPInputStream;
public class SchematicNode {
private static final Statement createNode = new Statement("INSERT INTO SchematicNode (NodeName, NodeOwner, ParentNode, NodeType, NodeItem) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE NodeName = VALUES(NodeName), ParentNode = VALUES(ParentNode), NodeItem = VALUES(NodeItem), NodeType = VALUES(NodeType), NodeItem = VALUES(NodeItem)");
private static final Statement getSchematicNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode is NULL");
private static final Statement getSchematicNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode = ?");
private static final Statement getSchematicsInNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode is NULL ORDER BY NodeName");
private static final Statement getSchematicsInNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode = ? ORDER BY NodeName");
private static final Statement getDirsInNode_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode is NULL AND NodeType is NULL ORDER BY NodeName");
private static final Statement getDirsInNode = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode = ? AND NodeType is NULL ORDER BY NodeName");
private static final Statement getSchematicDirectory_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL ORDER BY NodeName");
private static final Statement getSchematicDirectory = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ? ORDER BY NodeName");
private static final Statement getSchematicNodeO_Null = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL ");
private static final Statement getSchematicNodeO = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ? ORDER BY NodeName");
private static final Statement getSchematicNodeId = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ?");
private static final Statement getAllSchemsOfTypeOwner = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeType = ? ORDER BY NodeName");
private static final Statement getAllSchemsOfType = new Statement("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeType = ? ORDER BY NodeName");
private static final Statement getAccessibleByUser = new Statement("SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) AND ((s.NodeOwner = ? AND s.ParentNode IS NULL) OR NOT s.NodeOwner = ?) GROUP BY s.NodeId ORDER BY s.NodeName");
private static final Statement getAccessibleByUserByTypeInNode = new Statement("WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode = ? ORDER BY NodeName");
private static final Statement getAccessibleByUserByTypeInNode_Null = new Statement("WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode is null ORDER BY NodeName");
private static final Statement getAccessibleByUserByType = new Statement("WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? ORDER BY NodeName");
private static final Statement getAllSchematicsAccessibleByUser = new Statement("WITH RECURSIVE RSN as (SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.NodeItem, SN.NodeType, SN.ParentNode, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
private static final Statement isSchematicAccessibleForUser = new Statement("WITH RECURSIVE RSN AS (SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ? union select SN.NodeId, SN.NodeName, SN.NodeOwner, SN.ParentNode, SN.NodeType, SN.NodeItem, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode SN, RSN WHERE RSN.ParentNode = SN.NodeId) SELECT COUNT(RSN.NodeId) AS `Accessible` FROM RSN LEFT Join NodeMember NM On NM.NodeId = RSN.NodeId WHERE NodeOwner = ? OR UserId = ? LIMIT 1");
private static final Statement getAllParentsOfNode = new Statement("WITH RECURSIVE RSN AS (SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ? UNION SELECT SN.NodeId, SN.NodeName, SN.NodeOwner, SN.ParentNode, SN.NodeType, SN.NodeItem, SN.NodeRank, SN.NodeFormat, SN.LastUpdate FROM SchematicNode SN, RSN WHERE RSN.ParentNode = SN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
private static final Statement countNodes = new Statement("SELECT COUNT(NodeId) AS 'count' FROM SchematicNode");
private static final Statement updateDB = new Statement("UPDATE SchematicNode SET NodeName = ?, NodeOwner = ?, ParentNode = ?, NodeItem = ?, NodeType = ?, NodeRank = ? WHERE NodeId = ?");
private static final Statement updateDatabase = new Statement("UPDATE SchematicNode SET NodeData = ?, NodeFormat = ? WHERE NodeId = ?");
private static final Statement selSchemData = new Statement("SELECT NodeData FROM SchematicNode WHERE NodeId = ?");
private static final Statement deleteNode = new Statement("DELETE FROM SchematicNode WHERE NodeId = ?");
public static SchematicNode createSchematic(int owner, String name, Integer parent) {
return createSchematicNode(owner, name, parent, SchematicType.Normal.toDB(), "");
}
@ -77,7 +50,7 @@ public class SchematicNode {
public static SchematicNode createSchematicNode(int owner, String name, Integer parent, String type, String item) {
if (parent != null && parent == 0)
parent = null;
createNode.update(name, owner, parent, type, item);
Provider.impl.createSchematicNode(owner, name, parent, type, item);
return getSchematicNode(owner, name, parent);
}
@ -85,23 +58,29 @@ public class SchematicNode {
return getSchematicNode(owner, name, parent.getId());
}
private SchematicNode(ResultSet set) throws SQLException {
id = set.getInt("NodeId");
owner = set.getInt("NodeOwner");
name = set.getString("NodeName");
parent = set.getInt("ParentNode");
if(set.wasNull()) {
parent = null;
}
item = set.getString("NodeItem");
type = set.getString("NodeType");
lastUpdate = set.getTimestamp("LastUpdate");
if (type != null) {
isDir = false;
rank = set.getInt("NodeRank");
schemFormat = set.getBoolean("NodeFormat");
} else {
isDir = true;
public SchematicNode(
int id,
int owner,
String name,
Integer parent,
String item,
String type,
boolean isDir,
int rank,
Timestamp lastUpdate,
boolean schemFormat
) {
this.id = id;
this.owner = owner;
this.name = name;
this.parent = parent;
this.item = item;
this.type = type;
this.lastUpdate = lastUpdate;
this.isDir = isDir;
if (!isDir) {
this.schemFormat = schemFormat;
this.rank = rank;
}
}
@ -117,136 +96,60 @@ public class SchematicNode {
if (parent != null && parent == 0) {
parent = null;
}
Statement.ResultSetUser<SchematicNode> user = rs -> {
if (rs.next()) {
return new SchematicNode(rs);
}
return null;
};
if(parent == null) {
return getSchematicNode_Null.select(user, owner, name);
} else {
return getSchematicNode.select(user, owner, name, parent);
}
return Provider.impl.getSchematicNode(owner, name, parent);
}
public static List<SchematicNode> getSchematicNodeInNode(Integer parent) {
if(parent != null && parent == 0)
if(parent != null && parent == 0) {
parent = null;
Statement.ResultSetUser<List<SchematicNode>> user = rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next()) {
nodes.add(new SchematicNode(rs));
}
return nodes;
};
if(parent == null) {
return getSchematicsInNode_Null.select(user);
}else {
return getSchematicsInNode.select(user, parent);
}
return Provider.impl.getSchematicNodeInNode(parent);
}
public static List<SchematicNode> getSchematicDirectoryInNode(Integer parent) {
if(parent != null && parent == 0)
if(parent != null && parent == 0) {
parent = null;
Statement.ResultSetUser<List<SchematicNode>> user = rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next())
nodes.add(new SchematicNode(rs));
return nodes;
};
if(parent == null) {
return getDirsInNode_Null.select(user);
}else {
return getDirsInNode.select(user, parent);
}
return Provider.impl.getSchematicDirectoryInNode(parent);
}
public static SchematicNode getSchematicDirectory(String name, Integer parent) {
if(parent != null && parent == 0)
if(parent != null && parent == 0) {
parent = null;
Statement.ResultSetUser<SchematicNode> user = rs -> {
while (rs.next()) {
SchematicNode node = new SchematicNode(rs);
if(node.isDir())
return node;
}
return null;
};
if(parent == null) {
return getSchematicDirectory_Null.select(user, name);
}else {
return getSchematicDirectory.select(user, name, parent);
}
return Provider.impl.getSchematicDirectory(name, parent);
}
public static SchematicNode getSchematicNode(String name, Integer parent) {
if(parent != null && parent == 0)
if(parent != null && parent == 0) {
parent = null;
Statement.ResultSetUser<SchematicNode> user = rs -> {
while (rs.next()) {
return new SchematicNode(rs);
}
return null;
};
if(parent == null) {
return getSchematicNodeO_Null.select(user, name);
}else {
return getSchematicNodeO.select(user, name, parent);
}
return Provider.impl.getSchematicNode(name, parent);
}
public static SchematicNode getSchematicNode(int id) {
return getSchematicNodeId.select(rs -> {
if (!rs.next())
return null;
return new SchematicNode(rs);
}, id);
return Provider.impl.getSchematicNode(id);
}
public static List<SchematicNode> getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent) {
Statement.ResultSetUser<List<SchematicNode>> user = rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next()) {
nodes.add(new SchematicNode(rs));
}
return nodes;
};
if(parent == null || parent == 0) {
return getAccessibleByUserByTypeInNode_Null.select(user, owner, owner, schemType);
} else {
return getAccessibleByUserByTypeInNode.select(user, owner, owner, schemType, parent);
}
return Provider.impl.getAccessibleSchematicsOfTypeInParent(owner, schemType, parent);
}
public static List<SchematicNode> getAllAccessibleSchematicsOfType(int user, String schemType) {
return getAccessibleByUserByType.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next()) {
nodes.add(new SchematicNode(rs));
}
return nodes;
}, user, user, schemType);
return Provider.impl.getAllAccessibleSchematicsOfType(user, schemType);
}
public static List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
return getAllSchemsOfTypeOwner.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next())
nodes.add(new SchematicNode(rs));
return nodes;
}, owner, schemType);
return Provider.impl.getAllSchematicsOfType(owner, schemType);
}
@Deprecated
public static List<SchematicNode> getAllSchematicsOfType(String schemType) {
return getAllSchemsOfType.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while (rs.next())
nodes.add(new SchematicNode(rs));
return nodes;
}, schemType);
return Provider.impl.getAllSchematicsOfType(schemType);
}
public static List<SchematicNode> getAllSchematicsOfType(SchematicType schemType) {
return Provider.impl.getAllSchematicsOfType(schemType.toDB());
}
public static List<SchematicNode> deepGet(Integer parent, Predicate<SchematicNode> filter) {
@ -264,32 +167,11 @@ public class SchematicNode {
}
public static List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) {
if (parent != null && parent != 0) {
if(Boolean.TRUE.equals(isSchematicAccessibleForUser.select(rs -> {
rs.next();
return rs.getInt("Accessible") > 0;
}, parent, user, user))) {
return getSchematicNodeInNode(parent);
}
} else {
return getAccessibleByUser.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while(rs.next())
nodes.add(new SchematicNode(rs));
return nodes;
}, user, user, user, user);
}
return Collections.emptyList();
return Provider.impl.getSchematicsAccessibleByUser(user, parent);
}
public static List<SchematicNode> getAllSchematicsAccessibleByUser(int user) {
return getAllSchematicsAccessibleByUser.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while(rs.next()) {
nodes.add(new SchematicNode(rs));
}
return nodes;
}, user, user);
return Provider.impl.getAllSchematicsAccessibleByUser(user);
}
public static List<SchematicNode> getAllParentsOfNode(SchematicNode node) {
@ -297,13 +179,7 @@ public class SchematicNode {
}
public static List<SchematicNode> getAllParentsOfNode(int node) {
return getAllParentsOfNode.select(rs -> {
List<SchematicNode> nodes = new ArrayList<>();
while(rs.next()) {
nodes.add(new SchematicNode(rs));
}
return nodes;
}, node);
return Provider.impl.getAllParentsOfNode(node);
}
public static SchematicNode getNodeFromPath(SteamwarUser user, String s) {
@ -367,12 +243,7 @@ public class SchematicNode {
}
public static Integer countNodes() {
return countNodes.select(rs -> {
if (rs.next()) {
return rs.getInt("count");
}
return 0;
});
return Provider.impl.countNodes();
}
public int getId() {
@ -501,32 +372,17 @@ public class SchematicNode {
}
private void updateDB() {
updateDB.update(name, owner, parent, item, type, rank, id);
Provider.impl.updateSchematicNode(this);
this.lastUpdate = Timestamp.from(Instant.now());
this.brCache.clear();
}
public void delete() {
deleteNode.update(id);
Provider.impl.deleteSchematicNode(this);
}
public InputStream schemData() throws IOException {
try {
return selSchemData.select(rs -> {
rs.next();
Blob schemData = rs.getBlob("NodeData");
if(schemData == null) {
throw new SecurityException("SchemData is null");
}
try {
return new GZIPInputStream(schemData.getBinaryStream());
} catch (IOException e) {
throw new SecurityException("SchemData is wrong", e);
}
}, id);
} catch (Exception e) {
throw new IOException(e);
}
return Provider.impl.getSchematicData(this);
}
public Clipboard load() throws IOException, NoClipboardException {
@ -560,7 +416,7 @@ public class SchematicNode {
}
private void updateDatabase(InputStream blob, boolean newFormat) {
updateDatabase.update(blob, newFormat, id);
Provider.impl.saveSchematicNode(this, blob, newFormat);
schemFormat = newFormat;
}

Datei anzeigen

@ -23,6 +23,7 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
import java.time.Instant;
@ -191,5 +192,90 @@ public class StandaloneProvider implements Provider {
configs.computeIfAbsent(id, player -> new HashMap<>()).remove(config);
}
@Override
public void createSchematicNode(int owner, String name, Integer parent, String type, String item) {}
@Override
public SchematicNode getSchematicNode(int owner, String name, Integer parent) {
return null;
}
@Override
public List<SchematicNode> getSchematicNodeInNode(Integer parent) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getSchematicDirectoryInNode(Integer parent) {
return Collections.emptyList();
}
@Override
public SchematicNode getSchematicDirectory(String name, Integer parent) {
return null;
}
@Override
public SchematicNode getSchematicNode(String name, Integer parent) {
return null;
}
@Override
public SchematicNode getSchematicNode(int id) {
return null;
}
@Override
public List<SchematicNode> getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllAccessibleSchematicsOfType(int user, String schemType) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllSchematicsOfType(String schemType) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllSchematicsAccessibleByUser(int user) {
return Collections.emptyList();
}
@Override
public List<SchematicNode> getAllParentsOfNode(int node) {
return Collections.emptyList();
}
@Override
public Integer countNodes() {
return 0;
}
@Override
public void updateSchematicNode(SchematicNode node) {}
@Override
public void deleteSchematicNode(SchematicNode node) {}
@Override
public InputStream getSchematicData(SchematicNode node) throws IOException {
return null;
}
@Override
public void saveSchematicNode(SchematicNode node, InputStream blob, boolean newFormat) {}
}