diff --git a/spring-ldap/src/main/java/org/springframework/ldap/support/LdapUtils.java b/spring-ldap/src/main/java/org/springframework/ldap/support/LdapUtils.java index 50e76bc7..c82382a8 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/support/LdapUtils.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/support/LdapUtils.java @@ -16,11 +16,21 @@ package org.springframework.ldap.support; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import javax.naming.Name; import javax.naming.directory.DirContext; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.ldap.NamingException; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.core.DistinguishedName; +import org.springframework.ldap.transaction.CompensatingTransactionOperationManager; +import org.springframework.ldap.transaction.core.DirContextHolder; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; /** @@ -34,6 +44,16 @@ public abstract class LdapUtils { private static final Log logger = LogFactory.getLog(LdapUtils.class); + public static final String REBIND_METHOD_NAME = "rebind"; + + public static final String BIND_METHOD_NAME = "bind"; + + public static final String RENAME_METHOD_NAME = "rename"; + + public static final String UNBIND_METHOD_NAME = "unbind"; + + public static final String MODIFY_ATTRIBUTES_METHOD_NAME = "modifyAttributes"; + /** * Close the given JNDI Context and ignore any thrown exception. This is * useful for typical finally blocks in JNDI code. @@ -207,4 +227,112 @@ public abstract class LdapUtils { // fallback return new org.springframework.ldap.UncategorizedLdapException(ex); } + + /** + * Get the first parameter in the argument list as a Name. + * + * @param args + * arguments supplied to a ldap operation. + * @return a Name representation of the first argument, or the Name itself + * if it is a name. + */ + public static Name getFirstArgumentAsName(Object[] args) { + Assert.notEmpty(args); + + Object firstArg = args[0]; + return getArgumentAsName(firstArg); + } + + /** + * Get the argument as a Name. + * + * @param arg + * an argument supplied to an Ldap operation. + * @return a Name representation of the argument, or the Name itself if it + * is a Name. + */ + public static Name getArgumentAsName(Object arg) { + if (arg instanceof String) { + return new DistinguishedName((String) arg); + } else if (arg instanceof Name) { + return (Name) arg; + } else { + throw new IllegalArgumentException( + "First argument needs to be a Name or a String representation thereof"); + } + } + + /** + * Close the supplied context, but only if it is not associated with the + * current transaction. + * + * @param context + * the DirContext to close. + * @param contextSource + * the ContextSource bound to the transaction. + * @throws NamingException + */ + public static void doCloseConnection(DirContext context, + ContextSource contextSource) throws javax.naming.NamingException { + DirContextHolder transactionContextHolder = (DirContextHolder) TransactionSynchronizationManager + .getResource(contextSource); + if (transactionContextHolder == null + || transactionContextHolder.getCtx() != context) { + logger.debug("Closing context"); + // This is not the transactional context or the transaction is + // no longer active - we should close it. + context.close(); + } else { + logger.debug("Leaving transactional context open"); + } + } + + /** + * Check whether the supplied method is a method for which transactions is + * supported (and which should be recorded for possible rollback later). + * + * @param methodName + * name of the method to check. + * @return true if this is a supported transaction operation, + * false otherwise. + */ + public static boolean isSupportedWriteTransactionOperation(String methodName) { + return (StringUtils.equals(methodName, BIND_METHOD_NAME) + || StringUtils.equals(methodName, REBIND_METHOD_NAME) + || StringUtils.equals(methodName, RENAME_METHOD_NAME) + || StringUtils + .equals(methodName, MODIFY_ATTRIBUTES_METHOD_NAME) || StringUtils + .equals(methodName, UNBIND_METHOD_NAME)); + + } + + /** + * Perform the specified operation, storing the state prior to the + * operation, to enable commit/rollback later. + * + * @param contextSource + * the ContextSource we are operating on. + * @param method + * name of the method to be invoked. + * @param args + * arguments with which the operation is invoked. + */ + public static void performOperation(ContextSource contextSource, + Method method, Object[] args) throws Throwable { + DirContextHolder transactionContextHolder = (DirContextHolder) TransactionSynchronizationManager + .getResource(contextSource); + if (transactionContextHolder != null) { + + CompensatingTransactionOperationManager transactionDataManager = transactionContextHolder + .getTransactionDataManager(); + transactionDataManager.performOperation(method.getName(), args); + } else { + // Perform the target operation + try { + method.invoke(transactionContextHolder.getCtx(), args); + } catch (InvocationTargetException e) { + throw e.getTargetException(); + } + } + } } diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/BindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/BindOperationRecorder.java index f7e52b3e..8a794b19 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/BindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/BindOperationRecorder.java @@ -19,6 +19,7 @@ import javax.naming.Name; import javax.naming.directory.Attributes; import org.springframework.ldap.core.LdapOperations; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationExecutor; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapCompensatingTransactionOperationFactory.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapCompensatingTransactionOperationFactory.java index 527bfa3e..1079c70d 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapCompensatingTransactionOperationFactory.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapCompensatingTransactionOperationFactory.java @@ -29,6 +29,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.ldap.core.ContextSource; import org.springframework.ldap.core.LdapOperations; import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationFactory; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapUtils.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapUtils.java deleted file mode 100644 index 8182b3c5..00000000 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/LdapUtils.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2002-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.ldap.transaction.core; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import javax.naming.Name; -import javax.naming.NamingException; -import javax.naming.directory.DirContext; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.core.DistinguishedName; -import org.springframework.ldap.transaction.CompensatingTransactionOperationManager; -import org.springframework.transaction.support.TransactionSynchronizationManager; -import org.springframework.util.Assert; - -/** - * Common helper methods for Ldap operations. - * - * @author Mattias Arthursson - */ -public class LdapUtils { - private static Log log = LogFactory.getLog(LdapUtils.class); - - public static final String REBIND_METHOD_NAME = "rebind"; - - public static final String BIND_METHOD_NAME = "bind"; - - public static final String RENAME_METHOD_NAME = "rename"; - - public static final String UNBIND_METHOD_NAME = "unbind"; - - public static final String MODIFY_ATTRIBUTES_METHOD_NAME = "modifyAttributes"; - - /** - * Not to be instantiated. - */ - private LdapUtils() { - } - - /** - * Get the first parameter in the argument list as a Name. - * - * @param args - * arguments supplied to a ldap operation. - * @return a Name representation of the first argument, or the Name itself - * if it is a name. - */ - public static Name getFirstArgumentAsName(Object[] args) { - Assert.notEmpty(args); - - Object firstArg = args[0]; - return getArgumentAsName(firstArg); - } - - /** - * Get the argument as a Name. - * - * @param arg - * an argument supplied to an Ldap operation. - * @return a Name representation of the argument, or the Name itself if it - * is a Name. - */ - public static Name getArgumentAsName(Object arg) { - if (arg instanceof String) { - return new DistinguishedName((String) arg); - } else if (arg instanceof Name) { - return (Name) arg; - } else { - throw new IllegalArgumentException( - "First argument needs to be a Name or a String representation thereof"); - } - } - - /** - * Close the supplied context, but only if it is not associated with the - * current transaction. - * - * @param context - * the DirContext to close. - * @param contextSource - * the ContextSource bound to the transaction. - * @throws NamingException - */ - public static void doCloseConnection(DirContext context, - ContextSource contextSource) throws NamingException { - DirContextHolder transactionContextHolder = (DirContextHolder) TransactionSynchronizationManager - .getResource(contextSource); - if (transactionContextHolder == null - || transactionContextHolder.getCtx() != context) { - log.debug("Closing context"); - // This is not the transactional context or the transaction is - // no longer active - we should close it. - context.close(); - } else { - log.debug("Leaving transactional context open"); - } - } - - /** - * Check whether the supplied method is a method for which transactions is - * supported (and which should be recorded for possible rollback later). - * - * @param methodName - * name of the method to check. - * @return true if this is a supported transaction operation, - * false otherwise. - */ - public static boolean isSupportedWriteTransactionOperation(String methodName) { - return (StringUtils.equals(methodName, BIND_METHOD_NAME) - || StringUtils.equals(methodName, REBIND_METHOD_NAME) - || StringUtils.equals(methodName, RENAME_METHOD_NAME) - || StringUtils - .equals(methodName, MODIFY_ATTRIBUTES_METHOD_NAME) || StringUtils - .equals(methodName, UNBIND_METHOD_NAME)); - - } - - /** - * Perform the specified operation, storing the state prior to the - * operation, to enable commit/rollback later. - * - * @param contextSource - * the ContextSource we are operating on. - * @param method - * name of the method to be invoked. - * @param args - * arguments with which the operation is invoked. - */ - public static void performOperation(ContextSource contextSource, - Method method, Object[] args) throws Throwable { - DirContextHolder transactionContextHolder = (DirContextHolder) TransactionSynchronizationManager - .getResource(contextSource); - if (transactionContextHolder != null) { - - CompensatingTransactionOperationManager transactionDataManager = transactionContextHolder - .getTransactionDataManager(); - transactionDataManager.performOperation(method.getName(), args); - } else { - // Perform the target operation - try { - method.invoke(transactionContextHolder.getCtx(), args); - } catch (InvocationTargetException e) { - throw e.getTargetException(); - } - } - } -} diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ModifyAttributesOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ModifyAttributesOperationRecorder.java index 24209663..3b1ef9d5 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ModifyAttributesOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ModifyAttributesOperationRecorder.java @@ -28,6 +28,7 @@ import javax.naming.directory.ModificationItem; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.LdapOperations; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationExecutor; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder; import org.springframework.util.Assert; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RebindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RebindOperationRecorder.java index 709974c6..e63ddacc 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RebindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RebindOperationRecorder.java @@ -19,6 +19,7 @@ import javax.naming.Name; import javax.naming.directory.Attributes; import org.springframework.ldap.core.LdapOperations; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationExecutor; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RenameOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RenameOperationRecorder.java index fa8ccbf4..1670c179 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RenameOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/RenameOperationRecorder.java @@ -20,6 +20,7 @@ import javax.naming.Name; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.ldap.core.LdapOperations; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationExecutor; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder; import org.springframework.util.Assert; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java index bbad4ac8..de180f75 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import javax.naming.directory.DirContext; import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.support.LdapUtils; /** * Proxy implementation for DirContext, making sure that the instance is not diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/UnbindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/UnbindOperationRecorder.java index 084b20fa..41c0b422 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/UnbindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/UnbindOperationRecorder.java @@ -18,6 +18,7 @@ package org.springframework.ldap.transaction.core; import javax.naming.Name; import org.springframework.ldap.core.LdapOperations; +import org.springframework.ldap.support.LdapUtils; import org.springframework.ldap.transaction.CompensatingTransactionOperationExecutor; import org.springframework.ldap.transaction.CompensatingTransactionOperationRecorder;