Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 53383 invoked from network); 1 Oct 2006 23:08:34 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 1 Oct 2006 23:08:34 -0000 Received: (qmail 76021 invoked by uid 500); 1 Oct 2006 23:08:22 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 75931 invoked by uid 500); 1 Oct 2006 23:08:21 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 75674 invoked by uid 99); 1 Oct 2006 23:08:20 -0000 Received: from idunn.apache.osuosl.org (HELO idunn.apache.osuosl.org) (140.211.166.84) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 01 Oct 2006 16:08:20 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=5.0 tests=ALL_TRUSTED,NO_REAL_NAME Received: from [140.211.166.113] ([140.211.166.113:53139] helo=eris.apache.org) by idunn.apache.osuosl.org (ecelerity 2.1.1.8 r(12930)) with ESMTP id 9B/89-05102-35A40254 for ; Sun, 01 Oct 2006 16:08:04 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id B6AC61A9827; Sun, 1 Oct 2006 16:07:54 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r451836 [6/11] - in /directory/branches/shared/0.9.5/ldap/src: main/java/org/apache/directory/shared/ldap/codec/ main/java/org/apache/directory/shared/ldap/codec/abandon/ main/java/org/apache/directory/shared/ldap/codec/actions/ main/java/o... Date: Sun, 01 Oct 2006 23:07:49 -0000 To: commits@directory.apache.org From: elecharny@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20061001230754.B6AC61A9827@eris.apache.org> X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/MatchedDNAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/MatchedDNAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/MatchedDNAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/MatchedDNAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import javax.naming.InvalidNameException; + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.LdapResponse; +import org.apache.directory.shared.ldap.codec.LdapResult; +import org.apache.directory.shared.ldap.codec.util.LdapResultEnum; +import org.apache.directory.shared.ldap.name.LdapDN; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to set the LdapResult matched DN. + * + * @author Apache Directory Project + */ +public class MatchedDNAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( MatchedDNAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public MatchedDNAction() + { + super( "Store matched DN" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + LdapResponse response = ldapMessage.getLdapResponse(); + LdapResult ldapResult = response.getLdapResult(); + + // Get the Value and store it in the BindResponse + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // We have to handle the special case of a 0 length matched + // DN + if ( tlv.getLength() == 0 ) + { + ldapResult.setMatchedDN( LdapDN.EMPTY_LDAPDN ); + } + else + { + // A not null matchedDN is valid for resultCodes + // NoSuchObject, AliasProblem, InvalidDNSyntax and + // AliasDreferencingProblem. + int resultCode = ldapResult.getResultCode(); + + switch ( resultCode ) + { + case LdapResultEnum.NO_SUCH_OBJECT : + case LdapResultEnum.ALIAS_PROBLEM : + case LdapResultEnum.INVALID_DN_SYNTAX : + case LdapResultEnum.ALIAS_DEREFERENCING_PROBLEM : + byte[] dnBytes = tlv.getValue().getData(); + + try + { + ldapResult.setMatchedDN( new LdapDN( dnBytes ) ); + } + catch ( InvalidNameException ine ) + { + // This is for the client side. We will never decode LdapResult on the server + String msg = "Incorrect DN given : " + StringTools.utf8ToString( dnBytes ) + + " (" + StringTools.dumpBytes( dnBytes ) + + ") is invalid"; + log.error( "{} : {}", msg, ine.getMessage() ); + + throw new DecoderException( "Incorrect DN given : " + ine.getMessage() ); + } + + break; + + default : + log.warn( "The matched DN should not be set when the result code is one of NoSuchObject, AliasProblem, InvalidDNSyntax or AliasDreferencingProblem" ); + ldapResult.setMatchedDN( LdapDN.EMPTY_LDAPDN ); + } + } + + if ( IS_DEBUG ) + { + log.debug( "The matchedDN is " + ldapResult.getMatchedDN() ); + } + + return; + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ModifyAttributeValueAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ModifyAttributeValueAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ModifyAttributeValueAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ModifyAttributeValueAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.modify.ModifyRequest; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a Value to an modifyRequest + * + * @author Apache Directory Project + */ +public class ModifyAttributeValueAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ModifyAttributeValueAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ModifyAttributeValueAction() + { + super( "Stores AttributeValue" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + ModifyRequest modifyRequest = ldapMessage.getModifyRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value. It can't be null + Object value = StringTools.EMPTY_BYTES; + + if ( tlv.getLength() == 0 ) + { + modifyRequest.addAttributeValue( "" ); + } + else + { + value = tlv.getValue().getData(); + + if ( ldapMessageContainer.isBinary( modifyRequest.getCurrentAttributeType() ) ) + { + modifyRequest.addAttributeValue( value ); + } + else + { + modifyRequest.addAttributeValue( StringTools.utf8ToString( ( byte[] ) value ) ); + } + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + if ( IS_DEBUG ) + { + log.debug( "Value modified : {}", value ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ReferralAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ReferralAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ReferralAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ReferralAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import java.util.Iterator; + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.LdapResponse; +import org.apache.directory.shared.ldap.codec.LdapResult; +import org.apache.directory.shared.ldap.codec.util.LdapResultEnum; +import org.apache.directory.shared.ldap.codec.util.LdapURL; +import org.apache.directory.shared.ldap.codec.util.LdapURLEncodingException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to add a referral to a LdapTresult + * + * @author Apache Directory Project + */ +public class ReferralAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ReferralAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ReferralAction() + { + super( "Add a referral" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + LdapResponse response = ldapMessage.getLdapResponse(); + LdapResult ldapResult = response.getLdapResult(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + if ( tlv.getLength() == 0 ) + { + ldapResult.addReferral( LdapURL.EMPTY_URL ); + } + else + { + if ( ldapResult.getResultCode() == LdapResultEnum.REFERRAL ) + { + try + { + ldapResult.addReferral( new LdapURL( tlv.getValue().getData() ) ); + } + catch ( LdapURLEncodingException luee ) + { + String badUrl = new String( tlv.getValue().getData() ); + log.error( "The URL " + badUrl + " is not valid : " + luee.getMessage() ); + throw new DecoderException( "Invalid URL : " + luee.getMessage() ); + } + } + else + { + log.warn( "The Referral error message is not allowed when havind an error code no equals to REFERRAL" ); + ldapResult.addReferral( LdapURL.EMPTY_URL ); + } + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + if ( IS_DEBUG ) + { + Iterator urls = ldapResult.getReferrals().iterator(); + + StringBuffer sb = new StringBuffer(); + boolean isFirst = true; + + while ( urls.hasNext() ) + { + if ( isFirst ) + { + isFirst = false; + } + else + { + sb.append( ", " ); + } + + sb.append( urls.next() ); + } + + log.debug( "The referral error message is set to " + sb.toString() ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.extended.ExtendedResponse; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a Response to an ExtendedResponse + * + * @author Apache Directory Project + */ +public class ResponseAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ResponseAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ResponseAction() + { + super( "Store response" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + + // We can allocate the ExtendedResponse Object + ExtendedResponse extendedResponse = ldapMessage.getExtendedResponse(); + + // Get the Value and store it in the ExtendedResponse + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // We have to handle the special case of a 0 length matched + // OID + if ( tlv.getLength() == 0 ) + { + extendedResponse.setResponse( StringTools.EMPTY_BYTES ); + } + else + { + extendedResponse.setResponse( tlv.getValue().getData() ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + if ( IS_DEBUG ) + { + log.debug( "Extended value : {}", extendedResponse.getResponse() ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseNameAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseNameAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseNameAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResponseNameAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.asn1.primitives.OID; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.extended.ExtendedResponse; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a Response Name to an ExtendedResponse + * + * @author Apache Directory Project + */ +public class ResponseNameAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ResponseNameAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ResponseNameAction() + { + super( "Store response name" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + + // We can allocate the ExtendedResponse Object + ExtendedResponse extendedResponse = ldapMessage.getExtendedResponse(); + + // Get the Value and store it in the ExtendedResponse + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // We have to handle the special case of a 0 length matched + // OID + if ( tlv.getLength() == 0 ) + { + log.error( "The name must not be null" ); + throw new DecoderException( "The name must not be null" ); + } + else + { + extendedResponse + .setResponseName( new OID( StringTools.asciiBytesToString( tlv.getValue().getData() ) ) ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + if ( IS_DEBUG ) + { + log.debug( "OID read : {}", extendedResponse.getResponseName() ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResultCodeAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResultCodeAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResultCodeAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ResultCodeAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.ber.tlv.Value; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.asn1.util.IntegerDecoder; +import org.apache.directory.shared.asn1.util.IntegerDecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.LdapResponse; +import org.apache.directory.shared.ldap.codec.LdapResult; +import org.apache.directory.shared.ldap.codec.util.LdapResultEnum; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to set the LdapResult result code. + * + * @author Apache Directory Project + */ +public class ResultCodeAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ResultCodeAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ResultCodeAction() + { + super( "Store resultCode" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage message = ldapMessageContainer.getLdapMessage(); + LdapResponse response = message.getLdapResponse(); + LdapResult ldapResult = new LdapResult(); + response.setLdapResult( ldapResult ); + + // We don't have to allocate a LdapResult first. + + // The current TLV should be a integer + // We get it and store it in MessageId + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + Value value = tlv.getValue(); + int resultCode = 0; + + try + { + resultCode = IntegerDecoder.parse( value, 0, 90 ); + } + catch ( IntegerDecoderException ide ) + { + log.error( "The result code " + StringTools.dumpBytes( value.getData() ) + " is invalid : " + + ide.getMessage() + ". The result code must be between (0 .. 90)" ); + + throw new DecoderException( ide.getMessage() ); + } + + // Treat the 'normal' cases ! + switch ( resultCode ) + { + case LdapResultEnum.SUCCESS: + case LdapResultEnum.OPERATIONS_ERROR: + case LdapResultEnum.PROTOCOL_ERROR: + case LdapResultEnum.TIME_LIMIT_EXCEEDED: + case LdapResultEnum.SIZE_LIMIT_EXCEEDED: + case LdapResultEnum.COMPARE_FALSE: + case LdapResultEnum.COMPARE_TRUE: + case LdapResultEnum.AUTH_METHOD_NOT_SUPPORTED: + case LdapResultEnum.STRONG_AUTH_REQUIRED: + case LdapResultEnum.REFERRAL: + case LdapResultEnum.ADMIN_LIMIT_EXCEEDED: + case LdapResultEnum.UNAVAILABLE_CRITICAL_EXTENSION: + case LdapResultEnum.CONFIDENTIALITY_REQUIRED: + case LdapResultEnum.SASL_BIND_IN_PROGRESS: + case LdapResultEnum.NO_SUCH_ATTRIBUTE: + case LdapResultEnum.UNDEFINED_ATTRIBUTE_TYPE: + case LdapResultEnum.INAPPROPRIATE_MATCHING: + case LdapResultEnum.CONSTRAINT_VIOLATION: + case LdapResultEnum.ATTRIBUTE_OR_VALUE_EXISTS: + case LdapResultEnum.INVALID_ATTRIBUTE_SYNTAX: + case LdapResultEnum.NO_SUCH_OBJECT: + case LdapResultEnum.ALIAS_PROBLEM: + case LdapResultEnum.INVALID_DN_SYNTAX: + case LdapResultEnum.ALIAS_DEREFERENCING_PROBLEM: + case LdapResultEnum.INAPPROPRIATE_AUTHENTICATION: + case LdapResultEnum.INVALID_CREDENTIALS: + case LdapResultEnum.INSUFFICIENT_ACCESS_RIGHTS: + case LdapResultEnum.BUSY: + case LdapResultEnum.UNAVAILABLE: + case LdapResultEnum.UNWILLING_TO_PERFORM: + case LdapResultEnum.LOOP_DETECT: + case LdapResultEnum.NAMING_VIOLATION: + case LdapResultEnum.OBJECT_CLASS_VIOLATION: + case LdapResultEnum.NOT_ALLOWED_ON_NON_LEAF: + case LdapResultEnum.NOT_ALLOWED_ON_RDN: + case LdapResultEnum.ENTRY_ALREADY_EXISTS: + case LdapResultEnum.AFFECTS_MULTIPLE_DSAS: + ldapResult.setResultCode( resultCode ); + break; + + default: + log.warn( "The resultCode " + resultCode + " is unknown." ); + ldapResult.setResultCode( LdapResultEnum.OTHER ); + } + + if ( IS_DEBUG ) + { + log.debug( "The result code is set to " + LdapResultEnum.errorCode( resultCode ) ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/SearchResultAttributeValueAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/SearchResultAttributeValueAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/SearchResultAttributeValueAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/SearchResultAttributeValueAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.SearchResultEntry; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a Value to an search result entry + * + * @author Apache Directory Project + */ +public class SearchResultAttributeValueAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( SearchResultAttributeValueAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public SearchResultAttributeValueAction() + { + super( "Stores AttributeValue" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + SearchResultEntry searchResultEntry = ldapMessage.getSearchResultEntry(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value + Object value = null; + + if ( tlv.getLength() == 0 ) + { + searchResultEntry.addAttributeValue( "" ); + + log.debug( "The attribute value is null" ); + } + else + { + if ( ldapMessageContainer.isBinary( searchResultEntry.getCurrentAttributeValueType() ) ) + { + value = tlv.getValue().getData(); + + if ( IS_DEBUG ) + { + log.debug( "Attribute value {}", StringTools.dumpBytes( ( byte[] ) value ) ); + } + } + else + { + value = StringTools.utf8ToString( tlv.getValue().getData() ); + + log.debug( "Attribute value {}", value ); + } + + searchResultEntry.addAttributeValue( value ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ServerSASLCredsAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ServerSASLCredsAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ServerSASLCredsAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ServerSASLCredsAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.bind.BindResponse; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a SASL credentials + * + * @author Apache Directory Project + */ +public class ServerSASLCredsAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ServerSASLCredsAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ServerSASLCredsAction() + { + super( "Store server sasl credentials value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + + BindResponse bindResponseMessage = ldapMessageContainer.getLdapMessage().getBindResponse(); + + // Get the Value and store it in the BindRequest + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // We have to handle the special case of a 0 length server + // sasl credentials + if ( tlv.getLength() == 0 ) + { + bindResponseMessage.setServerSaslCreds( StringTools.EMPTY_BYTES ); + } + else + { + bindResponseMessage.setServerSaslCreds( tlv.getValue().getData() ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + if ( IS_DEBUG ) + { + log.debug( "The SASL credentials value is : {}", bindResponseMessage.getServerSaslCreds() + .toString() ); + } + + return; + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreAnyAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreAnyAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreAnyAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreAnyAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.SearchRequest; +import org.apache.directory.shared.ldap.codec.search.SubstringFilter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a any value into a substring filter + * + * @author Apache Directory Project + */ +public class StoreAnyAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( StoreAnyAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public StoreAnyAction() + { + super( "Store a any value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + SearchRequest searchRequest = ldapMessage.getSearchRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value. + SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getTerminalFilter(); + + if ( tlv.getLength() == 0 ) + { + log.error( "The substring any filter is empty" ); + throw new DecoderException( "The substring any filter is empty" ); + } + + String any = new String( tlv.getValue().getData() ); + substringFilter.addAnySubstrings( any ); + + // We now have to get back to the nearest filter which is + // not terminal. + searchRequest.unstackFilters( container ); + + if ( IS_DEBUG ) + { + log.debug( "Stored a any substring : {}", any ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreFinalAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreFinalAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreFinalAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreFinalAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.SearchRequest; +import org.apache.directory.shared.ldap.codec.search.SubstringFilter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a final value into a substring filter + * + * @author Apache Directory Project + */ +public class StoreFinalAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( StoreFinalAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public StoreFinalAction() + { + super( "Store a final value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + SearchRequest searchRequest = ldapMessage.getSearchRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value. + SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getTerminalFilter(); + + if ( tlv.getLength() == 0 ) + { + log.error( "The substring final filter is empty" ); + throw new DecoderException( "The substring final filter is empty" ); + } + + String finalValue = new String( tlv.getValue().getData() ); + substringFilter.setFinalSubstrings( finalValue ); + + // We now have to get back to the nearest filter which is + // not terminal. + searchRequest.unstackFilters( container ); + + if ( IS_DEBUG ) + { + log.debug( "Stored a any substring : {}", finalValue ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreMatchValueAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreMatchValueAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreMatchValueAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreMatchValueAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.ExtensibleMatchFilter; +import org.apache.directory.shared.ldap.codec.search.SearchRequest; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a match value + * + * @author Apache Directory Project + */ +public class StoreMatchValueAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( StoreMatchValueAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public StoreMatchValueAction() + { + super( "Store match Value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + SearchRequest searchRequest = ldapMessage.getSearchRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value. + ExtensibleMatchFilter extensibleMatchFilter = ( ExtensibleMatchFilter ) searchRequest + .getTerminalFilter(); + + String value = StringTools.utf8ToString( tlv.getValue().getData() ); + extensibleMatchFilter.setMatchValue( value ); + + // unstack the filters if needed + searchRequest.unstackFilters( container ); + + if ( IS_DEBUG ) + { + log.debug( "Stored a match value : {}", value ); + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreReferenceAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreReferenceAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreReferenceAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreReferenceAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.SearchResultReference; +import org.apache.directory.shared.ldap.codec.util.LdapURL; +import org.apache.directory.shared.ldap.codec.util.LdapURLEncodingException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a reference into a searchResultReference + * + * @author Apache Directory Project + */ +public class StoreReferenceAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( StoreReferenceAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public StoreReferenceAction() + { + super( "Store a reference" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + + SearchResultReference searchResultReference = ldapMessageContainer.getLdapMessage() + .getSearchResultReference(); + + // Get the Value and store it in the BindRequest + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // We have to handle the special case of a 0 length server + // sasl credentials + LdapURL url = LdapURL.EMPTY_URL; + + if ( tlv.getLength() == 0 ) + { + searchResultReference.addSearchResultReference( url ); + } + else + { + try + { + url = new LdapURL( tlv.getValue().getData() ); + searchResultReference.addSearchResultReference( url ); + } + catch ( LdapURLEncodingException luee ) + { + String badUrl = new String( tlv.getValue().getData() ); + log.error( "The URL {} is not valid : {}", badUrl, luee.getMessage() ); + throw new DecoderException( "Invalid URL : " + luee.getMessage() ); + } + } + + if ( IS_DEBUG ) + { + log.debug( "Search reference URL found : {}", url ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + + return; + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreTypeMatchingRuleAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreTypeMatchingRuleAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreTypeMatchingRuleAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/StoreTypeMatchingRuleAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.asn1.codec.DecoderException; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.search.ExtensibleMatchFilter; +import org.apache.directory.shared.ldap.codec.search.SearchRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a type matching rule + * + * @author Apache Directory Project + */ +public class StoreTypeMatchingRuleAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( StoreTypeMatchingRuleAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public StoreTypeMatchingRuleAction() + { + super( "Store matching type Value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) throws DecoderException + { + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + SearchRequest searchRequest = ldapMessage.getSearchRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + if ( tlv.getLength() == 0 ) + { + log.error( "The type cannot be null in a MacthingRuleAssertion" ); + throw new DecoderException( "The type cannot be null in a MacthingRuleAssertion" ); + } + else + { + // Store the value. + ExtensibleMatchFilter extensibleMatchFilter = ( ExtensibleMatchFilter ) searchRequest + .getTerminalFilter(); + + String type = new String( tlv.getValue().getData() ); + extensibleMatchFilter.setType( type ); + + if ( IS_DEBUG ) + { + log.debug( "Stored a type matching rule : {}", type ); + } + } + } +} Added: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ValueAction.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ValueAction.java?view=auto&rev=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ValueAction.java (added) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/actions/ValueAction.java Sun Oct 1 16:07:44 2006 @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.shared.ldap.codec.actions; + + +import org.apache.directory.shared.asn1.ber.IAsn1Container; +import org.apache.directory.shared.asn1.ber.grammar.GrammarAction; +import org.apache.directory.shared.asn1.ber.tlv.TLV; +import org.apache.directory.shared.ldap.codec.LdapMessage; +import org.apache.directory.shared.ldap.codec.LdapMessageContainer; +import org.apache.directory.shared.ldap.codec.add.AddRequest; +import org.apache.directory.shared.ldap.util.StringTools; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The action used to store a Value to an AddRequest + * + * @author Apache Directory Project + */ +public class ValueAction extends GrammarAction +{ + /** The logger */ + private static final Logger log = LoggerFactory.getLogger( ValueAction.class ); + + /** Speedup for logs */ + private static final boolean IS_DEBUG = log.isDebugEnabled(); + + public ValueAction() + { + super( "Store a value" ); + } + + /** + * The initialization action + */ + public void action( IAsn1Container container ) + { + + LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer ) container; + LdapMessage ldapMessage = ldapMessageContainer.getLdapMessage(); + AddRequest addRequest = ldapMessage.getAddRequest(); + + TLV tlv = ldapMessageContainer.getCurrentTLV(); + + // Store the value. It can't be null + Object value = null; + + if ( tlv.getLength() == 0 ) + { + addRequest.addAttributeValue( "" ); + } + else + { + if ( ldapMessageContainer.isBinary( addRequest.getCurrentAttributeType() ) ) + { + value = tlv.getValue().getData(); + + if ( IS_DEBUG ) + { + log.debug( "Adding value {}", StringTools.dumpBytes( ( byte[] ) value ) ); + } + } + else + { + value = StringTools.utf8ToString( tlv.getValue().getData() ); + + log.debug( "Adding value {}" + value ); + } + + addRequest.addAttributeValue( value ); + } + + // We can have an END transition + ldapMessageContainer.grammarEndAllowed( true ); + } +} Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java?view=diff&rev=451836&r1=451835&r2=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java Sun Oct 1 16:07:44 2006 @@ -20,13 +20,12 @@ package org.apache.directory.shared.ldap.codec.add; -import org.apache.directory.shared.asn1.ber.tlv.Length; +import org.apache.directory.shared.asn1.ber.tlv.TLV; import org.apache.directory.shared.asn1.ber.tlv.UniversalTag; import org.apache.directory.shared.asn1.ber.tlv.Value; import org.apache.directory.shared.asn1.codec.EncoderException; import org.apache.directory.shared.ldap.codec.LdapConstants; import org.apache.directory.shared.ldap.codec.LdapMessage; -import org.apache.directory.shared.ldap.codec.util.LdapString; import org.apache.directory.shared.ldap.name.LdapDN; import org.apache.directory.shared.ldap.util.AttributeUtils; import org.apache.directory.shared.ldap.util.StringTools; @@ -48,10 +47,16 @@ /** - * An AddRequest Message. Its syntax is : AddRequest ::= [APPLICATION 8] - * SEQUENCE { entry LDAPDN, attributes AttributeList } AttributeList ::= - * SEQUENCE OF SEQUENCE { type AttributeDescription, vals SET OF AttributeValue } - * AttributeValue ::= OCTET STRING + * An AddRequest Message. Its syntax is : + * AddRequest ::= [APPLICATION 8] SEQUENCE { + * entry LDAPDN, + * attributes AttributeList } + * + * AttributeList ::= SEQUENCE OF SEQUENCE { + * type AttributeDescription, + * vals SET OF AttributeValue } + * + * AttributeValue ::= OCTET STRING * * @author Apache Directory Project */ @@ -136,32 +141,10 @@ return attributes; } - - /** - * Create a new attributeValue - * - * @param type - * The attribute's name (called 'type' in the grammar) - */ - public void addAttributeType( LdapString type ) - { - // do not create a new attribute if we have seen this attributeType before - if ( attributes.get( type.toString().toLowerCase() ) != null ) - { - currentAttribute = attributes.get( type.toString().toLowerCase() ); - return; - } - - // fix this to use LockableAttributeImpl(type.getString().toLowerCase()) - currentAttribute = new BasicAttribute( type.getString().toLowerCase() ); - attributes.put( currentAttribute ); - } - /** * Create a new attributeValue * - * @param type - * The attribute's name (called 'type' in the grammar) + * @param type The attribute's name (called 'type' in the grammar) */ public void addAttributeType( String type ) { @@ -181,8 +164,7 @@ /** * Add a new value to the current attribute * - * @param value - * The value to be added + * @param value The value to be added */ public void addAttributeValue( Object value ) { @@ -204,8 +186,7 @@ /** * Set the added DN. * - * @param entry - * The entry to set. + * @param entry The entry to set. */ public void setEntry( LdapDN entry ) { @@ -214,19 +195,48 @@ /** - * Compute the AddRequest length AddRequest : 0x68 L1 | +--> 0x04 L2 entry - * +--> 0x30 L3 (attributes) | +--> 0x30 L4-1 (attribute) | | | +--> 0x04 - * L5-1 type | +--> 0x31 L6-1 (values) | | | +--> 0x04 L7-1-1 value | +--> - * ... | +--> 0x04 L7-1-n value | +--> 0x30 L4-2 (attribute) | | | +--> 0x04 - * L5-2 type | +--> 0x31 L6-2 (values) | | | +--> 0x04 L7-2-1 value | +--> - * ... | +--> 0x04 L7-2-n value | +--> ... | +--> 0x30 L4-m (attribute) | - * +--> 0x04 L5-m type +--> 0x31 L6-m (values) | +--> 0x04 L7-m-1 value +--> - * ... +--> 0x04 L7-m-n value + * Compute the AddRequest length + * + * AddRequest : + * + * 0x68 L1 + * | + * +--> 0x04 L2 entry + * +--> 0x30 L3 (attributes) + * | + * +--> 0x30 L4-1 (attribute) + * | | + * | +--> 0x04 L5-1 type + * | +--> 0x31 L6-1 (values) + * | | + * | +--> 0x04 L7-1-1 value + * | +--> ... + * | +--> 0x04 L7-1-n value + * | + * +--> 0x30 L4-2 (attribute) + * | | + * | +--> 0x04 L5-2 type + * | +--> 0x31 L6-2 (values) + * | | + * | +--> 0x04 L7-2-1 value + * | +--> ... + * | +--> 0x04 L7-2-n value + * | + * +--> ... + * | + * +--> 0x30 L4-m (attribute) + * | + * +--> 0x04 L5-m type + * +--> 0x31 L6-m (values) + * | + * +--> 0x04 L7-m-1 value + * +--> ... + * +--> 0x04 L7-m-n value */ public int computeLength() { // The entry - addRequestLength = 1 + Length.getNbBytes( LdapDN.getNbBytes( entry ) ) + LdapDN.getNbBytes( entry ); + addRequestLength = 1 + TLV.getNbBytes( LdapDN.getNbBytes( entry ) ) + LdapDN.getNbBytes( entry ); // The attributes sequence attributesLength = 0; @@ -246,7 +256,7 @@ // Get the type length int idLength = attribute.getID().getBytes().length; - localAttributeLength = 1 + Length.getNbBytes( idLength ) + idLength; + localAttributeLength = 1 + TLV.getNbBytes( idLength ) + idLength; // The values try @@ -264,16 +274,16 @@ if ( value instanceof String ) { int valueLength = StringTools.getBytesUtf8( ( String ) value ).length; - localValuesLength += 1 + Length.getNbBytes( valueLength ) + valueLength; + localValuesLength += 1 + TLV.getNbBytes( valueLength ) + valueLength; } else { int valueLength = ( ( byte[] ) value ).length; - localValuesLength += 1 + Length.getNbBytes( valueLength ) + valueLength; + localValuesLength += 1 + TLV.getNbBytes( valueLength ) + valueLength; } } - localAttributeLength += 1 + Length.getNbBytes( localValuesLength ) + localValuesLength; + localAttributeLength += 1 + TLV.getNbBytes( localValuesLength ) + localValuesLength; } } @@ -283,17 +293,17 @@ } // add the attribute length to the attributes length - attributesLength += 1 + Length.getNbBytes( localAttributeLength ) + localAttributeLength; + attributesLength += 1 + TLV.getNbBytes( localAttributeLength ) + localAttributeLength; attributeLength.add( new Integer( localAttributeLength ) ); valuesLength.add( new Integer( localValuesLength ) ); } } - addRequestLength += 1 + Length.getNbBytes( attributesLength ) + attributesLength; + addRequestLength += 1 + TLV.getNbBytes( attributesLength ) + attributesLength; // Return the result. - int result = 1 + Length.getNbBytes( addRequestLength ) + addRequestLength; + int result = 1 + TLV.getNbBytes( addRequestLength ) + addRequestLength; if ( IS_DEBUG ) { @@ -305,15 +315,28 @@ /** - * Encode the AddRequest message to a PDU. AddRequest : 0x68 LL 0x04 LL - * entry 0x30 LL attributesList 0x30 LL attributeList 0x04 LL - * attributeDescription 0x31 LL attributeValues 0x04 LL attributeValue ... - * 0x04 LL attributeValue ... 0x30 LL attributeList 0x04 LL - * attributeDescription 0x31 LL attributeValue 0x04 LL attributeValue ... - * 0x04 LL attributeValue + * Encode the AddRequest message to a PDU. + * + * AddRequest : + * + * 0x68 LL + * 0x04 LL entry + * 0x30 LL attributesList + * 0x30 LL attributeList + * 0x04 LL attributeDescription + * 0x31 LL attributeValues + * 0x04 LL attributeValue + * ... + * 0x04 LL attributeValue + * ... + * 0x30 LL attributeList + * 0x04 LL attributeDescription + * 0x31 LL attributeValue + * 0x04 LL attributeValue + * ... + * 0x04 LL attributeValue * - * @param buffer - * The buffer where to put the PDU + * @param buffer The buffer where to put the PDU * @return The PDU. */ public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException @@ -327,14 +350,14 @@ { // The AddRequest Tag buffer.put( LdapConstants.ADD_REQUEST_TAG ); - buffer.put( Length.getBytes( addRequestLength ) ); + buffer.put( TLV.getBytes( addRequestLength ) ); // The entry Value.encode( buffer, LdapDN.getBytes( entry ) ); // The attributes sequence buffer.put( UniversalTag.SEQUENCE_TAG ); - buffer.put( Length.getBytes( attributesLength ) ); + buffer.put( TLV.getBytes( attributesLength ) ); // The partial attribute list if ( ( attributes != null ) && ( attributes.size() != 0 ) ) @@ -350,7 +373,7 @@ // The attributes list sequence buffer.put( UniversalTag.SEQUENCE_TAG ); int localAttributeLength = ( ( Integer ) attributeLength.get( attributeNumber ) ).intValue(); - buffer.put( Length.getBytes( localAttributeLength ) ); + buffer.put( TLV.getBytes( localAttributeLength ) ); // The attribute type Value.encode( buffer, attribute.getID() ); @@ -358,7 +381,7 @@ // The values buffer.put( UniversalTag.SET_TAG ); int localValuesLength = ( ( Integer ) valuesLength.get( attributeNumber ) ).intValue(); - buffer.put( Length.getBytes( localValuesLength ) ); + buffer.put( TLV.getBytes( localValuesLength ) ); try { Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddResponse.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddResponse.java?view=diff&rev=451836&r1=451835&r2=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddResponse.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/add/AddResponse.java Sun Oct 1 16:07:44 2006 @@ -23,15 +23,16 @@ import java.nio.BufferOverflowException; import java.nio.ByteBuffer; -import org.apache.directory.shared.asn1.ber.tlv.Length; +import org.apache.directory.shared.asn1.ber.tlv.TLV; import org.apache.directory.shared.asn1.codec.EncoderException; import org.apache.directory.shared.ldap.codec.LdapConstants; import org.apache.directory.shared.ldap.codec.LdapResponse; /** - * An AddResponse Message. Its syntax is : AddResponse ::= [APPLICATION 9] - * LDAPResult + * An AddResponse Message. Its syntax is : + * + * AddResponse ::= [APPLICATION 9] LDAPResult * * @author Apache Directory Project */ @@ -64,22 +65,30 @@ /** - * Compute the AddResponse length AddResponse : 0x69 L1 | +--> LdapResult L1 = - * Length(LdapResult) Length(AddResponse) = Length(0x69) + Length(L1) + L1 + * Compute the AddResponse length + * + * AddResponse : + * + * 0x69 L1 + * | + * +--> LdapResult + * + * L1 = Length(LdapResult) + * + * Length(AddResponse) = Length(0x69) + Length(L1) + L1 */ public int computeLength() { int ldapResponseLength = super.computeLength(); - return 1 + Length.getNbBytes( ldapResponseLength ) + ldapResponseLength; + return 1 + TLV.getNbBytes( ldapResponseLength ) + ldapResponseLength; } /** * Encode the AddResponse message to a PDU. * - * @param buffer - * The buffer where to put the PDU + * @param buffer The buffer where to put the PDU * @return The PDU. */ public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException @@ -93,7 +102,7 @@ { // The tag buffer.put( LdapConstants.ADD_RESPONSE_TAG ); - buffer.put( Length.getBytes( getLdapResponseLength() ) ); + buffer.put( TLV.getBytes( getLdapResponseLength() ) ); } catch ( BufferOverflowException boe ) { Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindRequest.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindRequest.java?view=diff&rev=451836&r1=451835&r2=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindRequest.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindRequest.java Sun Oct 1 16:07:44 2006 @@ -23,7 +23,7 @@ import java.nio.BufferOverflowException; import java.nio.ByteBuffer; -import org.apache.directory.shared.asn1.ber.tlv.Length; +import org.apache.directory.shared.asn1.ber.tlv.TLV; import org.apache.directory.shared.asn1.ber.tlv.Value; import org.apache.directory.shared.asn1.codec.EncoderException; import org.apache.directory.shared.ldap.codec.LdapConstants; @@ -55,10 +55,6 @@ /** The bind request length */ private transient int bindRequestLength; - - // ~ Constructors - // ------------------------------------------------------------------------------- - /** * Creates a new BindRequest object. */ @@ -67,10 +63,6 @@ super(); } - - // ~ Methods - // ------------------------------------------------------------------------------------ - /** * Get the message type * @@ -118,8 +110,7 @@ /** * Set the user authentication * - * @param authentication - * The user authentication + * @param authentication The user authentication */ public void setAuthentication( LdapAuthentication authentication ) { @@ -141,8 +132,7 @@ /** * Set the user name * - * @param name - * The user name + * @param name The user name */ public void setName( LdapDN name ) { @@ -175,8 +165,7 @@ /** * Set the protocol version * - * @param version - * The protocol version + * @param version The protocol version */ public void setVersion( int version ) { @@ -185,34 +174,48 @@ /** - * Compute the BindRequest length BindRequest : 0x60 L1 | +--> 0x02 0x01 - * (1..127) version +--> 0x04 L2 name +--> authentication L2 = Length(name) - * L3/4 = Length(authentication) Length(BindRequest) = Length(0x60) + - * Length(L1) + L1 + Length(0x02) + 1 + 1 + Length(0x04) + Length(L2) + L2 + - * Length(authentication) + * Compute the BindRequest length + * + * BindRequest : + * 0x60 L1 + * | + * +--> 0x02 0x01 (1..127) version + * +--> 0x04 L2 name + * +--> authentication + * + * L2 = Length(name) + * L3/4 = Length(authentication) + * Length(BindRequest) = Length(0x60) + Length(L1) + L1 + Length(0x02) + 1 + 1 + + * Length(0x04) + Length(L2) + L2 + Length(authentication) */ public int computeLength() { bindRequestLength = 1 + 1 + 1; // Initialized with version // The name - bindRequestLength += 1 + Length.getNbBytes( LdapDN.getNbBytes( name ) ) + LdapDN.getNbBytes( name ); + bindRequestLength += 1 + TLV.getNbBytes( LdapDN.getNbBytes( name ) ) + LdapDN.getNbBytes( name ); // The authentication bindRequestLength += authentication.computeLength(); // Return the result. - return 1 + Length.getNbBytes( bindRequestLength ) + bindRequestLength; + return 1 + TLV.getNbBytes( bindRequestLength ) + bindRequestLength; } /** - * Encode the BindRequest message to a PDU. BindRequest : 0x60 LL 0x02 LL - * version 0x04 LL name authentication.encode() 0x80 LL simple / \ 0x83 LL - * mechanism [0x04 LL credential] + * Encode the BindRequest message to a PDU. + * + * BindRequest : * - * @param buffer - * The buffer where to put the PDU + * 0x60 LL + * 0x02 LL version 0x80 LL simple + * 0x04 LL name / + * authentication.encode() + * \ 0x83 LL mechanism [0x04 LL credential] + * + * + * @param buffer The buffer where to put the PDU * @return The PDU. */ public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException @@ -226,7 +229,7 @@ { // The BindRequest Tag buffer.put( LdapConstants.BIND_REQUEST_TAG ); - buffer.put( Length.getBytes( bindRequestLength ) ); + buffer.put( TLV.getBytes( bindRequestLength ) ); } catch ( BufferOverflowException boe ) @@ -280,4 +283,62 @@ return sb.toString(); } + + /* Used only for test perfs + public static void main( String[] args ) throws Exception + { + Asn1Decoder ldapDecoder = new LdapDecoder(); + + ByteBuffer stream = ByteBuffer.allocate( 0x52 ); + stream.put( new byte[] + { + 0x30, 0x50, // LDAPMessage ::=SEQUENCE { + 0x02, 0x01, 0x01, // messageID MessageID + 0x60, 0x2E, // CHOICE { ..., bindRequest BindRequest, ... + // BindRequest ::= APPLICATION[0] SEQUENCE { + 0x02, 0x01, 0x03, // version INTEGER (1..127), + 0x04, 0x1F, // name LDAPDN, + 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a', + 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', + ( byte ) 0x80, 0x08, // authentication AuthenticationChoice + // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING, + // ... + 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', + ( byte ) 0xA0, 0x1B, // A control + 0x30, 0x19, + 0x04, 0x17, + 0x32, 0x2E, 0x31, 0x36, 0x2E, 0x38, 0x34, 0x30, 0x2E, 0x31, 0x2E, 0x31, 0x31, 0x33, 0x37, 0x33, + 0x30, 0x2E, 0x33, 0x2E, 0x34, 0x2E, 0x32 + } ); + + stream.flip(); + + // Allocate a LdapMessage Container + IAsn1Container ldapMessageContainer = new LdapMessageContainer(); + + // Decode the BindRequest PDU + try + { + long t0 = System.currentTimeMillis(); + for ( int i = 0; i < 10000000; i++ ) + { + ldapDecoder.decode( stream, ldapMessageContainer ); + ( ( LdapMessageContainer ) ldapMessageContainer).clean(); + stream.flip(); + } + long t1 = System.currentTimeMillis(); + System.out.println( "Delta = " + ( t1 - t0 ) ); + + ldapDecoder.decode( stream, ldapMessageContainer ); + } + catch ( DecoderException de ) + { + de.printStackTrace(); + } + catch ( NamingException ne ) + { + ne.printStackTrace(); + } + } + */ } Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindResponse.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindResponse.java?view=diff&rev=451836&r1=451835&r2=451836 ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindResponse.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/codec/bind/BindResponse.java Sun Oct 1 16:07:44 2006 @@ -23,16 +23,21 @@ import java.nio.BufferOverflowException; import java.nio.ByteBuffer; -import org.apache.directory.shared.asn1.ber.tlv.Length; +import org.apache.directory.shared.asn1.ber.tlv.TLV; import org.apache.directory.shared.asn1.codec.EncoderException; import org.apache.directory.shared.ldap.codec.LdapConstants; import org.apache.directory.shared.ldap.codec.LdapResponse; /** - * A BindResponse Message. Its syntax is : BindResponse ::= [APPLICATION 1] - * SEQUENCE { COMPONENTS OF LDAPResult, serverSaslCreds [7] OCTET STRING - * OPTIONAL } LdapResult ::= resultCode matchedDN errorMessage (referrals)* + * A BindResponse Message. + * + * Its syntax is : + * BindResponse ::= [APPLICATION 1] SEQUENCE { + * COMPONENTS OF LDAPResult, + * serverSaslCreds [7] OCTET STRING OPTIONAL } + * + * LdapResult ::= resultCode matchedDN errorMessage (referrals)* * * @author Apache Directory Project */ @@ -86,8 +91,7 @@ /** * Set the server sasl credentials * - * @param serverSaslCreds - * The serverSaslCreds to set. + * @param serverSaslCreds The serverSaslCreds to set. */ public void setServerSaslCreds( byte[] serverSaslCreds ) { @@ -96,10 +100,16 @@ /** - * Compute the BindResponse length BindResponse : 0x61 L1 | +--> LdapResult - * +--> [serverSaslCreds] L1 = Length(LdapResult) [ + - * Length(serverSaslCreds) ] Length(BindResponse) = Length(0x61) + - * Length(L1) + L1 + * Compute the BindResponse length + * + * BindResponse : + * 0x61 L1 + * | + * +--> LdapResult + * +--> [serverSaslCreds] + * + * L1 = Length(LdapResult) [ + Length(serverSaslCreds) ] + * Length(BindResponse) = Length(0x61) + Length(L1) + L1 */ public int computeLength() { @@ -109,11 +119,11 @@ if ( serverSaslCreds != null ) { - bindResponseLength += 1 + Length.getNbBytes( ( ( byte[] ) serverSaslCreds ).length ) + bindResponseLength += 1 + TLV.getNbBytes( ( ( byte[] ) serverSaslCreds ).length ) + ( ( byte[] ) serverSaslCreds ).length; } - return 1 + Length.getNbBytes( bindResponseLength ) + bindResponseLength; + return 1 + TLV.getNbBytes( bindResponseLength ) + bindResponseLength; } @@ -121,8 +131,7 @@ * Encode the BindResponse message to a PDU. BindResponse : * LdapResult.encode [0x87 LL serverSaslCreds] * - * @param buffer - * The buffer where to put the PDU + * @param buffer The buffer where to put the PDU * @return The PDU. */ public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException @@ -136,7 +145,7 @@ { // The BindResponse Tag buffer.put( LdapConstants.BIND_RESPONSE_TAG ); - buffer.put( Length.getBytes( bindResponseLength ) ); + buffer.put( TLV.getBytes( bindResponseLength ) ); // The LdapResult super.encode( buffer ); @@ -146,7 +155,7 @@ { buffer.put( ( byte ) LdapConstants.SERVER_SASL_CREDENTIAL_TAG ); - buffer.put( Length.getBytes( ( ( byte[] ) serverSaslCreds ).length ) ); + buffer.put( TLV.getBytes( ( ( byte[] ) serverSaslCreds ).length ) ); if ( ( ( byte[] ) serverSaslCreds ).length != 0 ) {