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 */
020package org.apache.directory.api.ldap.extras.extended.ads_impl.storedProcedure;
021
022
023import java.nio.ByteBuffer;
024import java.util.Iterator;
025
026import org.apache.directory.api.asn1.DecoderException;
027import org.apache.directory.api.asn1.ber.Asn1Decoder;
028import org.apache.directory.api.asn1.ber.tlv.BerValue;
029import org.apache.directory.api.asn1.util.Asn1Buffer;
030import org.apache.directory.api.ldap.codec.api.AbstractExtendedOperationFactory;
031import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
032import org.apache.directory.api.ldap.codec.api.LdapApiService;
033import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureParameter;
034import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequest;
035import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequestImpl;
036import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureResponse;
037import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureResponseImpl;
038import org.apache.directory.api.ldap.model.message.ExtendedRequest;
039
040
041/**
042 * An {@link ExtendedOperationFactory} for creating cancel extended request response 
043 * pairs.
044 *
045 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
046 */
047public class StoredProcedureFactory extends AbstractExtendedOperationFactory
048{
049    /**
050     * Creates a new instance of StoredProcedureFactory.
051     *
052     * @param codec The LDAP Service to use
053     */
054    public StoredProcedureFactory( LdapApiService codec )
055    {
056        super( codec, StoredProcedureRequest.EXTENSION_OID );
057    }
058
059
060    /**
061     * {@inheritDoc}
062     */
063    @Override
064    public StoredProcedureRequest newRequest()
065    {
066        return new StoredProcedureRequestImpl();
067    }
068
069
070    /**
071     * {@inheritDoc}
072     */
073    @Override
074    public StoredProcedureRequest newRequest( byte[] value ) throws DecoderException
075    {
076        StoredProcedureRequest storedProcedureRequest = new StoredProcedureRequestImpl();
077
078        decodeValue( storedProcedureRequest, value );
079
080        return storedProcedureRequest;
081    }
082
083
084    /**
085     * {@inheritDoc}
086     */
087    @Override
088    public StoredProcedureResponse newResponse()
089    {
090        return new StoredProcedureResponseImpl();
091    }
092
093
094    /**
095     * {@inheritDoc}
096     */
097    @Override
098    public void decodeValue( ExtendedRequest extendedRequest, byte[] requestValue ) throws DecoderException
099    {
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}