Browse Source
* Several e/p/h can be entered in entity column (all tables), permission column, parent column. Like destinations. Split them by comma, semicolon, and space chars. * DatabaseContents normalize(); replaces destination parsing in db connection. * BridgeForBukkitAPI in API folder * Removed AbstractRow * Rows are implement Cloneable. * More platform independence. * etc.master
28 changed files with 276 additions and 243 deletions
@ -1,4 +1,4 @@ |
|||||||
package ru.simsonic.rscPermissions.DataTypes; |
package ru.simsonic.rscPermissions.API; |
||||||
|
|
||||||
public enum EntityType |
public enum EntityType |
||||||
{ |
{ |
@ -0,0 +1,17 @@ |
|||||||
|
package ru.simsonic.rscPermissions.API; |
||||||
|
import java.sql.Timestamp; |
||||||
|
|
||||||
|
public class RowEntity implements Cloneable |
||||||
|
{ |
||||||
|
public int id; |
||||||
|
public String entity; |
||||||
|
public EntityType entityType; |
||||||
|
public String prefix; |
||||||
|
public String suffix; |
||||||
|
public Timestamp lifetime; |
||||||
|
@Override |
||||||
|
public RowEntity clone() throws CloneNotSupportedException |
||||||
|
{ |
||||||
|
return (RowEntity)super.clone(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package ru.simsonic.rscPermissions.API; |
||||||
|
import java.sql.Timestamp; |
||||||
|
|
||||||
|
public class RowPermission implements Cloneable |
||||||
|
{ |
||||||
|
public int id; |
||||||
|
public String entity; |
||||||
|
public EntityType entityType; |
||||||
|
public String permission; |
||||||
|
public boolean value; |
||||||
|
public Destination destination; |
||||||
|
public int expirience; |
||||||
|
public Timestamp lifetime; |
||||||
|
public transient String destinationSource; |
||||||
|
@Override |
||||||
|
public RowPermission clone() throws CloneNotSupportedException |
||||||
|
{ |
||||||
|
return (RowPermission)super.clone(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
package ru.simsonic.rscPermissions.Backends; |
||||||
|
import java.util.ArrayList; |
||||||
|
import ru.simsonic.rscPermissions.API.Destination; |
||||||
|
import ru.simsonic.rscPermissions.API.RowEntity; |
||||||
|
import ru.simsonic.rscPermissions.API.RowInheritance; |
||||||
|
import ru.simsonic.rscPermissions.API.RowPermission; |
||||||
|
import ru.simsonic.rscPermissions.InternalCache.Matchers; |
||||||
|
|
||||||
|
public class DatabaseContents |
||||||
|
{ |
||||||
|
public RowEntity entities[]; |
||||||
|
public RowPermission permissions[]; |
||||||
|
public RowInheritance inheritance[]; |
||||||
|
public void normalize() |
||||||
|
{ |
||||||
|
if(entities == null) |
||||||
|
entities = new RowEntity[] {}; |
||||||
|
if(permissions == null) |
||||||
|
permissions = new RowPermission[] {}; |
||||||
|
if(inheritance == null) |
||||||
|
inheritance = new RowInheritance[] {}; |
||||||
|
final ArrayList<RowEntity> le = new ArrayList<>(); |
||||||
|
final ArrayList<RowPermission> lp = new ArrayList<>(); |
||||||
|
final ArrayList<RowInheritance> li = new ArrayList<>(); |
||||||
|
try |
||||||
|
{ |
||||||
|
// Entities
|
||||||
|
for(RowEntity row : entities) |
||||||
|
{ |
||||||
|
final String[] splittedByEntity = Matchers.genericParse(row.entity); |
||||||
|
for(String oneEntity : splittedByEntity) |
||||||
|
{ |
||||||
|
final RowEntity clone = row.clone(); |
||||||
|
clone.entity = oneEntity; |
||||||
|
le.add(clone); |
||||||
|
} |
||||||
|
} |
||||||
|
// Permissions
|
||||||
|
for(RowPermission row : permissions) |
||||||
|
{ |
||||||
|
final String[] splittedByEntity = Matchers.genericParse(row.entity); |
||||||
|
final String[] splittedByPermission = Matchers.genericParse(row.permission); |
||||||
|
final String[] splittedByDestination = Matchers.genericParse(row.destinationSource); |
||||||
|
row.destinationSource = null; |
||||||
|
for(String oneDestination : splittedByDestination) |
||||||
|
{ |
||||||
|
final Destination destination = Destination.parseDestination(oneDestination); |
||||||
|
for(String permission : splittedByPermission) |
||||||
|
for(String entity : splittedByEntity) |
||||||
|
{ |
||||||
|
final RowPermission clone = row.clone(); |
||||||
|
clone.entity = entity; |
||||||
|
clone.permission = permission; |
||||||
|
clone.destination = destination; |
||||||
|
lp.add(clone); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// Inheritance
|
||||||
|
for(RowInheritance row : inheritance) |
||||||
|
{ |
||||||
|
final String[] splittedByEntity = Matchers.genericParse(row.entity); |
||||||
|
final String[] splittedByParent = Matchers.genericParse(row.parent); |
||||||
|
final String[] splittedByDestination = Matchers.genericParse(row.destinationSource); |
||||||
|
row.destinationSource = null; |
||||||
|
for(String oneDestination : splittedByDestination) |
||||||
|
{ |
||||||
|
final Destination destination = Destination.parseDestination(oneDestination); |
||||||
|
for(String parent : splittedByParent) |
||||||
|
for(String entity : splittedByEntity) |
||||||
|
{ |
||||||
|
final RowInheritance clone = row.clone(); |
||||||
|
clone.entity = entity; |
||||||
|
clone.parent = parent; |
||||||
|
clone.deriveInstance(); |
||||||
|
clone.destination = destination; |
||||||
|
li.add(clone); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} catch(CloneNotSupportedException ex) { |
||||||
|
} |
||||||
|
entities = le.toArray(new RowEntity[le.size()]); |
||||||
|
permissions = lp.toArray(new RowPermission[lp.size()]); |
||||||
|
inheritance = li.toArray(new RowInheritance[li.size()]); |
||||||
|
} |
||||||
|
} |
@ -1,36 +0,0 @@ |
|||||||
package ru.simsonic.rscPermissions.DataTypes; |
|
||||||
import java.util.ArrayList; |
|
||||||
|
|
||||||
public class DatabaseContents |
|
||||||
{ |
|
||||||
public RowEntity entities[]; |
|
||||||
public RowPermission permissions[]; |
|
||||||
public RowInheritance inheritance[]; |
|
||||||
public void normalize() |
|
||||||
{ |
|
||||||
// Entities
|
|
||||||
final ArrayList<RowEntity> listE = new ArrayList<>(); |
|
||||||
if(entities != null) |
|
||||||
for(RowEntity rowE : entities) |
|
||||||
{ |
|
||||||
listE.add(rowE); |
|
||||||
} |
|
||||||
entities = listE.toArray(new RowEntity[listE.size()]); |
|
||||||
// Permissions
|
|
||||||
final ArrayList<RowPermission> listP = new ArrayList<>(); |
|
||||||
if(permissions != null) |
|
||||||
for(RowPermission rowP : permissions) |
|
||||||
{ |
|
||||||
listP.add(rowP); |
|
||||||
} |
|
||||||
permissions = listP.toArray(new RowPermission[listP.size()]); |
|
||||||
// Inheritance
|
|
||||||
final ArrayList<RowInheritance> listI = new ArrayList<>(); |
|
||||||
if(inheritance != null) |
|
||||||
for(RowInheritance rowI : inheritance) |
|
||||||
{ |
|
||||||
listI.add(rowI); |
|
||||||
} |
|
||||||
inheritance = listI.toArray(new RowInheritance[listI.size()]); |
|
||||||
} |
|
||||||
} |
|
@ -1,11 +0,0 @@ |
|||||||
package ru.simsonic.rscPermissions.DataTypes; |
|
||||||
import java.sql.Timestamp; |
|
||||||
|
|
||||||
public class RowEntity extends AbstractRow |
|
||||||
{ |
|
||||||
public String entity; |
|
||||||
public EntityType entityType; |
|
||||||
public String prefix; |
|
||||||
public String suffix; |
|
||||||
public Timestamp lifetime; |
|
||||||
} |
|
@ -1,13 +0,0 @@ |
|||||||
package ru.simsonic.rscPermissions.DataTypes; |
|
||||||
import java.sql.Timestamp; |
|
||||||
|
|
||||||
public class RowPermission extends AbstractRow |
|
||||||
{ |
|
||||||
public String entity; |
|
||||||
public EntityType entityType; |
|
||||||
public String permission; |
|
||||||
public boolean value; |
|
||||||
public Destination destination; |
|
||||||
public int expirience; |
|
||||||
public Timestamp lifetime; |
|
||||||
} |
|
@ -0,0 +1,31 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.io.File; |
||||||
|
import java.util.logging.Logger; |
||||||
|
import ru.simsonic.rscPermissions.Backends.BackendDatabase; |
||||||
|
import ru.simsonic.rscPermissions.Backends.BackendJson; |
||||||
|
import ru.simsonic.rscPermissions.Backends.DatabaseContents; |
||||||
|
import ru.simsonic.rscPermissions.InternalCache.InternalCache; |
||||||
|
|
||||||
|
public class IndependentMain |
||||||
|
{ |
||||||
|
private static final BackendJson localJsn = new BackendJson(new File("../")); |
||||||
|
private static final BackendDatabase remoteDb = new BackendDatabase(Logger.getGlobal(), "test"); |
||||||
|
private static final InternalCache intCache = new InternalCache(); |
||||||
|
@SuppressWarnings({"DeadBranch", "UnusedAssignment"}) |
||||||
|
public static void main(String args[]) |
||||||
|
{ |
||||||
|
String[] qqq = "".split("x+"); |
||||||
|
System.out.println("rscPermissions - Bukkit superperms plugin © SimSonic"); |
||||||
|
System.out.println("https://github.com/SimSonic/rscPermissions/"); |
||||||
|
// TESTING HERE
|
||||||
|
remoteDb.initialize(null, "voxile.ru:3306/servers-shared", "", "", "rscp_"); |
||||||
|
if(remoteDb.connect()) |
||||||
|
{ |
||||||
|
final DatabaseContents contents = remoteDb.retrieveContents(); |
||||||
|
contents.normalize(); |
||||||
|
localJsn.cleanup(); |
||||||
|
localJsn.saveContents(contents); |
||||||
|
intCache.fill(contents); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -1,9 +1,15 @@ |
|||||||
package ru.simsonic.rscPermissions.DataTypes; |
package ru.simsonic.rscPermissions.InternalCache; |
||||||
import java.util.regex.Pattern; |
import java.util.regex.Pattern; |
||||||
|
|
||||||
public abstract class AbstractRow |
public class Matchers |
||||||
{ |
{ |
||||||
public int id = 0; |
private static final String genericSplitter = "\\s*[;,\\r\\n\\s]+\\s*"; |
||||||
|
public static String[] genericParse(String multiobject) |
||||||
|
{ |
||||||
|
if(multiobject == null) |
||||||
|
multiobject = ""; |
||||||
|
return multiobject.split(genericSplitter); |
||||||
|
} |
||||||
private static final Pattern patternUUID = Pattern.compile( |
private static final Pattern patternUUID = Pattern.compile( |
||||||
"<uuid>" + "(?:[a-f\\d]{8}(?:-[a-f\\d]{4}){3}-[a-f\\d]{12})" + "</uuid>"); |
"<uuid>" + "(?:[a-f\\d]{8}(?:-[a-f\\d]{4}){3}-[a-f\\d]{12})" + "</uuid>"); |
||||||
private static boolean isCorrectUUID(String entityName) |
private static boolean isCorrectUUID(String entityName) |
Loading…
Reference in new issue