Skip to content

Commit 150f092

Browse files
authored
field annotations @id, @key, @Rev, @from, @to (#439)
1 parent 91503b9 commit 150f092

26 files changed

+424
-154
lines changed

src/main/java/com/arangodb/ArangoDB.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -660,10 +660,7 @@ public Builder setDeserializer(final ArangoDeserializer deserializer) {
660660
*
661661
* @param serialization custom serializer/deserializer
662662
* @return {@link ArangoDB.Builder}
663-
* @deprecated Use {@link com.arangodb.mapping.ArangoJack} instead and register custom serializers and deserializers by implementing {@link com.fasterxml.jackson.databind.JsonSerializer} and {@link com.fasterxml.jackson.databind.JsonDeserializer}.
664-
* @see <a href="https://www.arangodb.com/docs/stable/drivers/java-reference-serialization.html#custom-serializer">Reference Documentation</a>
665663
*/
666-
@Deprecated
667664
public Builder serializer(final ArangoSerialization serialization) {
668665
setSerializer(serialization);
669666
return this;

src/main/java/com/arangodb/async/ArangoDBAsync.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -846,10 +846,7 @@ public Builder setDeserializer(final ArangoDeserializer deserializer) {
846846
*
847847
* @param serialization custom serializer/deserializer
848848
* @return {@link ArangoDBAsync.Builder}
849-
* @deprecated Use {@link com.arangodb.mapping.ArangoJack} instead and register custom serializers and deserializers by implementing {@link com.fasterxml.jackson.databind.JsonSerializer} and {@link com.fasterxml.jackson.databind.JsonDeserializer}.
850-
* @see <a href="https://www.arangodb.com/docs/stable/drivers/java-reference-serialization.html#custom-serializer">Reference Documentation</a>
851849
*/
852-
@Deprecated
853850
public Builder serializer(final ArangoSerialization serialization) {
854851
setSerializer(serialization);
855852
return this;

src/main/java/com/arangodb/entity/BaseDocument.java

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

2121
package com.arangodb.entity;
2222

23-
import com.arangodb.entity.DocumentField.Type;
23+
import com.arangodb.internal.DocumentFields;
2424

2525
import java.io.Serializable;
2626
import java.util.HashMap;
@@ -33,11 +33,11 @@ public class BaseDocument implements Serializable {
3333

3434
private static final long serialVersionUID = -1824742667228719116L;
3535

36-
@DocumentField(Type.ID)
36+
@Id
3737
protected String id;
38-
@DocumentField(Type.KEY)
38+
@Key
3939
protected String key;
40-
@DocumentField(Type.REV)
40+
@Rev
4141
protected String revision;
4242
protected Map<String, Object> properties;
4343

@@ -53,15 +53,15 @@ public BaseDocument(final String key) {
5353

5454
public BaseDocument(final Map<String, Object> properties) {
5555
this();
56-
final Object tmpId = properties.remove(DocumentField.Type.ID.getSerializeName());
56+
final Object tmpId = properties.remove(DocumentFields.ID);
5757
if (tmpId != null) {
5858
id = tmpId.toString();
5959
}
60-
final Object tmpKey = properties.remove(DocumentField.Type.KEY.getSerializeName());
60+
final Object tmpKey = properties.remove(DocumentFields.KEY);
6161
if (tmpKey != null) {
6262
key = tmpKey.toString();
6363
}
64-
final Object tmpRev = properties.remove(DocumentField.Type.REV.getSerializeName());
64+
final Object tmpRev = properties.remove(DocumentFields.REV);
6565
if (tmpRev != null) {
6666
revision = tmpRev.toString();
6767
}

src/main/java/com/arangodb/entity/BaseEdgeDocument.java

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

2121
package com.arangodb.entity;
2222

23-
import com.arangodb.entity.DocumentField.Type;
23+
import com.arangodb.internal.DocumentFields;
2424

2525
import java.util.Map;
2626

@@ -31,9 +31,9 @@ public class BaseEdgeDocument extends BaseDocument {
3131

3232
private static final long serialVersionUID = 6904923804449368783L;
3333

34-
@DocumentField(Type.FROM)
34+
@From
3535
private String from;
36-
@DocumentField(Type.TO)
36+
@To
3737
private String to;
3838

3939
public BaseEdgeDocument() {
@@ -54,11 +54,11 @@ public BaseEdgeDocument(final String key, final String from, final String to) {
5454

5555
public BaseEdgeDocument(final Map<String, Object> properties) {
5656
super(properties);
57-
final Object tmpFrom = properties.remove(DocumentField.Type.FROM.getSerializeName());
57+
final Object tmpFrom = properties.remove(DocumentFields.FROM);
5858
if (tmpFrom != null) {
5959
from = tmpFrom.toString();
6060
}
61-
final Object tmpTo = properties.remove(DocumentField.Type.TO.getSerializeName());
61+
final Object tmpTo = properties.remove(DocumentFields.TO);
6262
if (tmpTo != null) {
6363
to = tmpTo.toString();
6464
}

src/main/java/com/arangodb/entity/DocumentEntity.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,16 @@
2020

2121
package com.arangodb.entity;
2222

23-
import com.arangodb.entity.DocumentField.Type;
24-
2523
/**
2624
* @author Mark Vollmary
2725
*/
2826
public class DocumentEntity implements Entity {
2927

30-
@DocumentField(Type.KEY)
28+
@Key
3129
private String key;
32-
@DocumentField(Type.ID)
30+
@Id
3331
private String id;
34-
@DocumentField(Type.REV)
32+
@Rev
3533
private String rev;
3634

3735
public DocumentEntity() {

src/main/java/com/arangodb/entity/DocumentField.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,45 @@
2727

2828
/**
2929
* @author Mark Vollmary
30+
* @deprecated Use {@link Id}, {@link Key}, {@link Rev}, {@link From} or {@link To} instead.
3031
*/
3132
@Retention(RetentionPolicy.RUNTIME)
3233
@Target({ElementType.FIELD})
34+
@Deprecated
3335
public @interface DocumentField {
3436

37+
@Deprecated
3538
enum Type {
36-
ID("_id"), KEY("_key"), REV("_rev"), FROM("_from"), TO("_to");
39+
40+
/**
41+
* @deprecated Use {@link Id} instead.
42+
*/
43+
@Deprecated
44+
ID("_id"),
45+
46+
/**
47+
* @deprecated Use {@link Key} instead.
48+
*/
49+
@Deprecated
50+
KEY("_key"),
51+
52+
/**
53+
* @deprecated Use {@link Rev} instead.
54+
*/
55+
@Deprecated
56+
REV("_rev"),
57+
58+
/**
59+
* @deprecated Use {@link From} instead.
60+
*/
61+
@Deprecated
62+
FROM("_from"),
63+
64+
/**
65+
* @deprecated Use {@link To} instead.
66+
*/
67+
@Deprecated
68+
TO("_to");
3769

3870
private final String serializeName;
3971

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arangodb.entity;
2+
3+
import com.arangodb.internal.DocumentFields;
4+
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* @author Michele Rastelli
15+
*/
16+
// TODO: in v7 add targets ElementType.METHOD and ElementType.PARAMETER
17+
@Target(ElementType.FIELD)
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@JacksonAnnotationsInside
20+
@JsonProperty(DocumentFields.FROM)
21+
@JsonInclude(JsonInclude.Include.NON_NULL)
22+
public @interface From {
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arangodb.entity;
2+
3+
import com.arangodb.internal.DocumentFields;
4+
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* @author Michele Rastelli
15+
*/
16+
// TODO: in v7 add targets ElementType.METHOD and ElementType.PARAMETER
17+
@Target(ElementType.FIELD)
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@JacksonAnnotationsInside
20+
@JsonProperty(DocumentFields.ID)
21+
@JsonInclude(JsonInclude.Include.NON_NULL)
22+
public @interface Id {
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arangodb.entity;
2+
3+
import com.arangodb.internal.DocumentFields;
4+
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* @author Michele Rastelli
15+
*/
16+
// TODO: in v7 add targets ElementType.METHOD and ElementType.PARAMETER
17+
@Target(ElementType.FIELD)
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@JacksonAnnotationsInside
20+
@JsonProperty(DocumentFields.KEY)
21+
@JsonInclude(JsonInclude.Include.NON_NULL)
22+
public @interface Key {
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arangodb.entity;
2+
3+
import com.arangodb.internal.DocumentFields;
4+
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* @author Michele Rastelli
15+
*/
16+
// TODO: in v7 add targets ElementType.METHOD and ElementType.PARAMETER
17+
@Target(ElementType.FIELD)
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@JacksonAnnotationsInside
20+
@JsonProperty(DocumentFields.REV)
21+
@JsonInclude(JsonInclude.Include.NON_NULL)
22+
public @interface Rev {
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arangodb.entity;
2+
3+
import com.arangodb.internal.DocumentFields;
4+
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* @author Michele Rastelli
15+
*/
16+
// TODO: in v7 add targets ElementType.METHOD and ElementType.PARAMETER
17+
@Target(ElementType.FIELD)
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@JacksonAnnotationsInside
20+
@JsonProperty(DocumentFields.TO)
21+
@JsonInclude(JsonInclude.Include.NON_NULL)
22+
public @interface To {
23+
}

src/main/java/com/arangodb/internal/DocumentCache.java

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
package com.arangodb.internal;
2222

2323
import com.arangodb.ArangoDBException;
24-
import com.arangodb.entity.DocumentField;
25-
import com.arangodb.entity.DocumentField.Type;
24+
import com.arangodb.entity.*;
2625

26+
import java.lang.annotation.Annotation;
2727
import java.lang.reflect.Field;
2828
import java.lang.reflect.Modifier;
2929
import java.util.*;
@@ -34,17 +34,17 @@
3434
*/
3535
public class DocumentCache {
3636

37-
private final Map<Class<?>, Map<DocumentField.Type, Field>> cache;
37+
private final Map<Class<?>, Map<String, Field>> cache;
3838

3939
public DocumentCache() {
4040
super();
4141
cache = new HashMap<>();
4242
}
4343

44-
public void setValues(final Object doc, final Map<DocumentField.Type, String> values) throws ArangoDBException {
44+
public void setValues(final Object doc, final Map<String, String> values) throws ArangoDBException {
4545
try {
46-
final Map<DocumentField.Type, Field> fields = getFields(doc.getClass());
47-
for (final Entry<DocumentField.Type, String> value : values.entrySet()) {
46+
final Map<String, Field> fields = getFields(doc.getClass());
47+
for (final Entry<String, String> value : values.entrySet()) {
4848
final Field field = fields.get(value.getKey());
4949
if (field != null) {
5050
field.set(doc, value.getValue());
@@ -55,8 +55,8 @@ public void setValues(final Object doc, final Map<DocumentField.Type, String> va
5555
}
5656
}
5757

58-
private Map<DocumentField.Type, Field> getFields(final Class<?> clazz) {
59-
Map<DocumentField.Type, Field> fields = new HashMap<>();
58+
private Map<String, Field> getFields(final Class<?> clazz) {
59+
Map<String, Field> fields = new HashMap<>();
6060
if (!isTypeRestricted(clazz)) {
6161
fields = cache.get(clazz);
6262
if (fields == null) {
@@ -71,11 +71,10 @@ private boolean isTypeRestricted(final Class<?> type) {
7171
return Map.class.isAssignableFrom(type) || Collection.class.isAssignableFrom(type);
7272
}
7373

74-
private Map<DocumentField.Type, Field> createFields(final Class<?> clazz) {
75-
final Map<DocumentField.Type, Field> fields = new HashMap<>();
74+
private Map<String, Field> createFields(final Class<?> clazz) {
75+
final Map<String, Field> fields = new HashMap<>();
7676
Class<?> tmp = clazz;
77-
final Collection<DocumentField.Type> values = new ArrayList<>(
78-
Arrays.asList(DocumentField.Type.values()));
77+
final Collection<String> values = new ArrayList<>(DocumentFields.values());
7978
while (tmp != null && tmp != Object.class && values.size() > 0) {
8079
final Field[] declaredFields = tmp.getDeclaredFields();
8180
for (int i = 0; i < declaredFields.length && values.size() > 0; i++) {
@@ -87,17 +86,33 @@ private Map<DocumentField.Type, Field> createFields(final Class<?> clazz) {
8786
}
8887

8988
private void findAnnotation(
90-
final Collection<Type> values,
91-
final Map<DocumentField.Type, Field> fields,
89+
final Collection<String> values,
90+
final Map<String, Field> fields,
9291
final Field field) {
93-
final DocumentField annotation = field.getAnnotation(DocumentField.class);
94-
if (annotation != null && !field.isSynthetic() && !Modifier.isStatic(field.getModifiers())
95-
&& String.class.isAssignableFrom(field.getType())) {
96-
final Type value = annotation.value();
97-
if (values.contains(value)) {
98-
field.setAccessible(true);
99-
fields.put(value, field);
100-
values.remove(value);
92+
93+
for (Annotation annotation : field.getAnnotations()) {
94+
if (annotation != null && !field.isSynthetic() && !Modifier.isStatic(field.getModifiers())
95+
&& String.class.isAssignableFrom(field.getType())) {
96+
String value = null;
97+
if (annotation instanceof DocumentField) {
98+
value = ((DocumentField) annotation).value().getSerializeName();
99+
} else if (annotation instanceof Id) {
100+
value = DocumentFields.ID;
101+
} else if (annotation instanceof Key) {
102+
value = DocumentFields.KEY;
103+
} else if (annotation instanceof Rev) {
104+
value = DocumentFields.REV;
105+
} else if (annotation instanceof From) {
106+
value = DocumentFields.FROM;
107+
} else if (annotation instanceof To) {
108+
value = DocumentFields.TO;
109+
}
110+
111+
if (values.contains(value)) {
112+
field.setAccessible(true);
113+
fields.put(value, field);
114+
values.remove(value);
115+
}
101116
}
102117
}
103118
}

0 commit comments

Comments
 (0)