From b9f4e8c9dd94fe6c006812b80c379f856b788e58 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 16 Sep 2016 10:11:31 +0000
Subject: [PATCH] Factorized common implementation of SubResourceHandler

---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceCollection.java |   85 ----------------
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceSingleton.java  |   89 -----------------
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResource.java           |  107 +++++++++++++++++++++
 3 files changed, 109 insertions(+), 172 deletions(-)

diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResource.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResource.java
index 1cb250a..503bba4 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResource.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResource.java
@@ -20,14 +20,27 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
+import org.forgerock.json.resource.ActionRequest;
+import org.forgerock.json.resource.ActionResponse;
 import org.forgerock.json.resource.BadRequestException;
+import org.forgerock.json.resource.CreateRequest;
+import org.forgerock.json.resource.DeleteRequest;
 import org.forgerock.json.resource.NotFoundException;
+import org.forgerock.json.resource.PatchRequest;
+import org.forgerock.json.resource.QueryRequest;
+import org.forgerock.json.resource.QueryResourceHandler;
+import org.forgerock.json.resource.QueryResponse;
+import org.forgerock.json.resource.ReadRequest;
 import org.forgerock.json.resource.RequestHandler;
 import org.forgerock.json.resource.ResourceException;
+import org.forgerock.json.resource.ResourceResponse;
 import org.forgerock.json.resource.Router;
+import org.forgerock.json.resource.UpdateRequest;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.services.context.Context;
+import org.forgerock.util.AsyncFunction;
 import org.forgerock.util.Function;
+import org.forgerock.util.promise.Promise;
 
 /**
  * Defines a parent-child relationship between a parent resource and one or more child resource(s). Removal of the
@@ -107,4 +120,98 @@
     final RequestHandler subResourceRouterFrom(final RoutingContext context) {
         return context.getType().getSubResourceRouter();
     }
+
+    abstract Promise<RoutingContext, ResourceException> route(final Context context);
+
+    /**
+     * Responsible for routing requests to sub-resources:
+     * <ul>
+     * <li>of this singleton,</li>
+     * <li>or of instances within a collection<./li>
+     * </ul>
+     * <p>
+     * More specifically, given
+     * <ul>
+     * <li>the URL template /singleton then this handler processes all requests beneath /singleton.</li>
+     * <li>the URL template /collection/{id} then this handler processes all requests beneath /collection/{id},</li>
+     * </ul>
+     */
+    final class SubResourceHandler extends AbstractRequestHandler {
+        @Override
+        public Promise<ActionResponse, ResourceException> handleAction(final Context context,
+                                                                       final ActionRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ActionResponse, ResourceException>() {
+                @Override
+                public Promise<ActionResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleAction(context, request);
+                }
+            });
+        }
+
+        @Override
+        public Promise<ResourceResponse, ResourceException> handleCreate(final Context context,
+                                                                         final CreateRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
+                @Override
+                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleCreate(context, request);
+                }
+            });
+        }
+
+        @Override
+        public Promise<ResourceResponse, ResourceException> handleDelete(final Context context,
+                                                                         final DeleteRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
+                @Override
+                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleDelete(context, request);
+                }
+            });
+        }
+
+        @Override
+        public Promise<ResourceResponse, ResourceException> handlePatch(final Context context,
+                                                                        final PatchRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
+                @Override
+                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handlePatch(context, request);
+                }
+            });
+        }
+
+        @Override
+        public Promise<QueryResponse, ResourceException> handleQuery(final Context context, final QueryRequest request,
+                                                                     final QueryResourceHandler handler) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, QueryResponse, ResourceException>() {
+                @Override
+                public Promise<QueryResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleQuery(context, request, handler);
+                }
+            });
+        }
+
+        @Override
+        public Promise<ResourceResponse, ResourceException> handleRead(final Context context,
+                                                                       final ReadRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
+                @Override
+                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleRead(context, request);
+                }
+            });
+        }
+
+        @Override
+        public Promise<ResourceResponse, ResourceException> handleUpdate(final Context context,
+                                                                         final UpdateRequest request) {
+            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
+                @Override
+                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
+                    return subResourceRouterFrom(context).handleUpdate(context, request);
+                }
+            });
+        }
+    }
 }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceCollection.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceCollection.java
index df9efba..bf79ec4 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceCollection.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceCollection.java
@@ -228,7 +228,7 @@
         return router;
     }
 
-    private Promise<RoutingContext, ResourceException> route(final Context context) {
+    Promise<RoutingContext, ResourceException> route(final Context context) {
         final Connection conn = context.asContext(AuthenticatedConnectionContext.class).getConnection();
         final SearchRequest searchRequest = namingStrategy.createSearchRequest(dnFrom(context), idFrom(context));
         if (searchRequest.getScope().equals(BASE_OBJECT) && !resource.hasSubTypesWithSubResources()) {
@@ -445,87 +445,4 @@
             return SubResource.convert404To400(ERR_UNSUPPORTED_REQUEST_AGAINST_INSTANCE.get());
         }
     }
-
-    /**
-     * Responsible for routing requests to sub-resources of instances within this collection. More specifically, given
-     * the URL template /collection/{id} then this handler processes all requests beneath /collection/{id}.
-     */
-    private final class SubResourceHandler extends AbstractRequestHandler {
-        @Override
-        public Promise<ActionResponse, ResourceException> handleAction(final Context context,
-                                                                       final ActionRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ActionResponse, ResourceException>() {
-                @Override
-                public Promise<ActionResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleAction(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleCreate(final Context context,
-                                                                         final CreateRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleCreate(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleDelete(final Context context,
-                                                                         final DeleteRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleDelete(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handlePatch(final Context context,
-                                                                        final PatchRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handlePatch(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<QueryResponse, ResourceException> handleQuery(final Context context, final QueryRequest request,
-                                                                     final QueryResourceHandler handler) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, QueryResponse, ResourceException>() {
-                @Override
-                public Promise<QueryResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleQuery(context, request, handler);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleRead(final Context context,
-                                                                       final ReadRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleRead(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleUpdate(final Context context,
-                                                                         final UpdateRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleUpdate(context, request);
-                }
-            });
-        }
-    }
 }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceSingleton.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceSingleton.java
index 96d75c9..81a3b65 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceSingleton.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceSingleton.java
@@ -29,14 +29,12 @@
 import org.forgerock.json.resource.ActionResponse;
 import org.forgerock.json.resource.BadRequestException;
 import org.forgerock.json.resource.CreateRequest;
-import org.forgerock.json.resource.DeleteRequest;
 import org.forgerock.json.resource.PatchRequest;
 import org.forgerock.json.resource.QueryRequest;
 import org.forgerock.json.resource.QueryResourceHandler;
 import org.forgerock.json.resource.QueryResponse;
 import org.forgerock.json.resource.ReadRequest;
 import org.forgerock.json.resource.Request;
-import org.forgerock.json.resource.RequestHandler;
 import org.forgerock.json.resource.ResourceException;
 import org.forgerock.json.resource.ResourceResponse;
 import org.forgerock.json.resource.Router;
@@ -134,7 +132,7 @@
         return router;
     }
 
-    private Promise<RoutingContext, ResourceException> route(final Context context) {
+    Promise<RoutingContext, ResourceException> route(final Context context) {
         return newResultPromise(newRoutingContext(context, dnFrom(context), resource));
     }
 
@@ -206,89 +204,4 @@
             return SubResource.convert404To400(ERR_UNSUPPORTED_REQUEST_AGAINST_SINGLETON.get());
         }
     }
-
-
-
-    /**
-     * Responsible for routing requests to sub-resources of this singleton. More specifically, given
-     * the URL template /singleton then this handler processes all requests beneath /singleton.
-     */
-    private final class SubResourceHandler extends AbstractRequestHandler {
-        @Override
-        public Promise<ActionResponse, ResourceException> handleAction(final Context context,
-                                                                       final ActionRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ActionResponse, ResourceException>() {
-                @Override
-                public Promise<ActionResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleAction(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleCreate(final Context context,
-                                                                         final CreateRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleCreate(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleDelete(final Context context,
-                                                                         final DeleteRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleDelete(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handlePatch(final Context context,
-                                                                        final PatchRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handlePatch(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<QueryResponse, ResourceException> handleQuery(final Context context, final QueryRequest request,
-                                                                     final QueryResourceHandler handler) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, QueryResponse, ResourceException>() {
-                @Override
-                public Promise<QueryResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleQuery(context, request, handler);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleRead(final Context context,
-                                                                       final ReadRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleRead(context, request);
-                }
-            });
-        }
-
-        @Override
-        public Promise<ResourceResponse, ResourceException> handleUpdate(final Context context,
-                                                                         final UpdateRequest request) {
-            return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() {
-                @Override
-                public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) {
-                    return subResourceRouterFrom(context).handleUpdate(context, request);
-                }
-            });
-        }
-    }
 }

--
Gitblit v1.10.0