changed visibility to prevent leakage of implementation details, provided AbstractPasswordPolicyResponder

git-svn-id: https://svn.apache.org/repos/asf/directory/shared/branches/1.0.0-M23-FP1@1613674 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/template/AbstractPasswordPolicyResponder.java b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/template/AbstractPasswordPolicyResponder.java
new file mode 100755
index 0000000..5251d1b
--- /dev/null
+++ b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/template/AbstractPasswordPolicyResponder.java
@@ -0,0 +1,139 @@
+/*

+ *   Licensed to the Apache Software Foundation (ASF) under one

+ *   or more contributor license agreements.  See the NOTICE file

+ *   distributed with this work for additional information

+ *   regarding copyright ownership.  The ASF licenses this file

+ *   to you 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.apache.directory.ldap.client.template;

+

+

+import org.apache.directory.api.ldap.codec.api.LdapApiService;

+import org.apache.directory.api.ldap.extras.controls.ppolicy.PasswordPolicy;

+import org.apache.directory.api.ldap.extras.controls.ppolicy_impl.PasswordPolicyDecorator;

+import org.apache.directory.api.ldap.model.exception.LdapException;

+import org.apache.directory.api.ldap.model.message.Control;

+import org.apache.directory.api.ldap.model.message.Response;

+import org.apache.directory.api.ldap.model.message.ResultCodeEnum;

+import org.apache.directory.api.ldap.model.message.ResultResponse;

+import org.apache.directory.ldap.client.template.exception.PasswordException;

+

+

+/**

+ * A base, abstract, implementation of <code>PasswordPolicyResponder</code>.  

+ * Extend this class and override {@link #success(PasswordPolicy)}, 

+ * {@link #fail(ResultResponse, PasswordPolicy, ResultCodeEnum)}, or

+ * {@link #exception(LdapException)}.  If that does not offer enough

+ * flexibility, you must implement PasswordPolicyResponder yourself.

+ *

+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>

+ */

+abstract public class AbstractPasswordPolicyResponder implements PasswordPolicyResponder

+{

+    private final PasswordPolicyDecorator passwordPolicyRequestControl;

+

+

+    protected AbstractPasswordPolicyResponder( LdapApiService ldapApiService )

+    {

+        this.passwordPolicyRequestControl = new PasswordPolicyDecorator(

+            ldapApiService );

+    }

+    

+    

+    /**

+     * Translates an <code>LdapException</code> to a 

+     * <code>PasswordException</code> to be thrown when 

+     * {@link #process(PasswordPolicyOperation)} fails.

+     * 

+     * @param e

+     * @return

+     */

+    protected PasswordException exception( LdapException e )

+    {

+        return new PasswordException().setLdapException( e );

+    }

+    

+    

+    /**

+     * Returns an exception to be thrown in the case of a non SUCCESS 

+     * <code>resultCode</code>.

+     * 

+     * @param resultResponse

+     * @param passwordPolicy

+     * @param resultCode

+     * @return

+     */

+    protected PasswordException fail( ResultResponse resultResponse, 

+            PasswordPolicy passwordPolicy, ResultCodeEnum resultCode )

+    {

+        PasswordException exception = new PasswordException();

+        exception.setResultCode( resultCode );

+        if ( passwordPolicy != null

+            && passwordPolicy.getResponse() != null

+            && passwordPolicy.getResponse().getPasswordPolicyError() != null )

+        {

+            exception.setPasswordPolicyError( passwordPolicy.getResponse().getPasswordPolicyError() );

+        }

+        return exception;

+    }

+

+

+    private PasswordPolicy getPasswordPolicy( Response response )

+    {

+        Control control = response.getControls().get( passwordPolicyRequestControl.getOid() );

+        return control == null

+            ? null

+            : ( ( PasswordPolicyDecorator ) control ).getDecorated();

+    }

+

+

+    @Override

+    final public PasswordWarning process( PasswordPolicyOperation operation )

+        throws PasswordException

+    {

+        try

+        {

+            ResultResponse response = operation.process();

+            PasswordPolicy passwordPolicy = getPasswordPolicy( response );

+            ResultCodeEnum resultCode = response.getLdapResult().getResultCode();

+            if ( resultCode == ResultCodeEnum.SUCCESS )

+            {

+                return success( passwordPolicy );

+            }

+            else

+            {

+                throw fail( response, passwordPolicy, resultCode );

+            }

+        }

+        catch ( LdapException e )

+        {

+            throw new PasswordException().setLdapException( e );

+        }

+    }

+    

+    /**

+     * Returns a <code>PasswordWarning</code>, or <code>null</code> if no 

+     * warnings were present in the supplied <code>passwordPolicy</code>.

+     * 

+     * @param passwordPolicy

+     * @return

+     */

+    protected PasswordWarning success( PasswordPolicy passwordPolicy ) 

+    {

+        return passwordPolicy == null

+                ? null

+                : PasswordWarningImpl.newWarning( passwordPolicy );

+    }

+}