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   *     https://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.storedProcedure;
21  
22  
23  import java.nio.ByteBuffer;
24  import java.util.Iterator;
25  
26  import org.apache.directory.api.asn1.DecoderException;
27  import org.apache.directory.api.asn1.ber.Asn1Decoder;
28  import org.apache.directory.api.asn1.ber.tlv.BerValue;
29  import org.apache.directory.api.asn1.util.Asn1Buffer;
30  import org.apache.directory.api.ldap.codec.api.AbstractExtendedOperationFactory;
31  import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
32  import org.apache.directory.api.ldap.codec.api.LdapApiService;
33  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureParameter;
34  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequest;
35  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequestImpl;
36  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureResponse;
37  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureResponseImpl;
38  import org.apache.directory.api.ldap.model.message.ExtendedRequest;
39  
40  
41  /**
42   * An {@link ExtendedOperationFactory} for creating cancel extended request response 
43   * pairs.
44   *
45   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46   */
47  public class StoredProcedureFactory extends AbstractExtendedOperationFactory
48  {
49      /**
50       * Creates a new instance of StoredProcedureFactory.
51       *
52       * @param codec The LDAP Service to use
53       */
54      public StoredProcedureFactory( LdapApiService codec )
55      {
56          super( codec, StoredProcedureRequest.EXTENSION_OID );
57      }
58  
59  
60      /**
61       * {@inheritDoc}
62       */
63      @Override
64      public StoredProcedureRequest newRequest()
65      {
66          return new StoredProcedureRequestImpl();
67      }
68  
69  
70      /**
71       * {@inheritDoc}
72       */
73      @Override
74      public StoredProcedureRequest newRequest( byte[] value ) throws DecoderException
75      {
76          StoredProcedureRequest storedProcedureRequest = new StoredProcedureRequestImpl();
77  
78          decodeValue( storedProcedureRequest, value );
79  
80          return storedProcedureRequest;
81      }
82  
83  
84      /**
85       * {@inheritDoc}
86       */
87      @Override
88      public StoredProcedureResponse newResponse()
89      {
90          return new StoredProcedureResponseImpl();
91      }
92  
93  
94      /**
95       * {@inheritDoc}
96       */
97      @Override
98      public void decodeValue( ExtendedRequest extendedRequest, byte[] requestValue ) throws DecoderException
99      {
100         ByteBuffer bb = ByteBuffer.wrap( requestValue );
101         StoredProcedureRequestContainer container = new StoredProcedureRequestContainer();
102         container.setStoredProcedureRequest( ( StoredProcedureRequest ) extendedRequest ); 
103         Asn1Decoder.decode( bb, container );
104     }
105 
106     
107     private void encodeParameters( Asn1Buffer buffer, Iterator<StoredProcedureParameter> parameters )
108     {
109         if ( parameters.hasNext() )
110         {
111             StoredProcedureParameter parameter = parameters.next();
112             
113             encodeParameters( buffer, parameters );
114             
115             int start = buffer.getPos();
116             
117             // The value
118             BerValue.encodeOctetString( buffer, parameter.getValue() );
119             
120             // The type
121             BerValue.encodeOctetString( buffer, parameter.getType() );
122             
123             // The parameter sequence
124             BerValue.encodeSequence( buffer, start );
125         }
126     }
127 
128 
129     /**
130      * {@inheritDoc}
131      */
132     @Override
133     public void encodeValue( Asn1Buffer buffer, ExtendedRequest extendedRequest )
134     {
135         int start  = buffer.getPos();
136         
137         StoredProcedureRequest storedProcedureRequest = ( StoredProcedureRequest ) extendedRequest; 
138         
139         encodeParameters( buffer, storedProcedureRequest.getParameters().iterator() );
140         
141         // The parameters sequence
142         BerValue.encodeSequence( buffer, start );
143         
144         // The procedure
145         BerValue.encodeOctetString( buffer, storedProcedureRequest.getProcedure() );
146 
147         // The language
148         BerValue.encodeOctetString( buffer, storedProcedureRequest.getLanguage() );
149         
150         // The sequence
151         BerValue.encodeSequence( buffer, start );
152     }
153 }