Skip to content

Commit 6dfc260

Browse files
committed
propagate TransactionMappingContext
1 parent 6c8a3cc commit 6dfc260

15 files changed

+163
-138
lines changed

src/main/java/com/arangodb/springframework/config/ArangoConfiguration.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import com.arangodb.ArangoDB;
77
import com.arangodb.ArangoDBException;
88
import com.arangodb.ContentType;
9+
import com.arangodb.RequestContext;
910
import com.arangodb.serde.ArangoSerde;
10-
import com.arangodb.serde.SerdeContext;
1111
import com.arangodb.serde.jackson.JacksonMapperProvider;
1212
import com.arangodb.springframework.annotation.*;
1313
import com.arangodb.springframework.core.ArangoOperations;
1414
import com.arangodb.springframework.core.convert.*;
1515
import com.arangodb.springframework.core.convert.resolver.*;
1616
import com.arangodb.springframework.core.mapping.ArangoMappingContext;
17-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
17+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
1818
import com.arangodb.springframework.core.template.ArangoTemplate;
1919
import com.fasterxml.jackson.core.JsonProcessingException;
2020
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -87,14 +87,13 @@ public byte[] serialize(Object value) {
8787

8888
@Override
8989
public <T> T deserialize(byte[] content, Class<T> clazz) {
90-
return deserialize(content, clazz);
90+
return deserialize(content, clazz, RequestContext.EMPTY);
9191
}
9292

9393
@Override
94-
public <T> T deserialize(byte[] content, Class<T> clazz, SerdeContext ctx) {
95-
SerdeContextHolder.INSTANCE.setCtx(ctx);
94+
public <T> T deserialize(byte[] content, Class<T> clazz, RequestContext ctx) {
9695
try {
97-
return converter.read(clazz, om.readTree(content));
96+
return converter.read(clazz, om.readTree(content), new TransactionMappingContext(ctx));
9897
} catch (Exception e) {
9998
throw new MappingException("Exception while deserializing.", e);
10099
}

src/main/java/com/arangodb/springframework/core/convert/ArangoEntityReader.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,25 @@
2020

2121
package com.arangodb.springframework.core.convert;
2222

23-
import org.springframework.data.convert.EntityReader;
23+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2424

2525
import com.fasterxml.jackson.databind.JsonNode;
2626

2727
/**
2828
* @author Mark Vollmary
2929
* @author Christian Lechner
3030
*/
31-
public interface ArangoEntityReader extends EntityReader<Object, JsonNode> {
31+
public interface ArangoEntityReader {
32+
33+
default <R> R read(Class<R> type, JsonNode source) {
34+
return read(type, source, TransactionMappingContext.EMPTY);
35+
}
3236

3337
/**
3438
* Reads the given source into the given type.
3539
*
3640
* @param type they type to convert the given source to.
3741
* @param source the source to create an object of the given type from.
3842
*/
39-
<R> R read(Class<R> type, JsonNode source);
43+
<R> R read(Class<R> type, JsonNode source, TransactionMappingContext ctx);
4044
}

src/main/java/com/arangodb/springframework/core/convert/DefaultArangoConverter.java

Lines changed: 65 additions & 58 deletions
Large diffs are not rendered by default.

src/main/java/com/arangodb/springframework/core/convert/resolver/DocumentFromResolver.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
package com.arangodb.springframework.core.convert.resolver;
2222

23-
import com.arangodb.serde.SerdeContext;
24-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
23+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2524
import org.springframework.data.util.TypeInformation;
2625

2726
import com.arangodb.ArangoCursor;
@@ -49,30 +48,28 @@ public DocumentFromResolver(final ArangoOperations template) {
4948

5049
@Override
5150
public Object resolveOne(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
52-
final From annotation) {
53-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
51+
final From annotation, final TransactionMappingContext ctx) {
5452
Supplier<Object> supplier = () -> _resolveOne(id, type, ctx);
5553
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
5654
}
5755

58-
private Object _resolveOne(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
56+
private Object _resolveOne(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
5957
ArangoCursor<?> it = _resolve(id, type.getType(), true, ctx);
6058
return it.hasNext() ? it.next() : null;
6159
}
6260

6361
@Override
6462
public Object resolveMultiple(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
65-
final From annotation) {
66-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
63+
final From annotation, final TransactionMappingContext ctx) {
6764
Supplier<Object> supplier = () -> _resolveMultiple(id, type, ctx);
6865
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
6966
}
7067

71-
private Object _resolveMultiple(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
68+
private Object _resolveMultiple(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
7269
return _resolve(id, getNonNullComponentType(type).getType(), false, ctx).asListRemaining();
7370
}
7471

75-
private ArangoCursor<?> _resolve(final String id, final Class<?> type, final boolean limit, final SerdeContext ctx) {
72+
private ArangoCursor<?> _resolve(final String id, final Class<?> type, final boolean limit, final TransactionMappingContext ctx) {
7673
final String query = String.format("FOR e IN @@edge FILTER e._from == @id %s RETURN e", limit ? "LIMIT 1" : "");
7774
Map<String, Object> bindVars = new HashMap<>();
7875
bindVars.put("@edge", type);

src/main/java/com/arangodb/springframework/core/convert/resolver/DocumentToResolver.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
package com.arangodb.springframework.core.convert.resolver;
2222

23-
import com.arangodb.serde.SerdeContext;
24-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
23+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2524
import org.springframework.data.util.TypeInformation;
2625

2726
import com.arangodb.ArangoCursor;
@@ -49,30 +48,28 @@ public DocumentToResolver(final ArangoOperations template) {
4948

5049
@Override
5150
public Object resolveOne(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
52-
final To annotation) {
53-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
51+
final To annotation, final TransactionMappingContext ctx) {
5452
Supplier<Object> supplier = () -> _resolveOne(id, type, ctx);
5553
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
5654
}
5755

58-
private Object _resolveOne(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
56+
private Object _resolveOne(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
5957
ArangoCursor<?> it = _resolve(id, type.getType(), true, ctx);
6058
return it.hasNext() ? it.next() : null;
6159
}
6260

6361
@Override
6462
public Object resolveMultiple(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
65-
final To annotation) {
66-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
63+
final To annotation, final TransactionMappingContext ctx) {
6764
Supplier<Object> supplier = () -> _resolveMultiple(id, type, ctx);
6865
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
6966
}
7067

71-
private Object _resolveMultiple(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
68+
private Object _resolveMultiple(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
7269
return _resolve(id, getNonNullComponentType(type).getType(), false, ctx).asListRemaining();
7370
}
7471

75-
private ArangoCursor<?> _resolve(final String id, final Class<?> type, final boolean limit, final SerdeContext ctx) {
72+
private ArangoCursor<?> _resolve(final String id, final Class<?> type, final boolean limit, final TransactionMappingContext ctx) {
7673
final String query = String.format("FOR e IN @@edge FILTER e._to == @id %s RETURN e", limit ? "LIMIT 1" : "");
7774
Map<String, Object> bindVars = new HashMap<>();
7875
bindVars.put("@edge", type);

src/main/java/com/arangodb/springframework/core/convert/resolver/EdgeFromResolver.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
package com.arangodb.springframework.core.convert.resolver;
2222

2323
import com.arangodb.model.DocumentReadOptions;
24-
import com.arangodb.serde.SerdeContext;
25-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
24+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2625
import org.springframework.data.util.TypeInformation;
2726

2827
import com.arangodb.springframework.annotation.From;
@@ -45,13 +44,12 @@ public EdgeFromResolver(final ArangoOperations template) {
4544

4645
@Override
4746
public Object resolveOne(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
48-
final From annotation) {
49-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
47+
final From annotation, final TransactionMappingContext ctx) {
5048
Supplier<Object> supplier = () -> _resolveOne(id, type, ctx);
5149
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
5250
}
5351

54-
private Object _resolveOne(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
52+
private Object _resolveOne(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
5553
DocumentReadOptions opts = new DocumentReadOptions();
5654
ctx.getStreamTransactionId().ifPresent(opts::streamTransactionId);
5755
return template.find(id, type.getType(), opts)
@@ -60,7 +58,7 @@ private Object _resolveOne(final String id, final TypeInformation<?> type, final
6058

6159
@Override
6260
public Object resolveMultiple(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
63-
final From annotation) {
61+
final From annotation, final TransactionMappingContext ctx) {
6462
throw new UnsupportedOperationException("Edges with multiple 'from' values are not supported.");
6563
}
6664

src/main/java/com/arangodb/springframework/core/convert/resolver/EdgeToResolver.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
package com.arangodb.springframework.core.convert.resolver;
2222

2323
import com.arangodb.model.DocumentReadOptions;
24-
import com.arangodb.serde.SerdeContext;
25-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
24+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2625
import org.springframework.data.util.TypeInformation;
2726

2827
import com.arangodb.springframework.annotation.To;
@@ -45,13 +44,12 @@ public EdgeToResolver(final ArangoOperations template) {
4544

4645
@Override
4746
public Object resolveOne(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
48-
final To annotation) {
49-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
47+
final To annotation, final TransactionMappingContext ctx) {
5048
Supplier<Object> supplier = () -> _resolveOne(id, type, ctx);
5149
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
5250
}
5351

54-
private Object _resolveOne(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
52+
private Object _resolveOne(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
5553
DocumentReadOptions opts = new DocumentReadOptions();
5654
ctx.getStreamTransactionId().ifPresent(opts::streamTransactionId);
5755
return template.find(id, type.getType(), opts)
@@ -60,7 +58,7 @@ private Object _resolveOne(final String id, final TypeInformation<?> type, final
6058

6159
@Override
6260
public Object resolveMultiple(final String id, final TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes,
63-
final To annotation) {
61+
final To annotation, final TransactionMappingContext ctx) {
6462
throw new UnsupportedOperationException("Edges with multiple 'to' values are not supported.");
6563
}
6664

src/main/java/com/arangodb/springframework/core/convert/resolver/RefResolver.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@
2525
import java.util.stream.Collectors;
2626

2727
import com.arangodb.model.DocumentReadOptions;
28-
import com.arangodb.serde.SerdeContext;
2928
import com.arangodb.springframework.core.mapping.ArangoPersistentEntity;
30-
import com.arangodb.springframework.core.mapping.SerdeContextHolder;
29+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
3130
import com.arangodb.springframework.core.util.MetadataUtils;
3231
import org.springframework.data.util.TypeInformation;
3332

@@ -48,20 +47,19 @@ public RefResolver(final ArangoOperations template) {
4847
}
4948

5049
@Override
51-
public Object resolveOne(final String id, final TypeInformation<?> type, final Ref annotation) {
52-
SerdeContext ctx = SerdeContextHolder.INSTANCE.getCtx();
50+
public Object resolveOne(final String id, final TypeInformation<?> type, final Ref annotation, final TransactionMappingContext ctx) {
5351
Supplier<Object> supplier = () -> _resolve(id, type, ctx);
5452
return annotation.lazy() ? proxy(id, type, supplier) : supplier.get();
5553
}
5654

5755
@Override
58-
public Object resolveMultiple(final Collection<String> ids, final TypeInformation<?> type, final Ref annotation) {
56+
public Object resolveMultiple(final Collection<String> ids, final TypeInformation<?> type, final Ref annotation, final TransactionMappingContext ctx) {
5957
return ids.stream()
60-
.map(id -> resolveOne(id, getNonNullComponentType(type), annotation))
58+
.map(id -> resolveOne(id, getNonNullComponentType(type), annotation, ctx))
6159
.collect(Collectors.toList());
6260
}
6361

64-
private Object _resolve(final String id, final TypeInformation<?> type, final SerdeContext ctx) {
62+
private Object _resolve(final String id, final TypeInformation<?> type, final TransactionMappingContext ctx) {
6563
DocumentReadOptions opts = new DocumentReadOptions();
6664
ctx.getStreamTransactionId().ifPresent(opts::streamTransactionId);
6765
return template.find(id, type.getType(), opts)

src/main/java/com/arangodb/springframework/core/convert/resolver/ReferenceResolver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
import java.util.Collection;
2525

2626
import com.arangodb.springframework.core.mapping.ArangoPersistentEntity;
27+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2728
import org.springframework.data.util.TypeInformation;
2829

2930
/**
3031
* @author Mark Vollmary
3132
*/
3233
public interface ReferenceResolver<A extends Annotation> {
33-
Object resolveOne(String id, TypeInformation<?> type, A annotation);
34-
Object resolveMultiple(Collection<String> ids, TypeInformation<?> type, A annotation);
34+
Object resolveOne(String id, TypeInformation<?> type, A annotation, TransactionMappingContext ctx);
35+
Object resolveMultiple(Collection<String> ids, TypeInformation<?> type, A annotation, TransactionMappingContext ctx);
3536
String write(Object source, ArangoPersistentEntity<?> entity, Object id);
3637
}

src/main/java/com/arangodb/springframework/core/convert/resolver/RelationResolver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@
2323
import java.lang.annotation.Annotation;
2424
import java.util.Collection;
2525

26+
import com.arangodb.springframework.core.mapping.TransactionMappingContext;
2627
import org.springframework.data.util.TypeInformation;
2728

2829
/**
2930
* @author Mark Vollmary
3031
*/
3132
public interface RelationResolver<A extends Annotation> {
32-
Object resolveOne(String id, TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes, A annotation);
33-
Object resolveMultiple(String id, TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes, A annotation);
33+
Object resolveOne(String id, TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes, A annotation, TransactionMappingContext ctx);
34+
Object resolveMultiple(String id, TypeInformation<?> type, Collection<TypeInformation<?>> traversedTypes, A annotation, TransactionMappingContext ctx);
3435
}

0 commit comments

Comments
 (0)