[FIX] dynamc modification type for DataJson
This commit is contained in:
parent
6b12d26a8b
commit
ee831283d3
@ -7,6 +7,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.kar.archidata.annotation.AnnotationTools;
|
import org.kar.archidata.annotation.AnnotationTools;
|
||||||
|
import org.kar.archidata.annotation.AnnotationTools.FieldName;
|
||||||
import org.kar.archidata.dataAccess.options.Condition;
|
import org.kar.archidata.dataAccess.options.Condition;
|
||||||
import org.kar.archidata.dataAccess.options.FilterValue;
|
import org.kar.archidata.dataAccess.options.FilterValue;
|
||||||
import org.kar.archidata.dataAccess.options.Limit;
|
import org.kar.archidata.dataAccess.options.Limit;
|
||||||
@ -97,11 +98,11 @@ public abstract class DBAccess implements Closeable {
|
|||||||
if (idKey == null) {
|
if (idKey == null) {
|
||||||
throw new DataAccessException("Try to identify the ID type and object was null.");
|
throw new DataAccessException("Try to identify the ID type and object was null.");
|
||||||
}
|
}
|
||||||
final String fieldName = AnnotationTools.getFieldName(idField, options).inTable();
|
final FieldName fieldName = AnnotationTools.getFieldName(idField, options);
|
||||||
final List<OptionSpecifyType> specificTypes = options.get(OptionSpecifyType.class);
|
final List<OptionSpecifyType> specificTypes = options.get(OptionSpecifyType.class);
|
||||||
if (typeClass == Object.class) {
|
if (typeClass == Object.class) {
|
||||||
for (final OptionSpecifyType specify : specificTypes) {
|
for (final OptionSpecifyType specify : specificTypes) {
|
||||||
if (specify.name.equals(fieldName)) {
|
if (specify.name.equals(fieldName.inStruct())) {
|
||||||
typeClass = specify.clazz;
|
typeClass = specify.clazz;
|
||||||
LOGGER.trace("Detect overwrite of typing ... '{}' => '{}'", typeClass.getCanonicalName(),
|
LOGGER.trace("Detect overwrite of typing ... '{}' => '{}'", typeClass.getCanonicalName(),
|
||||||
specify.clazz.getCanonicalName());
|
specify.clazz.getCanonicalName());
|
||||||
@ -116,7 +117,7 @@ public abstract class DBAccess implements Closeable {
|
|||||||
}
|
}
|
||||||
throw new DataAccessException("Request update with the wrong type ...");
|
throw new DataAccessException("Request update with the wrong type ...");
|
||||||
}
|
}
|
||||||
return new QueryCondition(fieldName, "=", idKey);
|
return new QueryCondition(fieldName.inTable(), "=", idKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: manage insert batch...
|
// TODO: manage insert batch...
|
||||||
|
@ -10,6 +10,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bson.types.ObjectId;
|
||||||
import org.kar.archidata.annotation.AnnotationTools;
|
import org.kar.archidata.annotation.AnnotationTools;
|
||||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
|
import org.kar.archidata.annotation.AnnotationTools.FieldName;
|
||||||
import org.kar.archidata.annotation.DataJson;
|
import org.kar.archidata.annotation.DataJson;
|
||||||
@ -25,6 +26,7 @@ import org.kar.archidata.dataAccess.options.OptionRenameColumn;
|
|||||||
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
|
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
|
||||||
import org.kar.archidata.dataAccess.options.OverrideTableName;
|
import org.kar.archidata.dataAccess.options.OverrideTableName;
|
||||||
import org.kar.archidata.exception.DataAccessException;
|
import org.kar.archidata.exception.DataAccessException;
|
||||||
|
import org.kar.archidata.tools.ContextGenericTools;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -117,13 +119,24 @@ public class AddOnDataJson implements DataAccessAddOn {
|
|||||||
final CountInOut count,
|
final CountInOut count,
|
||||||
final QueryOptions options,
|
final QueryOptions options,
|
||||||
final List<LazyGetter> lazyCall) throws Exception {
|
final List<LazyGetter> lazyCall) throws Exception {
|
||||||
|
final List<OptionSpecifyType> specificTypes = options.get(OptionSpecifyType.class);
|
||||||
final String jsonData = rs.getString(count.value);
|
final String jsonData = rs.getString(count.value);
|
||||||
count.inc();
|
count.inc();
|
||||||
if (!rs.wasNull()) {
|
if (!rs.wasNull()) {
|
||||||
final ObjectMapper objectMapper = ContextGenericTools.createObjectMapper();
|
final ObjectMapper objectMapper = ContextGenericTools.createObjectMapper();
|
||||||
if (field.getType() == List.class) {
|
if (field.getType() == List.class) {
|
||||||
final ParameterizedType listType = (ParameterizedType) field.getGenericType();
|
final ParameterizedType listType = (ParameterizedType) field.getGenericType();
|
||||||
final Class<?> listClass = (Class<?>) listType.getActualTypeArguments()[0];
|
Class<?> listClass = (Class<?>) listType.getActualTypeArguments()[0];
|
||||||
|
if (listClass == Object.class) {
|
||||||
|
for (final OptionSpecifyType specify : specificTypes) {
|
||||||
|
if (specify.name.equals(field.getName())) {
|
||||||
|
listClass = specify.clazz;
|
||||||
|
LOGGER.trace("Detect overwrite of typing var={} ... '{}' => '{}'", field.getName(),
|
||||||
|
listClass.getCanonicalName(), specify.clazz.getCanonicalName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (listClass == Long.class) {
|
if (listClass == Long.class) {
|
||||||
final Object dataParsed = objectMapper.readValue(jsonData, new TypeReference<List<Long>>() {});
|
final Object dataParsed = objectMapper.readValue(jsonData, new TypeReference<List<Long>>() {});
|
||||||
field.set(data, dataParsed);
|
field.set(data, dataParsed);
|
||||||
@ -159,12 +172,32 @@ public class AddOnDataJson implements DataAccessAddOn {
|
|||||||
field.set(data, dataParsed);
|
field.set(data, dataParsed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (listClass == ObjectId.class) {
|
||||||
|
final Object dataParsed = objectMapper.readValue(jsonData, new TypeReference<List<ObjectId>>() {});
|
||||||
|
field.set(data, dataParsed);
|
||||||
|
return;
|
||||||
|
}
|
||||||
LOGGER.warn("Maybe fail to translate Model in datajson list: List<{}>", listClass.getCanonicalName());
|
LOGGER.warn("Maybe fail to translate Model in datajson list: List<{}>", listClass.getCanonicalName());
|
||||||
}
|
}
|
||||||
final TypeFactory typeFactory = objectMapper.getTypeFactory();
|
final TypeFactory typeFactory = objectMapper.getTypeFactory();
|
||||||
final JavaType fieldType = typeFactory.constructType(field.getGenericType());
|
Class<?> listClass = field.getType();
|
||||||
final Object dataParsed = objectMapper.readValue(jsonData, fieldType);
|
if (listClass == Object.class) {
|
||||||
field.set(data, dataParsed);
|
for (final OptionSpecifyType specify : specificTypes) {
|
||||||
|
if (specify.name.equals(field.getName())) {
|
||||||
|
listClass = specify.clazz;
|
||||||
|
LOGGER.trace("Detect overwrite of typing var={} ... '{}' => '{}'", field.getName(),
|
||||||
|
listClass.getCanonicalName(), specify.clazz.getCanonicalName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final JavaType javaType = typeFactory.constructType(listClass);
|
||||||
|
final Object dataParsed = objectMapper.readValue(jsonData, javaType);
|
||||||
|
field.set(data, dataParsed);
|
||||||
|
} else {
|
||||||
|
final JavaType fieldType = typeFactory.constructType(field.getGenericType());
|
||||||
|
final Object dataParsed = objectMapper.readValue(jsonData, fieldType);
|
||||||
|
field.set(data, dataParsed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bson.types.ObjectId;
|
||||||
import org.junit.jupiter.api.AfterAll;
|
import org.junit.jupiter.api.AfterAll;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
@ -21,6 +22,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import test.kar.archidata.ConfigureDb;
|
import test.kar.archidata.ConfigureDb;
|
||||||
import test.kar.archidata.StepwiseExtension;
|
import test.kar.archidata.StepwiseExtension;
|
||||||
import test.kar.archidata.dataAccess.model.SerializeListAsJson;
|
import test.kar.archidata.dataAccess.model.SerializeListAsJson;
|
||||||
|
import test.kar.archidata.dataAccess.model.SerializeListAsJsonObjectId;
|
||||||
|
|
||||||
@ExtendWith(StepwiseExtension.class)
|
@ExtendWith(StepwiseExtension.class)
|
||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
@ -138,4 +140,101 @@ public class TestListJson {
|
|||||||
Assertions.assertEquals(firstDataInserted3, retrieve.data.get(1));
|
Assertions.assertEquals(firstDataInserted3, retrieve.data.get(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Order(101)
|
||||||
|
@Test
|
||||||
|
public void testOIDTableInsertAndRetrieve() throws Exception {
|
||||||
|
final List<String> sqlCommand = DataFactory.createTable(SerializeListAsJsonObjectId.class);
|
||||||
|
if (ConfigureDb.da instanceof final DBAccessSQL daSQL) {
|
||||||
|
for (final String elem : sqlCommand) {
|
||||||
|
LOGGER.debug("request: '{}'", elem);
|
||||||
|
daSQL.executeSimpleQuery(elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Order(102)
|
||||||
|
@Test
|
||||||
|
public void testOIDIO() throws Exception {
|
||||||
|
final SerializeListAsJsonObjectId test = new SerializeListAsJsonObjectId();
|
||||||
|
test.data = new ArrayList<>();
|
||||||
|
test.data.add(new ObjectId());
|
||||||
|
test.data.add(new ObjectId());
|
||||||
|
test.data.add(new ObjectId());
|
||||||
|
test.data.add(new ObjectId());
|
||||||
|
test.data.add(new ObjectId());
|
||||||
|
|
||||||
|
final SerializeListAsJsonObjectId insertedData = ConfigureDb.da.insert(test);
|
||||||
|
|
||||||
|
Assertions.assertNotNull(insertedData);
|
||||||
|
Assertions.assertNotNull(insertedData._id);
|
||||||
|
Assertions.assertNotNull(insertedData.data);
|
||||||
|
Assertions.assertEquals(5, insertedData.data.size());
|
||||||
|
Assertions.assertEquals(test.data.get(0), insertedData.data.get(0));
|
||||||
|
Assertions.assertEquals(test.data.get(1), insertedData.data.get(1));
|
||||||
|
Assertions.assertEquals(test.data.get(2), insertedData.data.get(2));
|
||||||
|
Assertions.assertEquals(test.data.get(3), insertedData.data.get(3));
|
||||||
|
Assertions.assertEquals(test.data.get(4), insertedData.data.get(4));
|
||||||
|
|
||||||
|
// Try to retrieve all the data:
|
||||||
|
final SerializeListAsJsonObjectId retrieve = ConfigureDb.da.get(SerializeListAsJsonObjectId.class,
|
||||||
|
insertedData._id);
|
||||||
|
|
||||||
|
Assertions.assertNotNull(retrieve);
|
||||||
|
Assertions.assertNotNull(retrieve._id);
|
||||||
|
Assertions.assertNotNull(retrieve.data);
|
||||||
|
Assertions.assertEquals(5, retrieve.data.size());
|
||||||
|
Assertions.assertEquals(test.data.get(0), retrieve.data.get(0));
|
||||||
|
Assertions.assertEquals(test.data.get(1), retrieve.data.get(1));
|
||||||
|
Assertions.assertEquals(test.data.get(2), retrieve.data.get(2));
|
||||||
|
Assertions.assertEquals(test.data.get(3), retrieve.data.get(3));
|
||||||
|
Assertions.assertEquals(test.data.get(4), retrieve.data.get(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Order(103)
|
||||||
|
@Test
|
||||||
|
public void testOIDToolInsert() throws Exception {
|
||||||
|
final SerializeListAsJsonObjectId test = new SerializeListAsJsonObjectId();
|
||||||
|
test.data = new ArrayList<>();
|
||||||
|
|
||||||
|
final SerializeListAsJsonObjectId insertedData = ConfigureDb.da.insert(test);
|
||||||
|
|
||||||
|
Assertions.assertNotNull(insertedData);
|
||||||
|
Assertions.assertNotNull(insertedData._id);
|
||||||
|
Assertions.assertNotNull(insertedData.data);
|
||||||
|
Assertions.assertEquals(0, insertedData.data.size());
|
||||||
|
|
||||||
|
final ObjectId firstDataInserted1 = new ObjectId();
|
||||||
|
final ObjectId firstDataInserted2 = new ObjectId();
|
||||||
|
final ObjectId firstDataInserted3 = new ObjectId();
|
||||||
|
AddOnDataJson.addLink(ConfigureDb.da, SerializeListAsJsonObjectId.class, "_id", insertedData._id, "data",
|
||||||
|
firstDataInserted1);
|
||||||
|
AddOnDataJson.addLink(ConfigureDb.da, SerializeListAsJsonObjectId.class, "_id", insertedData._id, "data",
|
||||||
|
firstDataInserted2);
|
||||||
|
AddOnDataJson.addLink(ConfigureDb.da, SerializeListAsJsonObjectId.class, "_id", insertedData._id, "data",
|
||||||
|
firstDataInserted3);
|
||||||
|
|
||||||
|
// Try to retrieve all the data:
|
||||||
|
SerializeListAsJsonObjectId retrieve = ConfigureDb.da.get(SerializeListAsJsonObjectId.class, insertedData._id);
|
||||||
|
|
||||||
|
Assertions.assertNotNull(retrieve);
|
||||||
|
Assertions.assertNotNull(retrieve._id);
|
||||||
|
Assertions.assertNotNull(retrieve.data);
|
||||||
|
Assertions.assertEquals(3, retrieve.data.size());
|
||||||
|
Assertions.assertEquals(firstDataInserted1, retrieve.data.get(0));
|
||||||
|
Assertions.assertEquals(firstDataInserted2, retrieve.data.get(1));
|
||||||
|
Assertions.assertEquals(firstDataInserted3, retrieve.data.get(2));
|
||||||
|
|
||||||
|
AddOnDataJson.removeLink(ConfigureDb.da, SerializeListAsJsonObjectId.class, "_id", insertedData._id, "data",
|
||||||
|
firstDataInserted2);
|
||||||
|
// Try to retrieve all the data:
|
||||||
|
retrieve = ConfigureDb.da.get(SerializeListAsJsonObjectId.class, insertedData._id);
|
||||||
|
|
||||||
|
Assertions.assertNotNull(retrieve);
|
||||||
|
Assertions.assertNotNull(retrieve._id);
|
||||||
|
Assertions.assertNotNull(retrieve.data);
|
||||||
|
Assertions.assertEquals(2, retrieve.data.size());
|
||||||
|
Assertions.assertEquals(firstDataInserted1, retrieve.data.get(0));
|
||||||
|
Assertions.assertEquals(firstDataInserted3, retrieve.data.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package test.kar.archidata.dataAccess.model;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bson.types.ObjectId;
|
||||||
|
import org.kar.archidata.annotation.DataJson;
|
||||||
|
import org.kar.archidata.model.OIDGenericData;
|
||||||
|
|
||||||
|
import dev.morphia.annotations.Entity;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class SerializeListAsJsonObjectId extends OIDGenericData {
|
||||||
|
|
||||||
|
@DataJson
|
||||||
|
public List<ObjectId> data;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user