From e977578c32f2a1d1c5104e2707ab8cda8335793f Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 17 Dec 2014 10:31:22 +0000
Subject: [PATCH] Move SPI interfaces to separate package.

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Importer.java                |   41 ++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadOperation.java           |   32 +++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java |   47 +++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java        |   40 ++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadableStorage.java         |   41 ++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java            |   42 +++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java                 |   48 +++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteOperation.java          |   32 +++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java                  |   52 +++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java                |  123 +++++++++++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/package-info.java            |   33 +++
 11 files changed, 523 insertions(+), 8 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
index 1abbddc..b4b9a95 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
@@ -1,3 +1,29 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
 package org.opends.server.backends.persistit;
 
 import java.io.File;
@@ -11,14 +37,14 @@
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.admin.std.server.LocalDBBackendCfg;
-import org.opends.server.backends.pluggable.BackendImpl.Cursor;
-import org.opends.server.backends.pluggable.BackendImpl.Importer;
-import org.opends.server.backends.pluggable.BackendImpl.ReadOperation;
-import org.opends.server.backends.pluggable.BackendImpl.Storage;
-import org.opends.server.backends.pluggable.BackendImpl.StorageRuntimeException;
-import org.opends.server.backends.pluggable.BackendImpl.TreeName;
-import org.opends.server.backends.pluggable.BackendImpl.WriteOperation;
-import org.opends.server.backends.pluggable.BackendImpl.WriteableStorage;
+import org.opends.server.backends.pluggable.spi.Cursor;
+import org.opends.server.backends.pluggable.spi.Importer;
+import org.opends.server.backends.pluggable.spi.ReadOperation;
+import org.opends.server.backends.pluggable.spi.Storage;
+import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
+import org.opends.server.backends.pluggable.spi.TreeName;
+import org.opends.server.backends.pluggable.spi.WriteOperation;
+import org.opends.server.backends.pluggable.spi.WriteableStorage;
 import org.opends.server.types.DN;
 
 import com.persistit.Exchange;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java
new file mode 100644
index 0000000..6e67586
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java
@@ -0,0 +1,52 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import java.io.Closeable;
+
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+
+public interface Cursor extends Closeable
+{
+  boolean positionToKey(ByteSequence key);
+
+  boolean positionToKeyOrNext(ByteSequence key);
+
+  boolean positionToLastKey();
+
+  boolean next();
+
+  boolean previous();
+
+  ByteString getKey();
+
+  ByteString getValue();
+
+  @Override
+  public void close();
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Importer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Importer.java
new file mode 100644
index 0000000..f2df235
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Importer.java
@@ -0,0 +1,41 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import java.io.Closeable;
+
+import org.forgerock.opendj.ldap.ByteSequence;
+
+public interface Importer extends Closeable
+{
+  void createTree(TreeName name);
+
+  void put(TreeName name, ByteSequence key, ByteSequence value);
+
+  @Override
+  void close();
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadOperation.java
new file mode 100644
index 0000000..9d9fd6c
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadOperation.java
@@ -0,0 +1,32 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+public interface ReadOperation<T>
+{
+  T run(ReadableStorage txn) throws Exception;
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadableStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadableStorage.java
new file mode 100644
index 0000000..f9aa703
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/ReadableStorage.java
@@ -0,0 +1,41 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+
+public interface ReadableStorage
+{
+  ByteString get(TreeName name, ByteSequence key);
+
+  ByteString getRMW(TreeName name, ByteSequence key);
+
+  Cursor openCursor(TreeName name);
+
+  // TODO: contains, etc.
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java
new file mode 100644
index 0000000..d954134
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java
@@ -0,0 +1,48 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import java.io.Closeable;
+import java.util.Map;
+
+public interface Storage extends Closeable
+{
+  void initialize(Map<String, String> options) throws Exception;
+
+  Importer startImport() throws Exception;
+
+  void open() throws Exception;
+
+  <T> T read(ReadOperation<T> readTransaction) throws Exception;
+
+  void write(WriteOperation updateTransaction) throws Exception;
+
+  Cursor openCursor(TreeName name);
+
+  @Override
+  void close();
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java
new file mode 100644
index 0000000..963b2d0
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java
@@ -0,0 +1,47 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+@SuppressWarnings("serial")
+public final class StorageRuntimeException extends RuntimeException
+{
+
+  public StorageRuntimeException(final String message)
+  {
+    super(message);
+  }
+
+  public StorageRuntimeException(final String message, final Throwable cause)
+  {
+    super(message, cause);
+  }
+
+  public StorageRuntimeException(final Throwable cause)
+  {
+    super(cause);
+  }
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
new file mode 100644
index 0000000..d872ee9
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
@@ -0,0 +1,123 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Assumes name components don't contain a '/'. */
+public final class TreeName
+{
+  public static TreeName of(final String... names)
+  {
+    return new TreeName(Arrays.asList(names));
+  }
+
+  private final List<String> names;
+  private final String s;
+
+  public TreeName(final List<String> names)
+  {
+    this.names = names;
+    final StringBuilder builder = new StringBuilder();
+    for (final String name : names)
+    {
+      builder.append('/');
+      builder.append(name);
+    }
+    this.s = builder.toString();
+  }
+
+  public List<String> getNames()
+  {
+    return names;
+  }
+
+  public TreeName child(final String name)
+  {
+    final List<String> newNames = new ArrayList<String>(names.size() + 1);
+    newNames.addAll(names);
+    newNames.add(name);
+    return new TreeName(newNames);
+  }
+
+  public TreeName getSuffix()
+  {
+    if (names.size() == 0)
+    {
+      throw new IllegalStateException();
+    }
+    return new TreeName(Collections.singletonList(names.get(0)));
+  }
+
+  public boolean isSuffixOf(TreeName tree)
+  {
+    if (names.size() > tree.names.size())
+    {
+      return false;
+    }
+    for (int i = 0; i < names.size(); i++)
+    {
+      if (!tree.names.get(i).equals(names.get(i)))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public boolean equals(final Object obj)
+  {
+    if (this == obj)
+    {
+      return true;
+    }
+    else if (obj instanceof TreeName)
+    {
+      return s.equals(((TreeName) obj).s);
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  @Override
+  public int hashCode()
+  {
+    return s.hashCode();
+  }
+
+  @Override
+  public String toString()
+  {
+    return s;
+  }
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteOperation.java
new file mode 100644
index 0000000..e99b1a2
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteOperation.java
@@ -0,0 +1,32 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+public interface WriteOperation
+{
+  void run(WriteableStorage txn) throws Exception;
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java
new file mode 100644
index 0000000..1c3beb6
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java
@@ -0,0 +1,40 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.opends.server.backends.pluggable.spi;
+
+import org.forgerock.opendj.ldap.ByteSequence;
+
+public interface WriteableStorage extends ReadableStorage
+{
+  void openTree(TreeName name);
+
+  void put(TreeName name, ByteSequence key, ByteSequence value);
+
+  boolean putIfAbsent(TreeName treeName, ByteSequence key, ByteSequence value);
+
+  boolean remove(TreeName name, ByteSequence key);
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/package-info.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/package-info.java
new file mode 100644
index 0000000..351e87c
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/package-info.java
@@ -0,0 +1,33 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+/**
+ * Interfaces and classes required when implementing new storage
+ * engines for the pluggable backend.
+ */
+@org.opends.server.types.PublicAPI(
+     stability=org.opends.server.types.StabilityLevel.PRIVATE)
+package org.opends.server.backends.pluggable.spi;

--
Gitblit v1.10.0