From b9489f170636cee8af4c5edb824a34e21cc63195 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Fri, 30 May 2025 09:18:41 +0000
Subject: [PATCH] [#462] RFC5805 Lightweight Directory Access Protocol (LDAP) Transactions (#469)
---
opendj-server-legacy/src/main/java/org/opends/server/api/ClientConnection.java | 52 +++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/api/ClientConnection.java b/opendj-server-legacy/src/main/java/org/opends/server/api/ClientConnection.java
index 7487b3d..a891fee 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/api/ClientConnection.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/api/ClientConnection.java
@@ -13,6 +13,7 @@
*
* Copyright 2006-2009 Sun Microsystems, Inc.
* Portions Copyright 2011-2016 ForgeRock AS.
+ * Portions Copyright 2025 3A Systems, LLC.
*/
package org.opends.server.api;
@@ -20,11 +21,8 @@
import java.nio.channels.ByteChannel;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -53,6 +51,7 @@
import org.opends.server.types.Privilege;
import org.opends.server.types.SearchResultEntry;
import org.opends.server.types.SearchResultReference;
+import org.opends.server.types.operation.RollbackOperation;
import org.opends.server.util.TimeThread;
import static org.opends.messages.CoreMessages.*;
@@ -1576,4 +1575,47 @@
{
return getConnectionID() < 0;
}
+
+ public class Transaction {
+ final String transactionId=UUID.randomUUID().toString().toLowerCase();
+
+ public Transaction() {
+ transactions.put(getTransactionId(),this);
+ }
+
+ public String getTransactionId() {
+ return transactionId;
+ }
+
+ final Queue<Operation> waiting=new LinkedList<>();
+ public void add(Operation operation) {
+ waiting.add(operation);
+ }
+
+ public Queue<Operation> getWaiting() {
+ return waiting;
+ }
+
+ public void clear() {
+ transactions.remove(getTransactionId());
+ }
+ final Deque<RollbackOperation> completed =new ArrayDeque<>();
+ public void success(RollbackOperation operation) {
+ completed.add(operation);
+ }
+
+ public Deque<RollbackOperation> getCompleted() {
+ return completed;
+ }
+ }
+
+ Map<String,Transaction> transactions=new ConcurrentHashMap<>();
+
+ public Transaction startTransaction() {
+ return new Transaction();
+ }
+
+ public Transaction getTransaction(String id) {
+ return transactions.get(id);
+ }
}
--
Gitblit v1.10.0