From d28b40a9868880bfeb999250eb7ca6fc731e6a87 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 28 Jun 2016 21:19:00 +0000
Subject: [PATCH] OPENDJ-3186 Improve API version support in admin and rest2ldap endpoints

---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java
index f67ee7d..182bd30 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java
@@ -40,6 +40,7 @@
 import static org.forgerock.opendj.rest2ldap.Rest2Ldap.*;
 import static org.forgerock.opendj.rest2ldap.Rest2ldapMessages.*;
 import static org.forgerock.opendj.rest2ldap.Utils.newJsonValueException;
+import static org.forgerock.util.Utils.joinAsString;
 import static org.forgerock.util.time.Duration.duration;
 
 import java.io.BufferedReader;
@@ -64,14 +65,19 @@
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.json.JsonValue;
+import org.forgerock.json.resource.BadRequestException;
+import org.forgerock.json.resource.Request;
 import org.forgerock.json.resource.RequestHandler;
+import org.forgerock.json.resource.ResourceException;
 import org.forgerock.json.resource.Router;
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.LDAPConnectionFactory;
 import org.forgerock.opendj.ldap.SSLContextBuilder;
 import org.forgerock.opendj.ldap.requests.BindRequest;
 import org.forgerock.opendj.ldap.requests.Requests;
+import org.forgerock.services.context.Context;
 import org.forgerock.util.Options;
+import org.forgerock.util.promise.Promise;
 import org.forgerock.util.time.Duration;
 
 /** Provides core factory methods and builders for constructing Rest2Ldap endpoints from JSON configuration. */
@@ -209,7 +215,6 @@
      */
     public static Router configureEndpoint(final File endpointDirectory, final Options options) throws IOException {
         final Router versionRouter = new Router();
-
         final File[] endpointVersions = endpointDirectory.listFiles(new FileFilter() {
             @Override
             public boolean accept(final File pathname) {
@@ -221,6 +226,8 @@
             throw new LocalizedIllegalArgumentException(ERR_INVALID_ENDPOINT_DIRECTORY.get(endpointDirectory));
         }
 
+        final List<String> supportedVersions = new ArrayList<>();
+        boolean hasWildCardVersion = false;
         for (final File endpointVersion : endpointVersions) {
             final JsonValue mappingConfig = readJson(endpointVersion);
             final String version = mappingConfig.get("version").defaultTo("*").asString();
@@ -234,13 +241,24 @@
 
             if (version.equals("*")) {
                 versionRouter.setDefaultRoute(handler);
+                hasWildCardVersion = true;
             } else {
                 versionRouter.addRoute(version(version), handler);
+                supportedVersions.add(version);
             }
-
             logger.debug(INFO_REST2LDAP_CREATING_ENDPOINT.get(endpointDirectory.getName(), version));
         }
-
+        if (!hasWildCardVersion) {
+            versionRouter.setDefaultRoute(new AbstractRequestHandler() {
+                @Override
+                protected <V> Promise<V, ResourceException> handleRequest(Context context, Request request) {
+                    final String message = ERR_BAD_API_RESOURCE_VERSION.get(request.getResourceVersion(),
+                                                                            joinAsString(", ", supportedVersions))
+                                                                       .toString();
+                    return new BadRequestException(message).asPromise();
+                }
+            });
+        }
         return versionRouter;
     }
 

--
Gitblit v1.10.0