You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2018/01/17 06:35:44 UTC

[directory-ldap-api] branch master updated: o Made the Decorator interface inherit from Asn1Object, and removed the now useless encode() and computeLength() methods o MessageDecorator and ControlDecorator does not need to implements Asn1Object, has they implement Decorator that now extends Asn1Object o Removed some useless 'implements CodecControl' from some controls, it's already inherited by the XXX interface o OpaqueControl does not need to implements Control as it extends AbstractControl o Added the TransactionSpecification [...]

This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git


The following commit(s) were added to refs/heads/master by this push:
     new e74cf76  o Made the Decorator interface inherit from Asn1Object, and removed the now useless encode() and computeLength() methods o MessageDecorator and ControlDecorator does not need to implements Asn1Object, has they implement Decorator that now extends Asn1Object o Removed some useless 'implements CodecControl<XXX>' from some controls, it's already inherited by the XXX interface o OpaqueControl does not need to implements Control as it extends AbstractControl o Added the Trans [...]
e74cf76 is described below

commit e74cf767777d5511327d2763914a1b61065783a6
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed Jan 17 07:34:57 2018 +0100

    o Made the Decorator interface inherit from Asn1Object, and removed the
    now useless encode() and computeLength() methods
    o MessageDecorator and ControlDecorator does not need to implements
    Asn1Object, has they implement Decorator that now extends Asn1Object
    o Removed some useless 'implements CodecControl<XXX>' from some
    controls, it's already inherited by the XXX interface
    o OpaqueControl does not need to implements Control as it extends
    AbstractControl
    o Added the TransactionSpecification control
    o Some Javadoc formating
---
 .../api/ldap/codec/api/ControlDecorator.java       |  17 +--
 .../directory/api/ldap/codec/api/Decorator.java    |  24 +---
 .../api/ldap/codec/api/MessageDecorator.java       |   3 +-
 .../codec/controls/cascade/CascadeDecorator.java   |   3 +-
 .../api/ldap/extras/controls/ad/AdDirSync.java     |   6 +-
 .../transaction/TransactionSpecification.java      |  46 ++++++++
 .../transaction/TransactionSpecificationImpl.java  |  86 +++++++++++++++
 .../extras/extended/cancel/CancelRequestImpl.java  |   4 +-
 .../controls/ad_impl/AdShowDeletedDecorator.java   |   3 +-
 .../PermissiveModifyDecorator.java                 |   3 +-
 .../TransactionSpecificationDecorator.java         | 122 +++++++++++++++++++++
 .../TransactionSpecificationFactory.java           |  78 +++++++++++++
 .../model/message/AbstractExtendedRequest.java     |   2 +
 .../ldap/model/message/controls/OpaqueControl.java |   2 +-
 .../message/controls/SortResponseControlImpl.java  |   2 +-
 15 files changed, 351 insertions(+), 50 deletions(-)

diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ControlDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ControlDecorator.java
index 0d6a990..cb03e03 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ControlDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ControlDecorator.java
@@ -20,7 +20,6 @@
 package org.apache.directory.api.ldap.codec.api;
 
 
-import org.apache.directory.api.asn1.Asn1Object;
 import org.apache.directory.api.ldap.model.message.Control;
 
 
@@ -33,7 +32,7 @@ import org.apache.directory.api.ldap.model.message.Control;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public abstract class ControlDecorator<E extends Control> implements CodecControl<E>, Asn1Object
+public abstract class ControlDecorator<E extends Control> implements CodecControl<E>
 {
     /** The decorated Control */
     private E decorated;
@@ -176,20 +175,6 @@ public abstract class ControlDecorator<E extends Control> implements CodecContro
 
 
     // ------------------------------------------------------------------------
-    // CodecControl Methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int computeLength()
-    {
-        return 0;
-    }
-
-
-    // ------------------------------------------------------------------------
     // Object Method Overrides
     // ------------------------------------------------------------------------
 
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/Decorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/Decorator.java
index 1a67cbb..eceb716 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/Decorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/Decorator.java
@@ -20,9 +20,7 @@
 package org.apache.directory.api.ldap.codec.api;
 
 
-import java.nio.ByteBuffer;
-
-import org.apache.directory.api.asn1.EncoderException;
+import org.apache.directory.api.asn1.Asn1Object;
 
 
 /**
@@ -33,7 +31,7 @@ import org.apache.directory.api.asn1.EncoderException;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public interface Decorator<E>
+public interface Decorator<E> extends Asn1Object
 {
     /**
      * Gets the object being decorated by this IDecorator.
@@ -44,24 +42,6 @@ public interface Decorator<E>
 
 
     /**
-     * Compute the object length, which is the sum of all inner length.
-     * 
-     * @return The object's computed length
-     */
-    int computeLength();
-
-
-    /**
-     * Encode the object to a PDU.
-     * 
-     * @param buffer The buffer where to put the PDU
-     * @return The PDU.
-     * @throws EncoderException if the buffer can't be encoded
-     */
-    ByteBuffer encode( ByteBuffer buffer ) throws EncoderException;
-
-
-    /**
      * Gets the codec service responsible for managing the encoding and 
      * decoding of the decorated objects.
      * 
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/MessageDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/MessageDecorator.java
index e950a26..133d05f 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/MessageDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/MessageDecorator.java
@@ -23,7 +23,6 @@ package org.apache.directory.api.ldap.codec.api;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.directory.api.asn1.Asn1Object;
 import org.apache.directory.api.ldap.codec.decorators.AbandonRequestDecorator;
 import org.apache.directory.api.ldap.codec.decorators.AddRequestDecorator;
 import org.apache.directory.api.ldap.codec.decorators.AddResponseDecorator;
@@ -76,7 +75,7 @@ import org.apache.directory.api.ldap.model.message.UnbindRequest;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public abstract class MessageDecorator<E extends Message> implements Message, Decorator<E>, Asn1Object
+public abstract class MessageDecorator<E extends Message> implements Message, Decorator<E>
 {
     /** The decorated Control */
     private final E decoratedMessage;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/cascade/CascadeDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/cascade/CascadeDecorator.java
index 53f4149..4bf07df 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/cascade/CascadeDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/cascade/CascadeDecorator.java
@@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
 import org.apache.directory.api.asn1.Asn1Object;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.codec.api.ControlDecorator;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.model.message.controls.Cascade;
@@ -36,7 +35,7 @@ import org.apache.directory.api.ldap.model.message.controls.Cascade;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class CascadeDecorator extends ControlDecorator<Cascade> implements CodecControl<Cascade>, Cascade
+public class CascadeDecorator extends ControlDecorator<Cascade> implements Cascade
 {
     /**
      * Default constructor
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
index a4fc4bb..1986a90 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
@@ -36,19 +36,23 @@ import org.apache.directory.api.ldap.model.message.Control;
  *     controlValue            replControlValue
  *     criticality             TRUE
  * }
+ * </pre>
  * 
  * the control value can be one of the two structures :
  * 
+ * <pre>
  * Client side :
  * realReplControlValue ::= SEQUENCE {
  *     flags                 integer
  *     maxBytes              integer
  *     cookie                OCTET STRING
  * }
+ * </pre>
  * 
  * or
  * 
- * server side :
+ * <pre>
+ * Server side :
  * realReplControlValue ::= SEQUENCE {
  *     flag                  integer
  *     maxReturnLength       integer
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecification.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecification.java
new file mode 100644
index 0000000..7b92207
--- /dev/null
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecification.java
@@ -0,0 +1,46 @@
+/*
+ * 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.api.ldap.extras.controls.transaction;
+
+import org.apache.directory.api.ldap.model.message.Control;
+
+/**
+ * The Transaction Specification control. It's defined in RFC 5805.
+ * This control is sent with every update once a transaction is started.
+ * It contains the Transaction ID. 
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface TransactionSpecification extends Control
+{
+    /** The Transaction Specification control OID */
+    String OID = "1.3.6.1.1.21.2";
+
+    /**
+     * @return The transaction identifier
+     */
+    byte[] getIdentifier();
+    
+    
+    /**
+     * Set the transaction ID
+     * @param The transaction identifier, an opaque byte array
+     */
+    void setIdentifier( byte[] identifier );
+}
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationImpl.java
new file mode 100644
index 0000000..4e9f793
--- /dev/null
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationImpl.java
@@ -0,0 +1,86 @@
+/*
+ * 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.api.ldap.extras.controls.transaction;
+
+import org.apache.directory.api.ldap.model.message.controls.AbstractControl;
+import org.apache.directory.api.util.Strings;
+
+/**
+ * The Transaction Specification control. It's defined in RFC 5805.
+ * This control is sent with every update once a transaction is started.
+ * It contains the Transaction ID. 
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class TransactionSpecificationImpl extends AbstractControl implements TransactionSpecification
+{
+    /** The Transaction Specification identifier */
+    private byte[] identifier;
+
+
+    /**
+     * Default constructor
+     */
+    public TransactionSpecificationImpl()
+    {
+        super( OID );
+    }
+    
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public byte[] getIdentifier()
+    {
+        return identifier;
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setIdentifier( byte[] identifier )
+    {
+        // Copy the byte[]
+        if ( identifier != null )
+        {
+            this.identifier = new byte[identifier.length];
+            System.arraycopy( identifier, 0, this.identifier, 0, identifier.length );
+        }
+    }
+    
+    
+    /**
+     * @see Object#toString()
+     */
+    @Override
+    public String toString()
+    {
+        if ( identifier != null )
+        {
+            return "Transaction specification ID=null";
+        }
+        else
+        {
+            return "Transaction specification ID=" + Strings.dumpBytes( identifier );
+        }
+    }
+}
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/cancel/CancelRequestImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/cancel/CancelRequestImpl.java
index 806077f..f8b11e6 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/cancel/CancelRequestImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/cancel/CancelRequestImpl.java
@@ -28,11 +28,13 @@ import org.apache.directory.api.ldap.model.message.AbstractExtendedRequest;
  * 
  * It's grammar is :
  * 
+ * <pre>
  * cancelRequestValue ::= SEQUENCE {
  *        cancelID        MessageID
  *                        -- MessageID is as defined in [RFC2251]
  * }
- *
+ * </pre>
+ * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
 public class CancelRequestImpl extends AbstractExtendedRequest implements CancelRequest
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdShowDeletedDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdShowDeletedDecorator.java
index b17b374..29a53dc 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdShowDeletedDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdShowDeletedDecorator.java
@@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
 import org.apache.directory.api.asn1.Asn1Object;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.codec.api.ControlDecorator;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.extras.controls.ad.AdShowDeleted;
@@ -36,7 +35,7 @@ import org.apache.directory.api.ldap.extras.controls.ad.AdShowDeleted;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class AdShowDeletedDecorator extends ControlDecorator<AdShowDeleted> implements CodecControl<AdShowDeleted>, AdShowDeleted
+public class AdShowDeletedDecorator extends ControlDecorator<AdShowDeleted> implements AdShowDeleted
 {
     /**
      * Default constructor
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/permissiveModify_impl/PermissiveModifyDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/permissiveModify_impl/PermissiveModifyDecorator.java
index 9ad67ee..07c6713 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/permissiveModify_impl/PermissiveModifyDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/permissiveModify_impl/PermissiveModifyDecorator.java
@@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
 import org.apache.directory.api.asn1.Asn1Object;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.codec.api.ControlDecorator;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.extras.controls.permissiveModify.PermissiveModify;
@@ -36,7 +35,7 @@ import org.apache.directory.api.ldap.extras.controls.permissiveModify.Permissive
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class PermissiveModifyDecorator extends ControlDecorator<PermissiveModify> implements CodecControl<PermissiveModify>, PermissiveModify
+public class PermissiveModifyDecorator extends ControlDecorator<PermissiveModify> implements PermissiveModify
 {
     /**
      * Default constructor
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationDecorator.java
new file mode 100644
index 0000000..a6f3209
--- /dev/null
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationDecorator.java
@@ -0,0 +1,122 @@
+/*
+ *   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.api.ldap.extras.controls.transaction;
+
+import java.nio.ByteBuffer;
+
+import org.apache.directory.api.asn1.Asn1Object;
+import org.apache.directory.api.asn1.DecoderException;
+import org.apache.directory.api.asn1.EncoderException;
+import org.apache.directory.api.ldap.codec.api.ControlDecorator;
+import org.apache.directory.api.ldap.codec.api.LdapApiService;
+
+/**
+ * TransactionSpecification decorator.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class TransactionSpecificationDecorator extends ControlDecorator<TransactionSpecification> implements TransactionSpecification
+{
+    /**
+     * Create a new instance of TransactionSpecificationDecorator
+     * 
+     * @param codec  The LDAP Service to use
+     * @param decoratedControl The control to decorate
+     */
+    public TransactionSpecificationDecorator( LdapApiService codec, TransactionSpecification decoratedControl )
+    {
+        super( codec, decoratedControl );
+    }
+    
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Asn1Object decode( byte[] controlBytes ) throws DecoderException
+    {
+        // Nothing to decode, the byte array is copied as is in identifier
+        setIdentifier( controlBytes );
+        
+        return this;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int computeLength()
+    {
+        byte[] identifier = getDecorated().getIdentifier();
+        
+        if ( identifier != null )
+        {
+            return identifier.length;
+        }
+        else
+        {
+            return -1;
+        }
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        byte[] identifier = getDecorated().getIdentifier();
+        
+        if ( identifier != null )
+        {
+            ByteBuffer encoded = ByteBuffer.allocate( identifier.length );
+            
+            encoded.put( identifier );
+            
+            return encoded;
+        }
+        else
+        {
+            return ByteBuffer.allocate( 0 );
+        }
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public byte[] getIdentifier()
+    {
+        return getDecorated().getIdentifier();
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setIdentifier( byte[] identifier )
+    {
+        getDecorated().setIdentifier( identifier );
+    }
+}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationFactory.java
new file mode 100644
index 0000000..0c8871e
--- /dev/null
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/transaction/TransactionSpecificationFactory.java
@@ -0,0 +1,78 @@
+/*
+ *   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.api.ldap.extras.controls.transaction;
+
+
+import org.apache.directory.api.ldap.codec.api.CodecControl;
+import org.apache.directory.api.ldap.codec.api.ControlFactory;
+import org.apache.directory.api.ldap.codec.api.LdapApiService;
+
+
+/**
+ * A codec {@link ControlFactory} implementation for {@link TransactionSpecification} controls.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class TransactionSpecificationFactory implements ControlFactory<TransactionSpecification>
+{
+    /** The LDAP codec responsible for encoding and decoding Cascade Controls */
+    private LdapApiService codec;
+
+
+    /**
+     * Creates a new instance of TransactionSpecificationFactory.
+     *
+     * @param codec The LDAP codec
+     */
+    public TransactionSpecificationFactory( LdapApiService codec )
+    {
+        this.codec = codec;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getOid()
+    {
+        return TransactionSpecification.OID;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CodecControl<TransactionSpecification> newCodecControl()
+    {
+        return new TransactionSpecificationDecorator( codec, new TransactionSpecificationImpl() );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CodecControl<TransactionSpecification> newCodecControl( TransactionSpecification control )
+    {
+        return new TransactionSpecificationDecorator( codec, control );
+    }
+}
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/AbstractExtendedRequest.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/AbstractExtendedRequest.java
index ec5973a..6699139 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/AbstractExtendedRequest.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/AbstractExtendedRequest.java
@@ -182,10 +182,12 @@ public abstract class AbstractExtendedRequest extends AbstractRequest implements
     public int hashCode()
     {
         int hash = 37;
+        
         if ( oid != null )
         {
             hash = hash * 17 + oid.hashCode();
         }
+        
         hash = hash * 17 + super.hashCode();
 
         return hash;
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/OpaqueControl.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/OpaqueControl.java
index b735d0e..5272999 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/OpaqueControl.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/OpaqueControl.java
@@ -33,7 +33,7 @@ import org.apache.directory.api.util.Strings;
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public final class OpaqueControl extends AbstractControl implements Control
+public final class OpaqueControl extends AbstractControl
 {
     /** The opaque encoded value */
     private byte[] value;
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/SortResponseControlImpl.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/SortResponseControlImpl.java
index 92f2766..99773eb 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/SortResponseControlImpl.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/controls/SortResponseControlImpl.java
@@ -24,7 +24,7 @@ package org.apache.directory.api.ldap.model.message.controls;
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class SortResponseControlImpl extends AbstractControl  implements SortResponse
+public class SortResponseControlImpl extends AbstractControl implements SortResponse
 {
     /** the sort operations result code */
     private SortResultCode result;

-- 
To stop receiving notification emails like this one, please contact
['"commits@directory.apache.org" <co...@directory.apache.org>'].