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    
021    package org.apache.directory.shared.dsmlv2.reponse;
022    
023    
024    import java.nio.ByteBuffer;
025    
026    import org.apache.directory.shared.asn1.codec.EncoderException;
027    import org.apache.directory.shared.dsmlv2.DsmlDecorator;
028    import org.apache.directory.shared.ldap.codec.LdapResponseCodec;
029    import org.apache.directory.shared.ldap.codec.MessageTypeEnum;
030    import org.dom4j.Element;
031    
032    
033    /**
034     * Class representing Error Response. <br>
035     * <br>
036     * An Error Response has a requestID, a message, and a type which can be :
037     * <ul> 
038     *     <li>NOT_ATTEMPTED,</li>
039     *     <li>COULD_NOT_CONNECT,</li>
040     *     <li>CONNECTION_CLOSED,</li>
041     *     <li>MALFORMED_REQUEST,</li>
042     *     <li>GATEWAY_INTERNAL_ERROR,</li>
043     *     <li>AUTHENTICATION_FAILED,</li>
044     *     <li>UNRESOLVABLE_URI,</li>
045     *     <li>OTHER</li>
046     * </ul>
047     * 
048     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
049     * @version $Rev$, $Date$
050     */
051    public class ErrorResponse extends LdapResponseCodec implements DsmlDecorator
052    {
053        /**
054         * This enum represents the different types of error response
055         *
056         * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
057         * @version $Rev$, $Date$
058         */
059        public enum ErrorResponseType
060        {
061            NOT_ATTEMPTED, COULD_NOT_CONNECT, CONNECTION_CLOSED, MALFORMED_REQUEST, GATEWAY_INTERNAL_ERROR, AUTHENTICATION_FAILED, UNRESOLVABLE_URI, OTHER
062        };
063    
064        /** The type of error response */
065        private ErrorResponseType type;
066    
067        /** The associated message */
068        private String message;
069    
070        /** The request ID */
071        private int requestID;
072    
073    
074        /**
075         * Creates a new instance of ErrorResponse.
076         */
077        public ErrorResponse()
078        {
079        }
080    
081    
082        /**
083         * Creates a new instance of ErrorResponse.
084         *
085         * @param requestID
086         *      the requestID of the response
087         * @param type 
088         *      the type of the response
089         * @param message
090         *      the associated message
091         */
092        public ErrorResponse( int requestID, ErrorResponseType type, String message )
093        {
094            this.requestID = requestID;
095            this.type = type;
096            this.message = message;
097        }
098    
099    
100        /* (non-Javadoc)
101         * @see org.apache.directory.shared.dsmlv2.reponse.DsmlDecorator#toDsml(org.dom4j.Element)
102         */
103        public Element toDsml( Element root )
104        {
105            Element element = root.addElement( "errorResponse" );
106    
107            // RequestID
108            if ( requestID != 0 )
109            {
110                element.addAttribute( "requestID", "" + requestID );
111            }
112    
113            // Type
114            element.addAttribute( "type", getTypeDescr( type ) );
115    
116            // TODO Add Detail
117    
118            if ( ( message != null ) && ( !"".equals( message ) ) )
119            {
120                Element messageElement = element.addElement( "message" );
121                messageElement.addText( message );
122            }
123    
124            return element;
125        }
126    
127    
128        /**
129         * Returns the String associated to the error response type
130         * 
131         * @param type 
132         *      the error response type
133         * @return 
134         *      the corresponding String
135         */
136        public String getTypeDescr( ErrorResponseType type )
137        {
138            if ( type.equals( ErrorResponseType.NOT_ATTEMPTED ) )
139            {
140                return "notAttempted";
141            }
142            else if ( type.equals( ErrorResponseType.COULD_NOT_CONNECT ) )
143            {
144                return "couldNotConnect";
145            }
146            else if ( type.equals( ErrorResponseType.CONNECTION_CLOSED ) )
147            {
148                return "connectionClosed";
149            }
150            else if ( type.equals( ErrorResponseType.MALFORMED_REQUEST ) )
151            {
152                return "malformedRequest";
153            }
154            else if ( type.equals( ErrorResponseType.GATEWAY_INTERNAL_ERROR ) )
155            {
156                return "gatewayInternalError";
157            }
158            else if ( type.equals( ErrorResponseType.AUTHENTICATION_FAILED ) )
159            {
160                return "authenticationFailed";
161            }
162            else if ( type.equals( ErrorResponseType.UNRESOLVABLE_URI ) )
163            {
164                return "unresolvableURI";
165            }
166            else if ( type.equals( ErrorResponseType.OTHER ) )
167            {
168                return "other";
169            }
170            else
171            {
172                return "unknown";
173            }
174        }
175    
176    
177        /**
178         * Gets the message
179         *
180         * @return
181         *      the message
182         */
183        public String getMessage()
184        {
185            return message;
186        }
187    
188    
189        /**
190         * Sets the message
191         *
192         * @param message
193         *      the message to set
194         */
195        public void setMessage( String message )
196        {
197            this.message = message;
198        }
199    
200    
201        /**
202         * Gets the request ID
203         *
204         * @return
205         *      the request ID
206         */
207        public int getRequestID()
208        {
209            return requestID;
210        }
211    
212    
213        /**
214         * Sets the request ID
215         *
216         * @param requestID
217         *      the request ID to set
218         */
219        public void setRequestID( int requestID )
220        {
221            this.requestID = requestID;
222        }
223    
224    
225        /**
226         * Gets the type of error response
227         *
228         * @return
229         *      the type of error response
230         */
231        public ErrorResponseType getType()
232        {
233            return type;
234        }
235    
236    
237        /**
238         * Sets the type of error response
239         *
240         * @param type
241         *      the type of error response to set
242         */
243        public void setType( ErrorResponseType type )
244        {
245            this.type = type;
246        }
247    
248    
249        @Override
250        protected int computeLengthProtocolOp()
251        {
252            return 0;
253        }
254    
255    
256        @Override
257        protected void encodeProtocolOp( ByteBuffer buffer ) throws EncoderException
258        {
259        }
260    
261    
262        @Override
263        public MessageTypeEnum getMessageType()
264        {
265            return null;
266        }
267    
268    
269        @Override
270        public String getMessageTypeName()
271        {
272            return null;
273        }
274    }