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(); }