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