diff --git a/jnosql-arangodb/pom.xml b/jnosql-arangodb/pom.xml
index 7042244f3..89b1c5dd9 100644
--- a/jnosql-arangodb/pom.xml
+++ b/jnosql-arangodb/pom.xml
@@ -28,7 +28,7 @@
The Eclipse JNoSQL layer to ArangoDB
- 7.7.1
+ 7.11.0
@@ -46,7 +46,7 @@
com.arangodb
- arangodb-java-driver
+ arangodb-java-driver-shaded
${arango.driver}
diff --git a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBBucketManager.java b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBBucketManager.java
index efb520036..f050679e4 100644
--- a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBBucketManager.java
+++ b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBBucketManager.java
@@ -11,12 +11,14 @@
* Contributors:
*
* Otavio Santana
+ * Michele Rastelli
*/
package org.eclipse.jnosql.databases.arangodb.communication;
import com.arangodb.ArangoDB;
-import com.arangodb.entity.BaseDocument;
+import jakarta.json.Json;
+import jakarta.json.JsonObject;
import jakarta.json.bind.Jsonb;
import org.eclipse.jnosql.communication.Value;
import org.eclipse.jnosql.communication.driver.JsonbSupplier;
@@ -41,8 +43,9 @@
public class ArangoDBBucketManager implements BucketManager {
+ private static final String KEY = "_key";
private static final String VALUE = "_value";
- private static final Function TO_JSON = e -> e.getAttribute(VALUE).toString();
+ private static final Function TO_JSON = e -> e.getString(VALUE);
private static final Jsonb JSONB = JsonbSupplier.getInstance().get();
private final ArangoDB arangoDB;
@@ -66,14 +69,15 @@ public String name() {
public void put(K key, V value) throws NullPointerException {
Objects.requireNonNull(key, "Key is required");
Objects.requireNonNull(value, "value is required");
- BaseDocument baseDocument = new BaseDocument();
- baseDocument.setKey(key.toString());
- baseDocument.addAttribute(VALUE, JSONB.toJson(value));
+ JsonObject jsonObject = Json.createObjectBuilder()
+ .add(KEY, key.toString())
+ .add(VALUE, JSONB.toJson(value))
+ .build();
if (arangoDB.db(bucketName).collection(namespace).documentExists(key.toString())) {
arangoDB.db(bucketName).collection(namespace).deleteDocument(key.toString());
}
arangoDB.db(bucketName).collection(namespace)
- .insertDocument(baseDocument);
+ .insertDocument(jsonObject);
}
@Override
@@ -91,8 +95,8 @@ public void put(Iterable keyValueEntities) throws NullPointerEx
@Override
public Optional get(K key) throws NullPointerException {
Objects.requireNonNull(key, "Key is required");
- BaseDocument entity = arangoDB.db(bucketName).collection(namespace)
- .getDocument(key.toString(), BaseDocument.class);
+ JsonObject entity = arangoDB.db(bucketName).collection(namespace)
+ .getDocument(key.toString(), JsonObject.class);
return ofNullable(entity)
.map(TO_JSON)
@@ -105,7 +109,7 @@ public Iterable get(Iterable keys) throws NullPointerException {
return stream(keys.spliterator(), false)
.map(Object::toString)
.map(k -> arangoDB.db(bucketName).collection(namespace)
- .getDocument(k, BaseDocument.class))
+ .getDocument(k, JsonObject.class))
.filter(Objects::nonNull)
.map(TO_JSON)
.map(ValueJSON::of)
diff --git a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBConfiguration.java b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBConfiguration.java
index 2e9043a20..11dfc3a92 100644
--- a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBConfiguration.java
+++ b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBConfiguration.java
@@ -11,25 +11,27 @@
* Contributors:
*
* Otavio Santana
+ * Michele Rastelli
*/
package org.eclipse.jnosql.databases.arangodb.communication;
import com.arangodb.ArangoDB;
import com.arangodb.entity.LoadBalancingStrategy;
+import com.arangodb.serde.ArangoSerde;
import org.eclipse.jnosql.communication.Settings;
import static java.util.Objects.requireNonNull;
/**
- * The base to configuration both key-value and document on mongoDB.
+ * The base to configuration both key-value and document on ArangoDB.
* To each configuration set, it will change both builder
* {@link ArangoDB.Builder}
*/
public abstract class ArangoDBConfiguration {
-
- protected ArangoDB.Builder builder = new ArangoDB.Builder();
+ protected ArangoDB.Builder builder = new ArangoDB.Builder()
+ .serde(new JsonbSerde());
/**
* Adds a host in the arangodb builder
@@ -54,7 +56,6 @@ public void setLoadBalancingStrategy(LoadBalancingStrategy loadBalancingStrategy
builder.loadBalancingStrategy(loadBalancingStrategy);
}
-
/**
* set the setTimeout
*
@@ -91,6 +92,21 @@ public void setUseSSL(boolean value) {
builder.useSsl(value);
}
+ /**
+ * Set the ArangoDB serde for the user data. Note that the provided
+ * serde must support serializing and deserializing JsonP types,
+ * i.e. {@link jakarta.json.JsonValue} and its children.
+ * By default, the builder is configured to use {@link JsonbSerde};
+ * this setter allows overriding it, i.e. providing an instance of
+ * {@link JsonbSerde} that uses a specific {@link jakarta.json.bind.Jsonb}
+ * instance.
+ *
+ * @param serde the serde
+ */
+ public void setSerde(ArangoSerde serde) {
+ builder.serde(serde);
+ }
+
/**
* Defines a new builder to sync ArangoDB
*
@@ -102,12 +118,10 @@ public void syncBuilder(ArangoDB.Builder builder) throws NullPointerException {
this.builder = builder;
}
-
protected ArangoDB getArangoDB(Settings settings) {
ArangoDBBuilderSync aragonDB = new ArangoDBBuilderSync(builder);
ArangoDBBuilders.load(settings, aragonDB);
return aragonDB.build();
}
-
}
diff --git a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBUtil.java b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBUtil.java
index b4f4caa1d..c655e6d1e 100644
--- a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBUtil.java
+++ b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/ArangoDBUtil.java
@@ -11,29 +11,33 @@
* Contributors:
*
* Otavio Santana
+ * Michele Rastelli
*/
package org.eclipse.jnosql.databases.arangodb.communication;
import com.arangodb.ArangoDB;
-import com.arangodb.entity.BaseDocument;
import com.arangodb.entity.CollectionEntity;
-import org.eclipse.jnosql.communication.Value;
+import jakarta.json.Json;
+import jakarta.json.JsonArray;
+import jakarta.json.JsonArrayBuilder;
+import jakarta.json.JsonNumber;
+import jakarta.json.JsonObject;
+import jakarta.json.JsonObjectBuilder;
+import jakarta.json.JsonString;
+import jakarta.json.JsonValue;
import org.eclipse.jnosql.communication.ValueUtil;
import org.eclipse.jnosql.communication.semistructured.CommunicationEntity;
import org.eclipse.jnosql.communication.semistructured.Element;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
-import static java.util.Collections.singletonMap;
import static java.util.stream.Collectors.toList;
import static java.util.stream.StreamSupport.stream;
@@ -47,9 +51,6 @@ public final class ArangoDBUtil {
public static final String REV = "_rev";
private static final Logger LOGGER = Logger.getLogger(ArangoDBUtil.class.getName());
- private static final Function, Element> ENTRY_DOCUMENT = entry ->
- Element.of(entry.getKey().toString(), entry.getValue());
-
private ArangoDBUtil() {
}
@@ -71,101 +72,100 @@ public static void checkCollection(String bucketName, ArangoDB arangoDB, String
List collections = arangoDB.db(bucketName)
.getCollections().stream()
.map(CollectionEntity::getName)
- .collect(toList());
+ .toList();
if (!collections.contains(namespace)) {
arangoDB.db(bucketName).createCollection(namespace);
}
}
+ static CommunicationEntity toEntity(JsonObject jsonObject) {
+ List documents = toDocuments(jsonObject);
- static CommunicationEntity toEntity(BaseDocument document) {
- Map properties = document.getProperties();
- List documents = properties.keySet().stream()
- .map(k -> toDocument(k, properties))
- .collect(toList());
-
- documents.add(Element.of(KEY, document.getKey()));
- documents.add(Element.of(ID, document.getId()));
- documents.add(Element.of(REV, document.getRevision()));
- String collection = document.getId().split("/")[0];
+ String id = jsonObject.getString(ID);
+ documents.add(Element.of(KEY, jsonObject.getString(KEY)));
+ documents.add(Element.of(ID, id));
+ documents.add(Element.of(REV, jsonObject.getString(REV)));
+ String collection = id.split("/")[0];
return CommunicationEntity.of(collection, documents);
}
- static BaseDocument getBaseDocument(CommunicationEntity entity) {
- Map map = new HashMap<>();
- for (Element document : entity.elements()) {
- if(KEY.equals(document.name()) && Objects.isNull(document.get())) {
- continue;
- }
- map.put(document.name(), convert(document.value()));
- }
- return new BaseDocument(map);
+ static JsonObject toJsonObject(CommunicationEntity entity) {
+ return toJsonObject(entity.elements());
}
- private static Element toDocument(String key, Map properties) {
- Object value = properties.get(key);
- if (value instanceof Map map) {
- return Element.of(key, map.keySet()
- .stream().map(k -> toDocument(k.toString(), map))
- .collect(toList()));
- }
- if (isADocumentIterable(value)) {
- List> documents = new ArrayList<>();
- for (Object object : Iterable.class.cast(value)) {
- Map, ?> map = Map.class.cast(object);
- documents.add(map.entrySet().stream().map(ENTRY_DOCUMENT).collect(toList()));
- }
- return Element.of(key, documents);
-
- }
- return Element.of(key, value);
+ private static List toDocuments(JsonObject object) {
+ return object.entrySet().stream()
+ .map(it -> Element.of(it.getKey(), toDocuments(it.getValue())))
+ .collect(toList());
}
- private static boolean isADocumentIterable(Object value) {
- return Iterable.class.isInstance(value) &&
- stream(Iterable.class.cast(value).spliterator(), false)
- .allMatch(Map.class::isInstance);
+ private static List> toDocuments(JsonArray array) {
+ return array.stream()
+ .map(ArangoDBUtil::toDocuments)
+ .toList();
}
- private static Object convert(Value value) {
- Object val = ValueUtil.convert(value);
-
- if (Element.class.isInstance(val)) {
- Element document = Element.class.cast(val);
- return singletonMap(document.name(), convert(document.value()));
- }
- if (isSudDocument(val)) {
- return getMap(val);
- }
- if (isSudDocumentList(val)) {
- return stream(Iterable.class.cast(val).spliterator(), false)
- .map(ArangoDBUtil::getMap).collect(toList());
- }
- return val;
+ private static Object toDocuments(JsonValue value) {
+ return switch (value.getValueType()) {
+ case OBJECT -> toDocuments(value.asJsonObject());
+ case ARRAY -> toDocuments(value.asJsonArray());
+ case STRING -> ((JsonString) value).getString();
+ case NUMBER -> ((JsonNumber) value).numberValue();
+ case TRUE -> true;
+ case FALSE -> false;
+ case NULL -> null;
+ };
}
- private static Object getMap(Object val) {
- Iterable> iterable = Iterable.class.cast(val);
- Map