diff --git a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/DataModel.java b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/DataModel.java
index ebc6cbb..52b25b8 100644
--- a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/DataModel.java
+++ b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/DataModel.java
@@ -213,11 +213,20 @@ public class DataModel {
if (definition.isEmpty()) {
throw new IllegalArgumentException(transformCoordinate + " refers to an unknown field: " + t.from);
}
- var prevDef = tryInsertAtIndex(transformClass.data,
- t.to,
- definition.get().getValue(),
- definition.get().getKey()
- );
+ String prevDef;
+ if (t.index != null) {
+ prevDef = tryInsertAtIndex(transformClass.data,
+ t.to,
+ definition.get().getValue(),
+ t.index
+ );
+ } else {
+ prevDef = tryInsertAtIndex(transformClass.data,
+ t.to,
+ definition.get().getValue(),
+ definition.get().getKey()
+ );
+ }
if (prevDef != null) {
throw new IllegalArgumentException(
transformCoordinate + " tries to overwrite the existing field \"" + t.to + "\" of value \""
diff --git a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MavenPlugin.java b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MavenPlugin.java
index 0ea141e..ea5ab06 100644
--- a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MavenPlugin.java
+++ b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MavenPlugin.java
@@ -29,6 +29,9 @@ public class MavenPlugin extends AbstractMojo {
@Parameter( required = true, defaultValue = "false")
private String useRecordBuilder;
+ @Parameter(defaultValue = "false")
+ private String generateTestResources;
+
/**
* @parameter default-value="${project}"
* @required
@@ -41,7 +44,8 @@ public class MavenPlugin extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
try {
SourcesGenerator sourcesGenerator = SourcesGenerator.load(configPath.toPath());
- Path genRecordsPath = project.getBasedir().getAbsoluteFile().toPath().resolve("target").resolve("generated-sources").resolve("database-classes");
+ project.hasLifecyclePhase("generate-test-sources");
+ Path genRecordsPath = project.getBasedir().getAbsoluteFile().toPath().resolve("target").resolve(Boolean.parseBoolean(generateTestResources) ? "generated-test-sources" : "generated-sources").resolve("database-classes");
Path outPath = genRecordsPath.resolve("java");
this.project.addCompileSourceRoot(outPath.toString());
diff --git a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MoveDataConfiguration.java b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MoveDataConfiguration.java
index 786e114..fdd9d8e 100644
--- a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MoveDataConfiguration.java
+++ b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/MoveDataConfiguration.java
@@ -1,12 +1,15 @@
package it.cavallium.datagen.plugin;
import java.util.Objects;
+import org.jetbrains.annotations.Nullable;
public final class MoveDataConfiguration implements TransformationConfiguration {
public String transformClass;
public String from;
public String to;
+ @Nullable
+ public Integer index;
@Override
public String getTransformClass() {
@@ -27,9 +30,8 @@ public final class MoveDataConfiguration implements TransformationConfiguration
return false;
}
MoveDataConfiguration that = (MoveDataConfiguration) o;
- return Objects.equals(transformClass, that.transformClass) && Objects.equals(from, that.from) && Objects.equals(to,
- that.to
- );
+ return Objects.equals(transformClass, that.transformClass) && Objects.equals(from, that.from)
+ && Objects.equals(to, that.to) && Objects.equals(index, that.index);
}
@Override
@@ -38,6 +40,7 @@ public final class MoveDataConfiguration implements TransformationConfiguration
hash += ConfigUtils.hashCode(transformClass);
hash += ConfigUtils.hashCode(from);
hash += ConfigUtils.hashCode(to);
+ hash += ConfigUtils.hashCode(index);
return hash;
}
@@ -46,6 +49,7 @@ public final class MoveDataConfiguration implements TransformationConfiguration
if (this.transformClass != null) c.transformClass = this.transformClass;
if (this.from != null) c.from = this.from;
if (this.to != null) c.to = this.to;
+ if (this.index != null) c.index = this.index;
return c;
}
}
diff --git a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java
index fe47c44..bc168cc 100644
--- a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java
+++ b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java
@@ -24,6 +24,11 @@ import org.jetbrains.annotations.NotNull;
public class GenSerializerArrayX extends ClassGenerator {
+ /**
+ * Enabling this option can slow down deserialization updates
+ */
+ private static final boolean USE_NATIVE_TYPED_ARRAYS = false;
+
public GenSerializerArrayX(ClassGeneratorParams params) {
super(params);
}
@@ -96,23 +101,37 @@ public class GenSerializerArrayX extends ClassGenerator {
method.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
var typeArrayClassName = typeArray.getJTypeName(basePackageName);
+
+ var arrayComponentTypeName = typeArray.getBase().getJTypeName(basePackageName);
+ var typedArrayTypeName = ArrayTypeName.of(arrayComponentTypeName);
+
method.returns(typeArrayClassName);
method.addAnnotation(NotNull.class);
method.addParameter(ParameterSpec.builder(SafeDataInput.class, "in").build());
method.addStatement("int sz = in.readInt()");
- var arrayTypeName = ArrayTypeName.of(typeArray.getBase().getJTypeName(basePackageName));
- method.addStatement("$T a = new $T[sz]", arrayTypeName, arrayTypeName.componentType);
+ if (USE_NATIVE_TYPED_ARRAYS) {
+ method.addStatement("$T a = new $T[sz]", typedArrayTypeName, arrayComponentTypeName);
+ } else {
+ method.addStatement("$T a = new $T[sz]", Object[].class, Object.class);
+ }
method.addCode("\n");
method.beginControlFlow("for (int i = 0; i < sz; ++i)");
var baseSerializerInstance = typeArray.getBase().getJSerializerInstance(basePackageName);
+
method.addStatement("a[i] = $T.$N.deserialize(in)", baseSerializerInstance.className(), baseSerializerInstance.fieldName());
method.endControlFlow();
method.addCode("\n");
- method.addStatement("return new $T(a)", ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class),
- typeArray.getBase().getJTypeName(basePackageName)));
+ if (USE_NATIVE_TYPED_ARRAYS) {
+ method.addStatement("return new $T(a)", ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class), arrayComponentTypeName));
+ } else {
+ method.addStatement("return ($T) new $T(a)",
+ ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class), arrayComponentTypeName),
+ ClassName.get(ImmutableWrappedArrayList.class)
+ );
+ }
classBuilder.addMethod(method.build());
}
diff --git a/datagen/pom.xml b/datagen/pom.xml
index bc053be..086485d 100644
--- a/datagen/pom.xml
+++ b/datagen/pom.xml
@@ -101,6 +101,37 @@
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.2.1
+
+
+ attach-sources
+ verify
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.5.0
+
+
+ attach-javadoc
+ verify
+
+ jar
+
+
+
+
+ all,-missing
+
+
diff --git a/datagen/src/main/java/it/cavallium/buffer/BufDataInput.java b/datagen/src/main/java/it/cavallium/buffer/BufDataInput.java
index 83fade9..e1a2c67 100644
--- a/datagen/src/main/java/it/cavallium/buffer/BufDataInput.java
+++ b/datagen/src/main/java/it/cavallium/buffer/BufDataInput.java
@@ -25,19 +25,4 @@ public class BufDataInput extends SafeDataInputStream {
public void close() {
super.close();
}
-
- @Override
- public void mark(int readlimit) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void reset() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean markSupported() {
- return false;
- }
}
diff --git a/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java b/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java
index fcfa364..71bd3ab 100644
--- a/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java
+++ b/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java
@@ -624,7 +624,7 @@ public class ImmutableWrappedArrayList extends AbstractObjectList implemen
/**
* Compares this type-specific array list to another one.
*
- * @apiNote This method exists only for sake of efficiency. The implementation inherited from the
+ * This method exists only for sake of efficiency. The implementation inherited from the
* abstract implementation would already work.
*
* @param l a type-specific array list.
@@ -655,7 +655,7 @@ public class ImmutableWrappedArrayList extends AbstractObjectList implemen
/**
* Compares this array list to another array list.
*
- * @apiNote This method exists only for sake of efficiency. The implementation inherited from the
+ * This method exists only for sake of efficiency. The implementation inherited from the
* abstract implementation would already work.
*
* @param l an array list.
diff --git a/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java b/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java
index 0fe73f0..ef00f5d 100644
--- a/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java
+++ b/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java
@@ -7,8 +7,9 @@ public class UpgradeUtil {
@SuppressWarnings("unchecked")
public static List upgradeArray(List from, DataUpgrader upgrader) {
Object[] array;
- if (from instanceof ImmutableWrappedArrayList immutableWrappedArrayList) {
- array = immutableWrappedArrayList.a;
+ if (from.getClass() == ImmutableWrappedArrayList.class
+ && ((ImmutableWrappedArrayList>) from).a.getClass() == Object[].class) {
+ array = ((ImmutableWrappedArrayList>) from).a;
} else {
array = from.toArray();
}