NodeMember: CommenCore #27
248
src/de/steamwar/sql/EffectiveSchematicNode.java
Normale Datei
248
src/de/steamwar/sql/EffectiveSchematicNode.java
Normale Datei
@ -0,0 +1,248 @@
|
||||
package de.steamwar.sql;
|
||||
|
||||
import de.steamwar.sql.internal.Field;
|
||||
import de.steamwar.sql.internal.SelectStatement;
|
||||
import de.steamwar.sql.internal.Table;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static de.steamwar.sql.SchematicNode.TAB_CACHE;
|
||||
|
||||
public class EffectiveSchematicNode {
|
||||
|
||||
private static final Table<EffectiveSchematicNode> table = new Table<>(EffectiveSchematicNode.class, "EffectiveSchematicNode");
|
||||
|
||||
private static final SelectStatement<EffectiveSchematicNode> all = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? ORDER BY NodeName");
|
||||
|
||||
private static final SelectStatement<EffectiveSchematicNode> list_null = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND ParentNode is null ORDER BY NodeName");
|
||||
private static final SelectStatement<EffectiveSchematicNode> list = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND ParentNode = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<EffectiveSchematicNode> byParentName = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND ParentNode = ? AND NodeName = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<EffectiveSchematicNode> byParentName_null = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND ParentNode is null AND NodeName = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<EffectiveSchematicNode> schematicAccessibleForUser = new SelectStatement<>(table, "SELECT COUNT(DISTINCT NodeId) FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND NodeId = ?");
|
||||
private static final SelectStatement<EffectiveSchematicNode> accessibleByUserTypeParent = new SelectStatement<>(table, "WITH RECURSIVE RSN AS (SELECT NodeId, ParentNode FROM EffectiveSchematicNode WHERE NodeType = ? AND EffectiveOwner = ? UNION SELECT SN.NodeId, SN.ParentNode FROM RSN, EffectiveSchematicNode SN WHERE SN.NodeId = RSN.ParentNode AND EffectiveOwner = ?) SELECT SN.NodeId, SN.NodeOwner, ? AS EffectiveOwner, SN.NodeName, RSN.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank FROM RSN INNER JOIN SchematicNode SN ON RSN.NodeId = SN.NodeId");
|
||||
private static final SelectStatement<EffectiveSchematicNode> accessibleByUserTypeInParent = new SelectStatement<>(table, "WITH RECURSIVE RSN AS (SELECT NodeId, ParentNode FROM EffectiveSchematicNode WHERE NodeType = ? AND EffectiveOwner = ? UNION SELECT SN.NodeId, SN.ParentNode FROM RSN, EffectiveSchematicNode SN WHERE SN.NodeId = RSN.ParentNode AND EffectiveOwner = ?) SELECT SN.NodeId, SN.NodeOwner, ? AS EffectiveOwner, SN.NodeName, RSN.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank FROM RSN INNER JOIN SchematicNode SN ON RSN.NodeId = SN.NodeId WHERE RSN.ParentNode = ?");
|
||||
private static final SelectStatement<EffectiveSchematicNode> accessibleByUserTypeInParent_null = new SelectStatement<>(table, "WITH RECURSIVE RSN AS (SELECT NodeId, ParentNode FROM EffectiveSchematicNode WHERE NodeType = ? AND EffectiveOwner = ? UNION SELECT SN.NodeId, SN.ParentNode FROM RSN, EffectiveSchematicNode SN WHERE SN.NodeId = RSN.ParentNode AND EffectiveOwner = ?) SELECT SN.NodeId, SN.NodeOwner, ? AS EffectiveOwner, SN.NodeName, RSN.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank FROM RSN INNER JOIN SchematicNode SN ON RSN.NodeId = SN.NodeId WHERE RSN.ParentNode is null");
|
||||
private static final SelectStatement<EffectiveSchematicNode> accessibleByUserType = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND NodeType = ?");
|
||||
private static final SelectStatement<EffectiveSchematicNode> byIdAndUser = new SelectStatement<>(table, "SELECT * FROM EffectiveSchematicNode WHERE EffectiveOwner = ? AND NodeId = ?");
|
||||
private static final SelectStatement<EffectiveSchematicNode> allParentsOfNode = new SelectStatement<>(table, "WITH RECURSIVE R AS (SELECT NodeId, ParentNode FROM EffectiveSchematicNode WHERE NodeId = ? AND EffectiveOwner = ? UNION SELECT E.NodeId, E.ParentNode FROM R, EffectiveSchematicNode E WHERE R.ParentNode = E.NodeId AND E.EffectiveOwner = ?) SELECT SN.NodeId, SN.NodeOwner, ? AS EffectiveOwner, SN.NodeName, R.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank FROM R INNER JOIN SchematicNode SN ON SN.NodeId = R.NodeId");
|
||||
|
||||
public static List<EffectiveSchematicNode> getAll(SteamwarUser user) {
|
||||
return all.listSelect(user);
|
||||
}
|
||||
|
||||
public static Map<Integer, List<EffectiveSchematicNode>> getAllMap(SteamwarUser user) {
|
||||
return map(all.listSelect(user));
|
||||
}
|
||||
|
||||
public static List<EffectiveSchematicNode> list(SteamwarUser user, Integer schematicId) {
|
||||
if(schematicId == null || schematicId == 0) {
|
||||
return list_null.listSelect(user);
|
||||
} else {
|
||||
return list.listSelect(user, schematicId);
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EffectiveSchematicNode> byParentName(SteamwarUser user, Integer schematicId, String name) {
|
||||
if(schematicId == null || schematicId == 0) {
|
||||
return Optional.ofNullable(byParentName_null.select(user, name));
|
||||
} else {
|
||||
return Optional.ofNullable(byParentName.select(user, schematicId, name));
|
||||
}
|
||||
}
|
||||
|
||||
public static List<EffectiveSchematicNode> accessibleByUserType(SteamwarUser user, SchematicType type) {
|
||||
return accessibleByUserType.listSelect(type, user, user, user);
|
||||
}
|
||||
|
||||
public static Map<Integer, List<EffectiveSchematicNode>> accessibleByUserTypeMap(SteamwarUser user, SchematicType type) {
|
||||
return map(accessibleByUserTypeParent.listSelect(type, user, user, user));
|
||||
}
|
||||
|
||||
public static boolean schematicAccessibleForUser(SteamwarUser user, Integer schematicId) {
|
||||
return schematicAccessibleForUser.select(user, schematicId) != null;
|
||||
}
|
||||
|
||||
public static List<EffectiveSchematicNode> accessibleByUserTypeParent(SteamwarUser user, SchematicType type, Integer parentId) {
|
||||
if(parentId == null || parentId == 0) {
|
||||
return accessibleByUserTypeInParent_null.listSelect(type, user, user, user);
|
||||
} else {
|
||||
return accessibleByUserTypeInParent.listSelect(type, user, user, user, parentId);
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EffectiveSchematicNode> byIdAndUser(SteamwarUser user, Integer id) {
|
||||
return Optional.ofNullable(byIdAndUser.select(user, id));
|
||||
}
|
||||
|
||||
public static List<EffectiveSchematicNode> parentsOfNode(SteamwarUser user, Integer id) {
|
||||
return allParentsOfNode.listSelect(id, user, user, user).stream().filter(n -> n.getNodeId() != id).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static Map<Integer, List<EffectiveSchematicNode>> map(List<EffectiveSchematicNode> in) {
|
||||
Map<Integer, List<EffectiveSchematicNode>> map = new HashMap<>();
|
||||
for (EffectiveSchematicNode effectiveSchematicNode : in) {
|
||||
map.computeIfAbsent(effectiveSchematicNode.getNodeParent().orElse(0), k -> new ArrayList<>()).add(effectiveSchematicNode);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Field
|
||||
private final int nodeId;
|
||||
@Getter
|
||||
@Field
|
||||
private final int nodeOwner;
|
||||
@Getter
|
||||
@Field
|
||||
private final int effectiveOwner;
|
||||
@Getter
|
||||
@Field
|
||||
private final String nodeName;
|
||||
@Field(nullable = true)
|
||||
private final Integer parentNode;
|
||||
@Getter
|
||||
@Field
|
||||
private final Timestamp lastUpdate;
|
||||
@Field
|
||||
private final String nodeItem;
|
||||
@Field(nullable = true)
|
||||
private final SchematicType nodeType;
|
||||
@Field
|
||||
private final int nodeRank;
|
||||
|
||||
private String brCache = null;
|
||||
|
||||
public EffectiveSchematicNode(int nodeId, int nodeOwner, int effectiveOwner, String nodeName, Integer nodeParent, Timestamp lastUpdate, String nodeItem, SchematicType nodeType, int nodeRank) {
|
||||
this.nodeId = nodeId;
|
||||
this.nodeOwner = nodeOwner;
|
||||
this.effectiveOwner = effectiveOwner;
|
||||
this.nodeName = nodeName;
|
||||
this.parentNode = nodeParent;
|
||||
this.lastUpdate = lastUpdate;
|
||||
this.nodeItem = nodeItem;
|
||||
this.nodeType = nodeType;
|
||||
this.nodeRank = nodeRank;
|
||||
}
|
||||
|
||||
public boolean isDir() {
|
||||
return nodeType == null;
|
||||
}
|
||||
|
||||
public Optional<Integer> getNodeParent() {
|
||||
return Optional.ofNullable(parentNode);
|
||||
}
|
||||
|
||||
public Optional<EffectiveSchematicNode> getParentNode() {
|
||||
return byIdAndUser(SteamwarUser.get(effectiveOwner), parentNode);
|
||||
}
|
||||
|
||||
public SchematicType getNodeType() {
|
||||
if(isDir()) {
|
||||
throw new IllegalStateException("This node is a directory");
|
||||
}
|
||||
return nodeType;
|
||||
}
|
||||
|
||||
public int getNodeRank() {
|
||||
if(isDir()) {
|
||||
throw new IllegalStateException("This node is a directory");
|
||||
}
|
||||
return nodeRank;
|
||||
}
|
||||
|
||||
public SchematicNode toSchematicNode() {
|
||||
return SchematicNode.getSchematicNode(nodeId);
|
||||
}
|
||||
|
||||
public boolean isWritable() {
|
||||
return effectiveOwner == nodeOwner;
|
||||
}
|
||||
|
||||
public String getNodeItem() {
|
||||
if (nodeItem.isEmpty()) {
|
||||
return isDir() ? "CHEST" : "CAULDRON_ITEM";
|
||||
}
|
||||
return nodeItem;
|
||||
}
|
||||
|
||||
public static List<String> getNodeTabcomplete(SteamwarUser user, String s) {
|
||||
boolean sws = s.startsWith("/");
|
||||
if (sws) {
|
||||
s = s.substring(1);
|
||||
}
|
||||
int index = s.lastIndexOf("/");
|
||||
String cacheKey = index == -1 ? "" : s.substring(0, index);
|
||||
if(TAB_CACHE.containsKey(user.getId()) && TAB_CACHE.get(user.getId()).containsKey(cacheKey)) {
|
||||
return new ArrayList<>(TAB_CACHE.get(user.getId()).get(cacheKey));
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
if (s.contains("/")) {
|
||||
String preTab = s.substring(0, s.lastIndexOf("/") + 1);
|
||||
Optional<EffectiveSchematicNode> pa = EffectiveSchematicNode.getNodeFromPath(user, preTab);
|
||||
if (!pa.isPresent()) return Collections.emptyList();
|
||||
List<EffectiveSchematicNode> nodes = EffectiveSchematicNode.list(user, pa.get().getNodeId());
|
||||
nodes.forEach(node -> list.add((sws ? "/" : "") + node.generateBreadcrumbs()));
|
||||
} else {
|
||||
List<EffectiveSchematicNode> nodes = EffectiveSchematicNode.list(user, 0);
|
||||
nodes.forEach(node -> list.add((sws ? "/" : "") + node.getNodeName() + (node.isDir() ? "/" : "")));
|
||||
}
|
||||
list.remove("//copy");
|
||||
TAB_CACHE.computeIfAbsent(user.getId(), integer -> new HashMap<>()).putIfAbsent(cacheKey, list);
|
||||
return list;
|
||||
}
|
||||
|
||||
public String generateBreadcrumbs() {
|
||||
if(brCache == null) {
|
||||
brCache = generateBreadcrumbs("/");
|
||||
}
|
||||
return brCache;
|
||||
}
|
||||
|
||||
public String generateBreadcrumbs(String split) {
|
||||
StringBuilder builder = new StringBuilder(getNodeName());
|
||||
Optional<EffectiveSchematicNode> currentNode = Optional.of(this);
|
||||
if(currentNode.map(EffectiveSchematicNode::isDir).orElse(false)) {
|
||||
builder.append("/");
|
||||
}
|
||||
while (currentNode.isPresent()) {
|
||||
currentNode = currentNode.flatMap(EffectiveSchematicNode::getNodeParent).flatMap(integer -> byIdAndUser(SteamwarUser.get(effectiveOwner), integer));
|
||||
currentNode.ifPresent(node -> builder.insert(0, '/').insert(0, node.getNodeName()));
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static Optional<EffectiveSchematicNode> getNodeFromPath(SteamwarUser user, String s) {
|
||||
if (s.startsWith("/")) {
|
||||
s = s.substring(1);
|
||||
}
|
||||
if (s.endsWith("/")) {
|
||||
s = s.substring(0, s.length() - 1);
|
||||
}
|
||||
if (s.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
if (s.contains("/")) {
|
||||
String[] layers = s.split("/");
|
||||
Optional<EffectiveSchematicNode> currentNode = EffectiveSchematicNode.byParentName(user, 0, layers[0]);
|
||||
for (int i = 1; i < layers.length; i++) {
|
||||
int finalI = i;
|
||||
Optional<EffectiveSchematicNode> node = currentNode.flatMap(effectiveSchematicNode -> EffectiveSchematicNode.byParentName(user, effectiveSchematicNode.getNodeId(), layers[finalI]));
|
||||
if (!node.isPresent()) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
currentNode = node;
|
||||
if (!currentNode.map(EffectiveSchematicNode::isDir).orElse(false) && i != layers.length - 1) {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
}
|
||||
return currentNode;
|
||||
} else {
|
||||
return EffectiveSchematicNode.byParentName(user, 0, s);
|
||||
}
|
||||
}
|
||||
}
|
@ -26,6 +26,7 @@ import de.steamwar.sql.internal.Table;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
@AllArgsConstructor
|
||||
@ -39,13 +40,16 @@ public class NodeMember {
|
||||
private static final SelectStatement<NodeMember> getNodeMember = table.select(Table.PRIMARY);
|
||||
private static final SelectStatement<NodeMember> getNodeMembers = table.selectFields("NodeId");
|
||||
private static final SelectStatement<NodeMember> getSchematics = table.selectFields("UserId");
|
||||
private static final Statement create = table.insertAll();
|
||||
private static final Statement create = table.insert(Table.PRIMARY);
|
||||
private static final Statement delete = table.delete(Table.PRIMARY);
|
||||
private static final Statement updateParent = table.update(Table.PRIMARY, "ParentId");
|
||||
|
||||
@Field(keys = {Table.PRIMARY})
|
||||
private final int nodeId;
|
||||
@Field(keys = {Table.PRIMARY})
|
||||
private final int userId;
|
||||
@Field(nullable = true, def = "null")
|
||||
private Integer parentId;
|
||||
|
||||
public int getNode() {
|
||||
return nodeId;
|
||||
@ -55,13 +59,17 @@ public class NodeMember {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public Optional<Integer> getParent() {
|
||||
return Optional.ofNullable(parentId);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
delete.update(nodeId, userId);
|
||||
}
|
||||
|
||||
public static NodeMember createNodeMember(int node, int member) {
|
||||
create.update(node, member);
|
||||
return new NodeMember(node, member);
|
||||
return new NodeMember(node, member, null);
|
||||
}
|
||||
|
||||
public static NodeMember getNodeMember(int node, int member) {
|
||||
@ -75,4 +83,9 @@ public class NodeMember {
|
||||
public static Set<NodeMember> getSchematics(int member) {
|
||||
return new HashSet<>(getSchematics.listSelect(member));
|
||||
}
|
||||
|
||||
public void setParentId(Integer parentId) {
|
||||
this.parentId = Optional.ofNullable(parentId).orElse(0) == 0 ? null : parentId;
|
||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
|
||||
updateParent.update(this.parentId, nodeId, userId);
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ public class SchematicNode {
|
||||
new SqlTypeMapper<>(SchematicNode.class, null, (rs, identifier) -> { throw new SecurityException("SchematicNode cannot be used as type (recursive select)"); }, (st, index, value) -> st.setInt(index, value.nodeId));
|
||||
}
|
||||
|
||||
private static final Map<Integer, Map<String, List<String>>> TAB_CACHE = new HashMap<>();
|
||||
protected static final Map<Integer, Map<String, List<String>>> TAB_CACHE = new HashMap<>();
|
||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Muss glaube nicht protected sein... Muss glaube nicht protected sein...
|
||||
public static void clear() {
|
||||
TAB_CACHE.clear();
|
||||
}
|
||||
@ -62,14 +62,8 @@ public class SchematicNode {
|
||||
private static final SelectStatement<SchematicNode> dirsByParent_null = new SelectStatement<>(table, nodeSelectCreator("") + "WHERE ParentNode is NULL AND NodeType is NULL ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> byParentName = table.selectFields("NodeName", "ParentNode");
|
||||
private static final SelectStatement<SchematicNode> byParentName_null = new SelectStatement<>(table, nodeSelectCreator("") + "WHERE NodeName = ? AND ParentNode is NULL");
|
||||
private static final SelectStatement<SchematicNode> accessibleByUserTypeParent = new SelectStatement<>(table, "WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (" + nodeSelectCreator("s.") + "s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId UNION " + nodeSelectCreator("SN.") + "AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? UNION " + nodeSelectCreator("SN.") + "AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> accessibleByUserTypeParent_Null = new SelectStatement<>(table, "WITH RECURSIVE RSNB AS (WITH RECURSIVE RSN as (" + nodeSelectCreator("s.") + "s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId UNION " + nodeSelectCreator("SN.") + "AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? UNION " + nodeSelectCreator("SN.") + "AS SN, RSNB WHERE SN.NodeId = RSNB.ParentNode)SELECT * FROM RSNB WHERE ParentNode is null ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> accessibleByUserType = new SelectStatement<>(table, "WITH RECURSIVE RSN as (" + nodeSelectCreator("s.") + "s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId UNION " + nodeSelectCreator("SN.") + "AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN WHERE NodeType = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> byOwnerType = new SelectStatement<>(table, nodeSelectCreator("") + "WHERE NodeOwner = ? AND NodeType = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> byType = new SelectStatement<>(table, nodeSelectCreator("") + "WHERE NodeType = ? ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> accessibleByUser = new SelectStatement<>(table, nodeSelectCreator("s.") + "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 schematicAccessibleForUser = new Statement("WITH RECURSIVE RSN AS (" + nodeSelectCreator("") + "WHERE NodeId = ? UNION " + nodeSelectCreator("SN.") + "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 SelectStatement<SchematicNode> allAccessibleByUser = new SelectStatement<>(table, "WITH RECURSIVE RSN as (" + nodeSelectCreator("s.") + "s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) GROUP BY s.NodeId UNION " + nodeSelectCreator("SN.") + "AS SN, RSN WHERE SN.ParentNode = RSN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
|
||||
private static final SelectStatement<SchematicNode> allParentsOfNode = new SelectStatement<>(table, "WITH RECURSIVE RSN AS (" + nodeSelectCreator("") + "WHERE NodeId = ? UNION " + nodeSelectCreator("SN.") + "SN, RSN WHERE RSN.ParentNode = SN.NodeId) SELECT * FROM RSN ORDER BY NodeName");
|
||||
|
||||
static {
|
||||
@ -100,8 +94,6 @@ public class SchematicNode {
|
||||
@Field(def = "1")
|
||||
private boolean nodeFormat;
|
||||
|
||||
private final Map<Integer, String> brCache = new HashMap<>();
|
||||
|
||||
public SchematicNode(
|
||||
int nodeId,
|
||||
int nodeOwner,
|
||||
@ -196,14 +188,14 @@ public class SchematicNode {
|
||||
return byId.select(id);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static List<SchematicNode> getAccessibleSchematicsOfTypeInParent(int owner, String schemType, Integer parent) {
|
||||
if(parent == null || parent == 0)
|
||||
return accessibleByUserTypeParent_Null.listSelect(owner, owner, schemType);
|
||||
return accessibleByUserTypeParent.listSelect(owner, owner, schemType, parent);
|
||||
return EffectiveSchematicNode.accessibleByUserTypeParent(SteamwarUser.get(owner), SchematicType.fromDB(schemType), parent).stream().map(EffectiveSchematicNode::toSchematicNode).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static List<SchematicNode> getAllAccessibleSchematicsOfType(int user, String schemType) {
|
||||
return accessibleByUserType.listSelect(user, user, schemType);
|
||||
return EffectiveSchematicNode.accessibleByUserType(SteamwarUser.get(user), SchematicType.fromDB(schemType)).stream().map(EffectiveSchematicNode::toSchematicNode).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
|
||||
@ -233,21 +225,14 @@ public class SchematicNode {
|
||||
return finalList;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) {
|
||||
if (parent == null || parent == 0)
|
||||
return accessibleByUser.listSelect(user, user, user, user);
|
||||
|
||||
if(schematicAccessibleForUser.select(rs -> {
|
||||
rs.next();
|
||||
return rs.getInt("Accessible") > 0;
|
||||
}, parent, user, user))
|
||||
return getSchematicNodeInNode(parent);
|
||||
|
||||
return Collections.emptyList();
|
||||
return EffectiveSchematicNode.list(SteamwarUser.get(user), parent).stream().map(EffectiveSchematicNode::toSchematicNode).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static List<SchematicNode> getAllSchematicsAccessibleByUser(int user) {
|
||||
return allAccessibleByUser.listSelect(user, user);
|
||||
return EffectiveSchematicNode.getAll(SteamwarUser.get(user)).stream().map(EffectiveSchematicNode::toSchematicNode).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static List<SchematicNode> getAllParentsOfNode(SchematicNode node) {
|
||||
@ -258,38 +243,9 @@ public class SchematicNode {
|
||||
return allParentsOfNode.listSelect(node);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static SchematicNode getNodeFromPath(SteamwarUser user, String s) {
|
||||
if (s.startsWith("/")) {
|
||||
s = s.substring(1);
|
||||
}
|
||||
if (s.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (s.contains("/")) {
|
||||
String[] layers = s.split("/");
|
||||
SchematicNode currentNode = null;
|
||||
for (int i = 0; i < layers.length; i++) {
|
||||
int finalI = i;
|
||||
Optional<SchematicNode> node;
|
||||
if (currentNode == null) {
|
||||
node = SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0).stream().filter(node1 -> node1.getName().equals(layers[finalI])).findAny();
|
||||
} else {
|
||||
node = Optional.ofNullable(SchematicNode.getSchematicNode(layers[i], currentNode.getId()));
|
||||
}
|
||||
if (!node.isPresent()) {
|
||||
return null;
|
||||
} else {
|
||||
currentNode = node.get();
|
||||
if (!currentNode.isDir() && i != layers.length - 1) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return currentNode;
|
||||
} else {
|
||||
String finalS = s;
|
||||
return SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0).stream().filter(node1 -> node1.getName().equals(finalS)).findAny().orElse(null);
|
||||
}
|
||||
return EffectiveSchematicNode.getNodeFromPath(user, s).map(EffectiveSchematicNode::toSchematicNode).orElse(null);
|
||||
}
|
||||
|
||||
public static List<SchematicNode> filterSchems(int user, Predicate<SchematicNode> filter) {
|
||||
@ -448,7 +404,6 @@ public class SchematicNode {
|
||||
private void updateDB() {
|
||||
this.lastUpdate = Timestamp.from(Instant.now());
|
||||
update.update(nodeName, parentNode, nodeItem, nodeType, nodeRank, replaceColor, allowReplay, nodeFormat, nodeId);
|
||||
this.brCache.clear();
|
||||
TAB_CACHE.clear();
|
||||
}
|
||||
|
||||
@ -470,23 +425,11 @@ public class SchematicNode {
|
||||
}
|
||||
|
||||
public String generateBreadcrumbs(SteamwarUser user) {
|
||||
return brCache.computeIfAbsent(user.getId(), integer -> generateBreadcrumbs("/", user));
|
||||
return EffectiveSchematicNode.byIdAndUser(user, nodeId).map(EffectiveSchematicNode::generateBreadcrumbs).orElse("/");
|
||||
}
|
||||
|
||||
public String generateBreadcrumbs(String split, SteamwarUser user) {
|
||||
StringBuilder builder = new StringBuilder(getName());
|
||||
SchematicNode currentNode = this;
|
||||
if (currentNode.isDir()) builder.append("/");
|
||||
final Set<NodeMember> nodeMembers = NodeMember.getSchematics(user.getId());
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
i.set(currentNode.getId());
|
||||
while (currentNode.getParentNode() != null && nodeMembers.stream().noneMatch(nodeMember -> nodeMember.getNode() == i.get())) {
|
||||
currentNode = currentNode.getParentNode();
|
||||
i.set(currentNode.getId());
|
||||
builder.insert(0, split)
|
||||
.insert(0, currentNode.getName());
|
||||
}
|
||||
return builder.toString();
|
||||
return EffectiveSchematicNode.byIdAndUser(user, nodeId).map(node -> node.generateBreadcrumbs(split)).orElse("/");
|
||||
}
|
||||
|
||||
private static final List<String> FORBIDDEN_NAMES = Collections.unmodifiableList(Arrays.asList("public"));
|
||||
@ -513,30 +456,9 @@ public class SchematicNode {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static List<String> getNodeTabcomplete(SteamwarUser user, String s) {
|
||||
boolean sws = s.startsWith("/");
|
||||
if (sws) {
|
||||
s = s.substring(1);
|
||||
}
|
||||
int index = s.lastIndexOf("/");
|
||||
String cacheKey = index == -1 ? "" : s.substring(0, index);
|
||||
if(TAB_CACHE.containsKey(user.getId()) && TAB_CACHE.get(user.getId()).containsKey(cacheKey)) {
|
||||
return new ArrayList<>(TAB_CACHE.get(user.getId()).get(cacheKey));
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
if (s.contains("/")) {
|
||||
String preTab = s.substring(0, s.lastIndexOf("/") + 1);
|
||||
SchematicNode pa = SchematicNode.getNodeFromPath(user, preTab);
|
||||
if (pa == null) return Collections.emptyList();
|
||||
List<SchematicNode> nodes = SchematicNode.getSchematicNodeInNode(pa);
|
||||
nodes.forEach(node -> list.add((sws ? "/" : "") + node.generateBreadcrumbs(user)));
|
||||
} else {
|
||||
List<SchematicNode> nodes = SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0);
|
||||
nodes.forEach(node -> list.add((sws ? "/" : "") + node.getName() + (node.isDir() ? "/" : "")));
|
||||
}
|
||||
list.remove("//copy");
|
||||
TAB_CACHE.computeIfAbsent(user.getId(), integer -> new HashMap<>()).putIfAbsent(cacheKey, list);
|
||||
return list;
|
||||
return EffectiveSchematicNode.getNodeTabcomplete(user, s);
|
||||
}
|
||||
|
||||
private static void rootWarning() {
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Urgh! Deshalb eigentlich lieber ohne Optionals...