Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add database support #161

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 27 additions & 12 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id "java"
id "application"
id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'application'
id 'java'
}

mainClassName = "io.github.syst3ms.skriptparser.Parser"
compileTestJava.options.encoding = 'UTF-8'
compileJava.options.encoding = 'UTF-8'

mainClassName = 'io.github.syst3ms.skriptparser.Parser'

sourceCompatibility = 1.11

Expand All @@ -16,18 +23,26 @@ test {
}

dependencies {
implementation "org.jetbrains:annotations:15.0"
implementation group: "com.google.code.findbugs", name: "jsr305", version: "3.0.2"
testRuntimeOnly "org.junit.vintage:junit-vintage-engine:5.4.1"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.4.1"
testImplementation "junit:junit:4.12"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.4.1"
implementation (group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2')
implementation (group: 'org.jetbrains', name: 'annotations', version: '15.0')
shadow (group: 'com.google.code.gson', name: 'gson', version: '2.10.1')

testRuntimeOnly (group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '5.4.1')
testRuntimeOnly (group: 'org.junit.jupiter', name:'junit-jupiter-engine', version: '5.4.1')

testImplementation (group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.1')
testImplementation (group: 'com.google.code.gson', name: 'gson', version: '2.10.1')
testImplementation (group: 'junit', name: 'junit', version: '4.12')
}

jar {
manifest {
attributes("Main-Class": mainClassName,
"Implementation-Title": "skript-parser",
"Implementation-Version": "alpha")
"Implementation-Title": "skript-parser",
"Implementation-Version": project.property("version"))
}
}
}

processResources {
filter ReplaceTokens, tokens: ["version": project.property("version")]
}
5 changes: 5 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
org.gradle.parallel=true

version=alpha
15 changes: 15 additions & 0 deletions src/main/java/io/github/syst3ms/skriptparser/file/FileSection.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package io.github.syst3ms.skriptparser.file;

import io.github.syst3ms.skriptparser.lang.entries.OptionLoader;

import java.util.List;
import java.util.Optional;

/**
* A class describing a section of a script inside a file (e.g a line ending with a colon and containing all the lines that
* were indented after it. "all the lines" doesn't exclude sections.
*/
public class FileSection extends FileElement {

private final List<FileElement> elements;
private int length = -1;

Expand Down Expand Up @@ -37,6 +41,16 @@ public int length() {
return length;
}

public Optional<FileElement> get(String line) {
return elements.stream()
.filter(element -> {
String content = element.getLineContent();
content = content.substring(0, content.lastIndexOf(OptionLoader.OPTION_SPLIT_PATTERN.trim()));
return content.equalsIgnoreCase(line);
})
.findFirst();
}

@Override
public boolean equals(Object obj) {
return super.equals(obj) && elements.equals(((FileSection) obj).elements);
Expand All @@ -46,4 +60,5 @@ public boolean equals(Object obj) {
public String toString() {
return super.toString() + ":";
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package io.github.syst3ms.skriptparser.registration;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import io.github.syst3ms.skriptparser.Parser;
import io.github.syst3ms.skriptparser.types.Type;
import io.github.syst3ms.skriptparser.types.TypeManager;
import io.github.syst3ms.skriptparser.types.changers.Arithmetic;
import io.github.syst3ms.skriptparser.types.changers.TypeSerializer;
import io.github.syst3ms.skriptparser.types.comparisons.Comparator;
import io.github.syst3ms.skriptparser.types.comparisons.Comparators;
import io.github.syst3ms.skriptparser.types.comparisons.Relation;
Expand Down Expand Up @@ -55,6 +60,19 @@ public static void register() {
return null;
}
})
.serializer(new TypeSerializer<Number>() {
@Override
public JsonElement serialize(Gson gson, Number value) {
JsonObject json = new JsonObject();
json.addProperty("number", value);
return json;
}

@Override
public Number deserialize(Gson gson, JsonElement element) {
return element.getAsJsonObject().get("number").getAsNumber();
}
})
.toStringFunction(o -> {
if (o instanceof BigDecimal) {
BigDecimal bd = (BigDecimal) o;
Expand Down Expand Up @@ -118,6 +136,19 @@ public Class<? extends Number> getRelativeType() {
s = s.replaceAll("_", "");
return s.matches(INTEGER_PATTERN) ? new BigInteger(s) : null;
})
.serializer(new TypeSerializer<BigInteger>() {
@Override
public JsonElement serialize(Gson gson, BigInteger value) {
JsonObject json = new JsonObject();
json.addProperty("number", value);
return json;
}

@Override
public BigInteger deserialize(Gson gson, JsonElement element) {
return BigInteger.valueOf(element.getAsJsonObject().get("number").getAsNumber().longValue());
}
})
.arithmetic(new Arithmetic<BigInteger, BigInteger>() {
@Override
public BigInteger difference(BigInteger first, BigInteger second) {
Expand All @@ -144,7 +175,20 @@ public Class<? extends BigInteger> getRelativeType() {
registration.addType(
String.class,
"string",
"string@s"
"string@s",
new TypeSerializer<String>() {
@Override
public JsonElement serialize(Gson gson, String value) {
JsonObject json = new JsonObject();
json.addProperty("string", value);
return json;
}

@Override
public String deserialize(Gson gson, JsonElement element) {
return element.getAsJsonObject().get("string").getAsString();
}
}
);

registration.newType(Boolean.class, "boolean", "boolean@s")
Expand All @@ -157,6 +201,19 @@ public Class<? extends BigInteger> getRelativeType() {
return null;
}
})
.serializer(new TypeSerializer<Boolean>() {
@Override
public JsonElement serialize(Gson gson, Boolean value) {
JsonObject json = new JsonObject();
json.addProperty("boolean", value);
return json;
}

@Override
public Boolean deserialize(Gson gson, JsonElement element) {
return element.getAsJsonObject().get("boolean").getAsBoolean();
}
})
.toStringFunction(String::valueOf)
.register();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import io.github.syst3ms.skriptparser.types.TypeManager;
import io.github.syst3ms.skriptparser.types.changers.Arithmetic;
import io.github.syst3ms.skriptparser.types.changers.Changer;
import io.github.syst3ms.skriptparser.types.changers.TypeSerializer;
import io.github.syst3ms.skriptparser.types.conversions.ConverterInfo;
import io.github.syst3ms.skriptparser.types.conversions.Converters;
import io.github.syst3ms.skriptparser.util.CollectionUtils;
Expand Down Expand Up @@ -525,6 +526,17 @@ public <T> void addType(Class<T> c, String name, String pattern) {
newType(c, name, pattern).register();
}

/**
* Registers a {@link Type}
* @param c the class the Type represents
* @param pattern the Type's pattern
* @param serializer the Type's serializer
* @param <T> the represented class
*/
public <T> void addType(Class<T> c, String name, String pattern, TypeSerializer<T> serializer) {
newType(c, name, pattern).serializer(serializer).register();
}

/**
* Registers a converter
* @param from the class it converts from
Expand Down Expand Up @@ -606,14 +618,21 @@ public interface Registrar {
* @param <C> the represented class
*/
public class TypeRegistrar<C> implements Registrar {
private final Class<C> c;

private Function<? super C, String> toStringFunction = o -> Objects.toString(o, TypeManager.NULL_REPRESENTATION);
private final String baseName;
private final String pattern;
private Function<? super C, String> toStringFunction = o -> Objects.toString(o, TypeManager.NULL_REPRESENTATION);
private final Class<C> c;

@Nullable
private Function<String, ? extends C> literalParser;

@Nullable
private Changer<? super C> defaultChanger;

@Nullable
private TypeSerializer<C> serializer;

@Nullable
private Arithmetic<C, ?> arithmetic;

Expand All @@ -623,6 +642,15 @@ public TypeRegistrar(Class<C> c, String baseName, String pattern) {
this.pattern = pattern;
}

/**
* @param serializer add a type serializer that allows the type to be saved to databases.
* @return the registrar
*/
public TypeRegistrar<C> serializer(TypeSerializer<C> serializer) {
this.serializer = serializer;
return this;
}

/**
* @param literalParser a function interpreting a string as an instance of the type
* @return the registrar
Expand Down Expand Up @@ -665,7 +693,7 @@ public <R> TypeRegistrar<C> arithmetic(Arithmetic<C, R> arithmetic) {
@Override
public void register() {
newTypes = true;
types.add(new Type<>(c, baseName, pattern, literalParser, toStringFunction, defaultChanger, arithmetic));
types.add(new Type<>(c, baseName, pattern, literalParser, toStringFunction, defaultChanger, arithmetic, serializer));
}
}

Expand Down
33 changes: 28 additions & 5 deletions src/main/java/io/github/syst3ms/skriptparser/types/Type.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.github.syst3ms.skriptparser.types.changers.Arithmetic;
import io.github.syst3ms.skriptparser.types.changers.Changer;
import io.github.syst3ms.skriptparser.types.changers.TypeSerializer;
import io.github.syst3ms.skriptparser.util.StringUtils;
import org.jetbrains.annotations.Nullable;

Expand All @@ -15,17 +16,24 @@
* @see PatternType
*/
public class Type<T> {
private final Class<T> typeClass;
private final String baseName;
private final String[] pluralForms;
private final Function<Object, String> toStringFunction;

@Nullable
private final Function<String, ? extends T> literalParser;

@Nullable
private final Changer<? super T> defaultChanger;

@Nullable
private final TypeSerializer<T> serializer;

@Nullable
private final Arithmetic<T, ?> arithmetic;

private final Function<Object, String> toStringFunction;
private final String[] pluralForms;
private final Class<T> typeClass;
private final String baseName;

/**
* Constructs a new Type.
*
Expand Down Expand Up @@ -96,21 +104,32 @@ public Type(Class<T> typeClass,
this(typeClass, baseName, pattern, literalParser, toStringFunction, defaultChanger, null);
}

public Type(Class<T> typeClass,
String baseName,
String pattern,
@Nullable Function<String, ? extends T> literalParser,
Function<? super T, String> toStringFunction,
@Nullable Changer<? super T> defaultChanger,
@Nullable Arithmetic<T, ?> arithmetic) {
this(typeClass, baseName, pattern, literalParser, toStringFunction, defaultChanger, arithmetic, null);
}

@SuppressWarnings("unchecked")
public Type(Class<T> typeClass,
String baseName,
String pattern,
@Nullable Function<String, ? extends T> literalParser,
Function<? super T, String> toStringFunction,
@Nullable Changer<? super T> defaultChanger,
@Nullable Arithmetic<T, ?> arithmetic) {
@Nullable Arithmetic<T, ?> arithmetic, @Nullable TypeSerializer<T> serializer) {
this.typeClass = typeClass;
this.baseName = baseName;
this.literalParser = literalParser;
this.toStringFunction = (Function<Object, String>) toStringFunction;
this.pluralForms = StringUtils.getForms(pattern.strip());
this.defaultChanger = defaultChanger;
this.arithmetic = arithmetic;
this.serializer = serializer;
}

public Class<T> getTypeClass() {
Expand All @@ -129,6 +148,10 @@ public Function<Object, String> getToStringFunction() {
return toStringFunction;
}

public Optional<TypeSerializer<T>> getSerializer() {
return Optional.ofNullable(serializer);
}

public Optional<Function<String, ? extends T>> getLiteralParser() {
return Optional.ofNullable(literalParser);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@
*/
@SuppressWarnings("unchecked")
public class TypeManager {

/**
* The string equivalent of null
*/
public static final String NULL_REPRESENTATION = "<none>";

/**
* The string equivalent of an empty array
*/
Expand Down Expand Up @@ -51,7 +53,6 @@ public static Optional<? extends Type<?>> getByName(String name) {
return Optional.empty();
}


/**
* Gets a {@link Type} from its associated {@link Class}.
* @param c the Class to get the Type from
Expand Down Expand Up @@ -121,4 +122,5 @@ public static void register(SkriptRegistration reg) {
classToType.put(type.getTypeClass(), type);
}
}
}

}
Loading
Loading