001    /*
002     *  Licensed to the Apache Software Foundation (ASF) under one
003     *  or more contributor license agreements.  See the NOTICE file
004     *  distributed with this work for additional information
005     *  regarding copyright ownership.  The ASF licenses this file
006     *  to you under the Apache License, Version 2.0 (the
007     *  "License"); you may not use this file except in compliance
008     *  with the License.  You may obtain a copy of the License at
009     *  
010     *    http://www.apache.org/licenses/LICENSE-2.0
011     *  
012     *  Unless required by applicable law or agreed to in writing,
013     *  software distributed under the License is distributed on an
014     *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     *  KIND, either express or implied.  See the License for the
016     *  specific language governing permissions and limitations
017     *  under the License. 
018     *  
019     */
020    package org.apache.directory.shared.ldap.message;
021    
022    
023    import java.util.Arrays;
024    
025    import javax.naming.NamingException;
026    import javax.naming.ldap.ExtendedResponse;
027    
028    import org.apache.directory.shared.ldap.codec.MessageTypeEnum;
029    import org.apache.directory.shared.ldap.message.internal.InternalAbstractRequest;
030    import org.apache.directory.shared.ldap.message.internal.InternalExtendedRequest;
031    import org.apache.directory.shared.ldap.message.internal.InternalResultResponse;
032    import org.apache.directory.shared.ldap.util.StringTools;
033    
034    
035    /**
036     * ExtendedRequest implementation.
037     * 
038     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
039     * @version $Rev: 910150 $
040     */
041    public class ExtendedRequestImpl extends InternalAbstractRequest implements InternalExtendedRequest
042    {
043        static final long serialVersionUID = 7916990159044177480L;
044    
045        /** Extended request's Object Identifier or <b>requestName</b> */
046        private String oid;
047    
048        /** Extended request's payload or <b>requestValue</b> */
049        protected byte[] payload;
050    
051        protected InternalResultResponse response;
052    
053    
054        // -----------------------------------------------------------------------
055        // Constructors
056        // -----------------------------------------------------------------------
057    
058        /**
059         * Creates a Lockable ExtendedRequest implementing object used to perform
060         * extended protocol operation on the server.
061         * 
062         * @param id
063         *            the sequential message identifier
064         */
065        public ExtendedRequestImpl(final int id)
066        {
067            super( id, TYPE, true );
068        }
069    
070    
071        // -----------------------------------------------------------------------
072        // ExtendedRequest Interface Method Implementations
073        // -----------------------------------------------------------------------
074    
075        /**
076         * Gets the Object Idendifier corresponding to the extended request type.
077         * This is the <b>requestName</b> portion of the ext. req. PDU.
078         * 
079         * @return the dotted-decimal representation as a String of the OID
080         */
081        public String getOid()
082        {
083            return oid;
084        }
085    
086    
087        /**
088         * Sets the Object Idendifier corresponding to the extended request type.
089         * 
090         * @param oid
091         *            the dotted-decimal representation as a String of the OID
092         */
093        public void setOid( String oid )
094        {
095            this.oid = oid;
096        }
097    
098    
099        /**
100         * Gets the extended request's <b>requestValue</b> portion of the PDU. The
101         * form of the data is request specific and is determined by the extended
102         * request OID.
103         * 
104         * @return byte array of data
105         */
106        public byte[] getPayload()
107        {
108            if ( payload == null )
109            {
110                return null;
111            }
112    
113            final byte[] copy = new byte[ payload.length ];
114            System.arraycopy( payload, 0, copy, 0, payload.length );
115            return copy;
116        }
117    
118    
119        /**
120         * Sets the extended request's <b>requestValue</b> portion of the PDU.
121         * 
122         * @param payload
123         *            byte array of data encapsulating ext. req. parameters
124         */
125        public void setPayload( byte[] payload )
126        {
127            if ( payload != null )
128            {
129                this.payload = new byte[ payload.length ];
130                System.arraycopy( payload, 0, this.payload, 0, payload.length );
131            } else {
132                this.payload = null;
133            }
134        }
135    
136    
137        // ------------------------------------------------------------------------
138        // SingleReplyRequest Interface Method Implementations
139        // ------------------------------------------------------------------------
140    
141        /**
142         * Gets the protocol response message type for this request which produces
143         * at least one response.
144         * 
145         * @return the message type of the response.
146         */
147        public MessageTypeEnum getResponseType()
148        {
149            return RESP_TYPE;
150        }
151    
152    
153        /**
154         * The result containing response for this request.
155         * 
156         * @return the result containing response for this request
157         */
158        public InternalResultResponse getResultResponse()
159        {
160            if ( response == null )
161            {
162                response = new ExtendedResponseImpl( getMessageId() );
163            }
164    
165            return response;
166        }
167    
168    
169        /**
170         * Checks to see if an object equals this ExtendedRequest.
171         * 
172         * @param obj
173         *            the object to be checked for equality
174         * @return true if the obj equals this ExtendedRequest, false otherwise
175         */
176        public boolean equals( Object obj )
177        {
178            if ( obj == this )
179            {
180                return true;
181            }
182    
183            if ( !super.equals( obj ) )
184            {
185                return false;
186            }
187            
188            if ( !( obj instanceof InternalExtendedRequest ) )
189            {
190                return false;
191            }
192    
193            InternalExtendedRequest req = ( InternalExtendedRequest ) obj;
194            if ( oid != null && req.getOid() == null )
195            {
196                return false;
197            }
198    
199            if ( oid == null && req.getOid() != null )
200            {
201                return false;
202            }
203    
204            if ( oid != null && req.getOid() != null )
205            {
206                if ( !oid.equals( req.getOid() ) )
207                {
208                    return false;
209                }
210            }
211    
212            if ( payload != null && req.getPayload() == null )
213            {
214                return false;
215            }
216    
217            if ( payload == null && req.getPayload() != null )
218            {
219                return false;
220            }
221    
222            if ( payload != null && req.getPayload() != null )
223            {
224                if ( !Arrays.equals( payload, req.getPayload() ) )
225                {
226                    return false;
227                }
228            }
229    
230            return true;
231        }
232    
233    
234        /**
235         * Get a String representation of an Extended Request
236         * 
237         * @return an Extended Request String
238         */
239        public String toString()
240        {
241            StringBuffer sb = new StringBuffer();
242    
243            sb.append( "    Extended request\n" );
244            sb.append( "        Request name : '" ).append( oid ).append( "'\n" );
245    
246            if ( oid != null )
247            {
248                sb.append( "        Request value : '" ).append( StringTools.utf8ToString( payload ) ).append( '/' )
249                    .append( StringTools.dumpBytes( payload ) ).append( "'\n" );
250            }
251    
252            return sb.toString();
253        }
254    
255    
256        public String getID()
257        {
258            return getOid();
259        }
260    
261    
262        public byte[] getEncodedValue()
263        {
264            return getPayload();
265        }
266    
267    
268        public ExtendedResponse createExtendedResponse( String id, byte[] berValue, int offset, int length )
269            throws NamingException
270        {
271            return null;
272        }
273    }