View Javadoc
1   /*
2    *   Licensed to the Apache Software Foundation (ASF) under one
3    *   or more contributor license agreements.  See the NOTICE file
4    *   distributed with this work for additional information
5    *   regarding copyright ownership.  The ASF licenses this file
6    *   to you under the Apache License, Version 2.0 (the
7    *   "License"); you may not use this file except in compliance
8    *   with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *   Unless required by applicable law or agreed to in writing,
13   *   software distributed under the License is distributed on an
14   *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *   KIND, either express or implied.  See the License for the
16   *   specific language governing permissions and limitations
17   *   under the License.
18   *
19   */
20  package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI;
21  
22  
23  import java.io.PrintWriter;
24  import java.io.StringWriter;
25  import java.nio.ByteBuffer;
26  
27  import org.apache.directory.api.asn1.DecoderException;
28  import org.apache.directory.api.asn1.ber.Asn1Decoder;
29  import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
30  import org.apache.directory.api.ldap.codec.api.ExtendedResponseDecorator;
31  import org.apache.directory.api.ldap.codec.api.LdapApiService;
32  import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequest;
33  import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequestImpl;
34  import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse;
35  import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponseImpl;
36  import org.apache.directory.api.ldap.model.message.ExtendedRequest;
37  import org.apache.directory.api.ldap.model.message.ExtendedResponse;
38  import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
39  
40  
41  /**
42   * An {@link ExtendedOperationFactory} for creating WhoAmI extended request response 
43   * pairs.
44   *
45   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46   */
47  public class WhoAmIFactory implements ExtendedOperationFactory
48  {
49      private LdapApiService codec;
50  
51  
52      /**
53       * Creates a new instance of WhoAmIFactory.
54       *
55       * @param codec The codec for this factory.
56       */
57      public WhoAmIFactory( LdapApiService codec )
58      {
59          this.codec = codec;
60      }
61  
62  
63      /**
64       * {@inheritDoc}
65       */
66      @Override
67      public String getOid()
68      {
69          return WhoAmIRequest.EXTENSION_OID;
70      }
71  
72  
73      /**
74       * {@inheritDoc}
75       */
76      @Override
77      public WhoAmIResponse newResponse( byte[] encodedValue ) throws DecoderException
78      {
79          WhoAmIResponseDecorator response = new WhoAmIResponseDecorator( codec,
80              new WhoAmIResponseImpl() );
81          response.setResponseValue( encodedValue );
82          return response;
83      }
84  
85  
86      /**
87       * {@inheritDoc}
88       */
89      @Override
90      public WhoAmIRequest newRequest( byte[] value )
91      {
92          WhoAmIRequestDecorator req = new WhoAmIRequestDecorator( codec, new WhoAmIRequestImpl() );
93  
94          if ( value != null )
95          {
96              req.setRequestValue( value );
97          }
98  
99          return req;
100     }
101 
102 
103     /**
104      * {@inheritDoc}
105      */
106     @Override
107     public WhoAmIRequestDecorator decorate( ExtendedRequest modelRequest )
108     {
109         if ( modelRequest instanceof WhoAmIRequestDecorator )
110         {
111             return ( WhoAmIRequestDecorator ) modelRequest;
112         }
113 
114         return new WhoAmIRequestDecorator( codec, ( WhoAmIRequest ) modelRequest );
115     }
116 
117 
118     /**
119      * {@inheritDoc}
120      */
121     @Override
122     public WhoAmIResponseDecorator decorate( ExtendedResponse decoratedResponse )
123     {
124         if ( decoratedResponse instanceof WhoAmIResponseDecorator )
125         {
126             return ( WhoAmIResponseDecorator ) decoratedResponse;
127         }
128 
129         if ( decoratedResponse instanceof WhoAmIResponse )
130         {
131             return new WhoAmIResponseDecorator( codec, ( WhoAmIResponse ) decoratedResponse );
132         }
133 
134         // It's an opaque extended operation
135         @SuppressWarnings("unchecked")
136         ExtendedResponseDecorator<ExtendedResponse> response = ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
137 
138         // Decode the response, as it's an opaque operation
139         Asn1Decoder decoder = new Asn1Decoder();
140 
141         byte[] value = response.getResponseValue();
142         ByteBuffer buffer = ByteBuffer.wrap( value );
143 
144         WhoAmIResponseContainer container = new WhoAmIResponseContainer();
145         WhoAmIResponse whoAmIResponse = null;
146 
147         try
148         {
149             decoder.decode( buffer, container );
150 
151             whoAmIResponse = container.getWhoAmIResponse();
152 
153             // Now, update the created response with what we got from the extendedResponse
154             whoAmIResponse.getLdapResult().setResultCode( response.getLdapResult().getResultCode() );
155             whoAmIResponse.getLdapResult().setDiagnosticMessage( response.getLdapResult().getDiagnosticMessage() );
156             whoAmIResponse.getLdapResult().setMatchedDn( response.getLdapResult().getMatchedDn() );
157             whoAmIResponse.getLdapResult().setReferral( response.getLdapResult().getReferral() );
158         }
159         catch ( DecoderException de )
160         {
161             StringWriter sw = new StringWriter();
162             de.printStackTrace( new PrintWriter( sw ) );
163             String stackTrace = sw.toString();
164 
165             // Error while decoding the value. 
166             whoAmIResponse = new WhoAmIResponseImpl(
167                 decoratedResponse.getMessageId(),
168                 ResultCodeEnum.OPERATIONS_ERROR,
169                 stackTrace );
170         }
171 
172         return new WhoAmIResponseDecorator( codec, whoAmIResponse );
173     }
174 }