From f134ef63e016bf13b70bef1ec277603b8a9a6f21 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 25 Apr 2012 11:06:50 +0000
Subject: [PATCH] Fix OPENDJ-474: Remove requirement for clients to deal with InterruptedExceptions in synchronous APIs

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAsynchronousConnection.java |   44 ++++++++++++++++++++++++++++++--------------
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAsynchronousConnection.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAsynchronousConnection.java
index c9827a2..235e173 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAsynchronousConnection.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAsynchronousConnection.java
@@ -27,6 +27,8 @@
 
 package org.forgerock.opendj.ldap;
 
+import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
+
 import org.forgerock.opendj.ldap.requests.AddRequest;
 import org.forgerock.opendj.ldap.requests.BindRequest;
 import org.forgerock.opendj.ldap.requests.CompareRequest;
@@ -57,10 +59,12 @@
      * {@inheritDoc}
      */
     @Override
-    public Result add(final AddRequest request) throws ErrorResultException, InterruptedException {
+    public Result add(final AddRequest request) throws ErrorResultException {
         final FutureResult<Result> future = addAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -71,11 +75,12 @@
      * {@inheritDoc}
      */
     @Override
-    public BindResult bind(final BindRequest request) throws ErrorResultException,
-            InterruptedException {
+    public BindResult bind(final BindRequest request) throws ErrorResultException {
         final FutureResult<BindResult> future = bindAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -86,11 +91,12 @@
      * {@inheritDoc}
      */
     @Override
-    public CompareResult compare(final CompareRequest request) throws ErrorResultException,
-            InterruptedException {
+    public CompareResult compare(final CompareRequest request) throws ErrorResultException {
         final FutureResult<CompareResult> future = compareAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -101,11 +107,12 @@
      * {@inheritDoc}
      */
     @Override
-    public Result delete(final DeleteRequest request) throws ErrorResultException,
-            InterruptedException {
+    public Result delete(final DeleteRequest request) throws ErrorResultException {
         final FutureResult<Result> future = deleteAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -117,11 +124,12 @@
      */
     @Override
     public <R extends ExtendedResult> R extendedRequest(final ExtendedRequest<R> request,
-            final IntermediateResponseHandler handler) throws ErrorResultException,
-            InterruptedException {
+            final IntermediateResponseHandler handler) throws ErrorResultException {
         final FutureResult<R> future = extendedRequestAsync(request, handler, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -132,11 +140,12 @@
      * {@inheritDoc}
      */
     @Override
-    public Result modify(final ModifyRequest request) throws ErrorResultException,
-            InterruptedException {
+    public Result modify(final ModifyRequest request) throws ErrorResultException {
         final FutureResult<Result> future = modifyAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -147,11 +156,12 @@
      * {@inheritDoc}
      */
     @Override
-    public Result modifyDN(final ModifyDNRequest request) throws ErrorResultException,
-            InterruptedException {
+    public Result modifyDN(final ModifyDNRequest request) throws ErrorResultException {
         final FutureResult<Result> future = modifyDNAsync(request, null, null);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
@@ -163,14 +173,20 @@
      */
     @Override
     public Result search(final SearchRequest request, final SearchResultHandler handler)
-            throws ErrorResultException, InterruptedException {
+            throws ErrorResultException {
         final FutureResult<Result> future = searchAsync(request, null, handler);
         try {
             return future.get();
+        } catch (InterruptedException e) {
+            throw interrupted(e);
         } finally {
             // Cancel the request if it hasn't completed.
             future.cancel(false);
         }
     }
 
+    // Handle thread interruption.
+    private ErrorResultException interrupted(InterruptedException e) {
+        return newErrorResult(ResultCode.CLIENT_SIDE_USER_CANCELLED, e);
+    }
 }

--
Gitblit v1.10.0