From commits-return-9645-apmail-directory-commits-archive=directory.apache.org@directory.apache.org Tue Aug 01 23:36:01 2006 Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 7294 invoked from network); 1 Aug 2006 23:36:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 1 Aug 2006 23:36:00 -0000 Received: (qmail 67245 invoked by uid 500); 1 Aug 2006 23:35:59 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 67201 invoked by uid 500); 1 Aug 2006 23:35:59 -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 67186 invoked by uid 99); 1 Aug 2006 23:35:59 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Aug 2006 16:35:59 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Aug 2006 16:35:53 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 9B4A81A9820; Tue, 1 Aug 2006 16:35:33 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r427793 [3/6] - in /directory/branches/shared/0.9.5: asn1/src/main/java/org/apache/directory/shared/asn1/ber/ asn1/src/main/java/org/apache/directory/shared/asn1/ber/grammar/ ldap/ ldap/src/main/antlr/ ldap/src/main/java/org/apache/director... Date: Tue, 01 Aug 2006 23:35:23 -0000 To: commits@directory.apache.org From: elecharny@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060801233533.9B4A81A9820@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/LockableAttributesImpl.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/LockableAttributesImpl.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/LockableAttributesImpl.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/LockableAttributesImpl.java Tue Aug 1 16:35:20 2006 @@ -17,16 +17,18 @@ package org.apache.directory.shared.ldap.message; +import java.io.Serializable; import java.util.Map; import java.util.HashMap; import java.util.Iterator; -import javax.naming.NamingException; import javax.naming.NamingEnumeration; +import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttribute; -import org.apache.directory.shared.ldap.util.ExceptionUtils; +import org.apache.directory.shared.ldap.util.StringTools; /** @@ -35,13 +37,108 @@ * @author Apache Directory Project * @version $Rev$ */ -public class LockableAttributesImpl implements Attributes +public class LockableAttributesImpl implements Attributes, Serializable { - static final long serialVersionUID = -69864533495992471L; - - /** Map of user provided String ids to Attributes */ - private final Map map = new HashMap(); + static transient final long serialVersionUID = -69864533495992471L; + /** + * An holder to store couples + * + */ + private class Holder implements Serializable, Cloneable + { + static transient final long serialVersionUID = 1L; + + private String upId; + private Attribute attribute; + + private Holder( String upId, Attribute attribute ) + { + this.upId = upId; + this.attribute = attribute; + } + + public Object clone() throws CloneNotSupportedException + { + Holder clone = (Holder)super.clone(); + + clone.upId = upId; + clone.attribute = (Attribute)attribute.clone(); + + return clone; + } + + public String toString() + { + StringBuffer sb = new StringBuffer(); + + sb.append( upId ).append( ": " ); + + sb.append( attribute ).append( '\n' ); + + return sb.toString(); + } + } + + /** + * An iterator which returns Attributes. + */ + public class AttributeIterator implements Iterator + { + private Iterator iterator; + + private AttributeIterator( LockableAttributesImpl attributes ) + { + iterator = attributes.keyMap.values().iterator(); + } + + /** + * Returns true if the iteration has more elements. (In other + * words, returns true if next would return an element + * rather than throwing an exception.) + * + * @return true if the iterator has more elements. + */ + public boolean hasNext() + { + return iterator.hasNext(); + } + + /** + * Returns the next element in the iteration. Calling this method + * repeatedly until the {@link #hasNext()} method returns false will + * return each element in the underlying collection exactly once. + * + * @return the next element in the iteration. + * @exception NoSuchElementException iteration has no more elements. + */ + public Object next() + { + return ((Holder)iterator.next()).attribute; + } + + /** + * + * Removes from the underlying collection the last element returned by the + * iterator (optional operation). This method can be called only once per + * call to next. The behavior of an iterator is unspecified if + * the underlying collection is modified while the iteration is in + * progress in any way other than by calling this method. + * + * @exception UnsupportedOperationException if the remove + * operation is not supported by this Iterator. + + * @exception IllegalStateException if the next method has not + * yet been called, or the remove method has already + * been called after the last call to the next + * method. + */ + public void remove() + { + iterator.remove(); + } + } + /** Cache of lowercase id Strings to mixed cased user provided String ids */ private Map keyMap; @@ -58,32 +155,87 @@ keyMap = new HashMap(); } - - /** - * Used by clone to create a LockableAttributes. - * - * @param map - * the primary user provided id to Attribute Map - * @param keyMap - * the canonical key to user provided id Map - */ - private LockableAttributesImpl(Map map, Map keyMap) + // ------------------------------------------------------------------------ + // Serialization methods + // + // We will try to minimize the cost of reading and writing objects to the + // disk. + // + // We need to save all the attributes stored into the 'map' object, and + // their associated User Provided value. + // Attributes are stored following this pattern : + // ( attributeType = (attribute value )* )* + // + // The streamed value will looks like : + // [nbAttrs:int] + // ( + // [length attributeType(i):int] [attributeType(i):String] + // [length attributeTypeUP(i):int] [attributeTypeUP(i):String] + // [attributeValues(i)] + // )* + // + // The attribute value is streamed by the LockableAttributeImpl class. + // ------------------------------------------------------------------------ + /*public void readObject( ObjectInputStream oi ) throws IOException, ClassNotFoundException { - this.keyMap = new HashMap(); - - if ( keyMap != null ) - { - this.keyMap.putAll( keyMap ); - } - - Iterator list = map.values().iterator(); - while ( list.hasNext() ) - { - Attribute attr = ( Attribute ) list.next(); - this.map.put( attr.getID(), attr.clone() ); - } - } - + oi.defaultReadObject(); + + // Read the map size + int size = oi.readInt(); + + keyMap = new HashMap( size ); + + for ( int i = 0; i < size(); i++ ) + { + int keySize = oi.readInt(); + char[] keyChars = new char[keySize]; + + for ( int j = 0; j < keySize; j++) + { + keyChars[j] = oi.readChar(); + } + + String upId = new String( keyChars ); + String key = upId.toLowerCase(); + + Attribute attribute = (LockableAttributeImpl)oi.readObject(); + + Holder holder = new Holder( upId, attribute); + + keyMap.put( key, holder ); + } + }*/ + + /** + * Write the Attribute to a stream + */ + /*private void writeObject( ObjectOutputStream oo ) throws IOException + { + oo.defaultWriteObject(); + + // Write the map size + oo.write( keyMap.size() ); + + Iterator keys = keyMap.keySet().iterator(); + + while ( keys.hasNext() ) + { + String key = (String)keys.next(); + Holder holder = (Holder)keyMap.get( key ); + + // Write the userProvided key + // No need to write the key, it will be + // rebuilt by the read operation + oo.write( holder.upId.length() ); + oo.writeChars( holder.upId ); + + // Recursively call the writeExternal metho + // of the attribute object + oo.writeObject( holder.attribute ); + } + + // That's it ! + }*/ // ------------------------------------------------------------------------ // javax.naming.directory.Attributes Interface Method Implementations @@ -108,7 +260,7 @@ */ public int size() { - return map.size(); + return keyMap.size(); } @@ -126,14 +278,15 @@ */ public Attribute get( String attrId ) { - String key = getUserProvidedId( attrId ); - - if ( key == null ) - { - return null; - } - - return ( Attribute ) map.get( key ); + if ( attrId != null ) + { + Holder holder = (Holder)keyMap.get( StringTools.toLowerCase( attrId ) ); + return holder != null ? holder.attribute : null; + } + else + { + return null; + } } @@ -149,7 +302,7 @@ */ public NamingEnumeration getAll() { - return new IteratorNamingEnumeration( map.values().iterator() ); + return new IteratorNamingEnumeration( new AttributeIterator( this ) ); } @@ -165,7 +318,17 @@ */ public NamingEnumeration getIDs() { - return new ArrayNamingEnumeration( map.keySet().toArray() ); + String[] ids = new String[keyMap.size()]; + + Iterator values = keyMap.values().iterator(); + int i = 0; + + while ( values.hasNext() ) + { + ids[i++] = ((Holder)values.next()).upId; + } + + return new ArrayNamingEnumeration( ids ); } @@ -185,14 +348,11 @@ */ public Attribute put( String attrId, Object val ) { - if ( get( attrId ) == null ) - { - setUserProvidedId( attrId ); - } - Attribute attr = new LockableAttributeImpl( attrId ); attr.add( val ); - map.put( attrId, attr ); + + String key = StringTools.toLowerCase( attrId ); + keyMap.put( key, new Holder( attrId, attr) ); return attr; } @@ -205,25 +365,45 @@ * the character case of its attribute ids, the case of attr's * identifier is ignored. * @return The Attribute with the same ID as attr that was previous in this - * attribute set; null if no such attribute existed. + * attribute set; The new attr if no such attribute existed. * @see #remove */ public Attribute put( Attribute attr ) { - Attribute old = get( attr.getID() ); - - if ( old != null ) - { - map.remove( old.getID() ); - - if ( keyMap != null ) - { - keyMap.remove( old.getID().toLowerCase() ); - } + String key = StringTools.toLowerCase( attr.getID() ); + Attribute old = null; + Attribute newAttr = attr; + + if ( keyMap.containsKey( key ) ) + { + old = (Attribute)((Holder)keyMap.remove( key )).attribute; + } + else + { + old = attr; + } + + if ( attr instanceof BasicAttribute ) + { + newAttr = new LockableAttributeImpl( attr.getID() ); + + try + { + NamingEnumeration values = attr.getAll(); + + while ( values.hasMore() ) + { + Object value = values.next(); + newAttr.add( value ); + } + } + catch ( NamingException ne ) + { + // do nothing + } } - - map.put( attr.getID(), attr ); - setUserProvidedId( attr.getID() ); + + keyMap.put( key, new Holder( attr.getID(), newAttr ) ); return old; } @@ -241,16 +421,17 @@ */ public Attribute remove( String attrId ) { - Attribute old = get( attrId ); - - if ( old != null ) - { - map.remove( old.getID() ); - - if ( keyMap != null ) - { - keyMap.remove( old.getID().toLowerCase() ); - } + String key = StringTools.toLowerCase( attrId ); + Attribute old = null; + + if ( keyMap.containsKey( key ) ) + { + Holder holder = (Holder)keyMap.remove( key ); + + if ( holder != null ) + { + old = holder.attribute; + } } return old; @@ -265,7 +446,27 @@ */ public Object clone() { - return new LockableAttributesImpl( map, keyMap ); + try + { + LockableAttributesImpl clone = (LockableAttributesImpl)super.clone(); + + clone.keyMap = (Map)((HashMap)keyMap).clone(); + + Iterator keys = keyMap.keySet().iterator(); + + while ( keys.hasNext() ) + { + String key = (String)keys.next(); + Holder holder = (Holder)keyMap.get( key ); + clone.keyMap.put( key, holder.clone() ); + } + + return clone; + } + catch ( CloneNotSupportedException cnse ) + { + return null; + } } @@ -278,27 +479,16 @@ { StringBuffer buf = new StringBuffer(); - Iterator attrs = map.values().iterator(); + Iterator attrs = keyMap.values().iterator(); + while ( attrs.hasNext() ) { - Attribute l_attr = ( Attribute ) attrs.next(); + Holder holder = (Holder)attrs.next(); + Attribute attr = holder.attribute; - try - { - NamingEnumeration l_values = l_attr.getAll(); - while ( l_values.hasMore() ) - { - Object l_value = l_values.next(); - buf.append( l_attr.getID() ); - buf.append( ": " ); - buf.append( l_value ); - buf.append( '\n' ); - } - } - catch ( NamingException e ) - { - buf.append( ExceptionUtils.getFullStackTrace( e ) ); - } + buf.append( holder.upId ); + buf.append( ": " ); + buf.append( attr ); } return buf.toString(); @@ -340,6 +530,7 @@ } NamingEnumeration list = attrs.getAll(); + while ( list.hasMoreElements() ) { Attribute attr = ( Attribute ) list.nextElement(); @@ -357,60 +548,5 @@ } return true; - } - - - // ------------------------------------------------------------------------ - // Utility Methods - // ------------------------------------------------------------------------ - - /** - * Sets the user provided key by normalizing it and adding a record into the - * keymap for future lookups. - * - * @param userProvidedId - * the id of the Attribute gotten from the attribute instance via - * getID(). - */ - private void setUserProvidedId( String userProvidedId ) - { - if ( keyMap == null ) - { - keyMap = new HashMap(); - keyMap.put( userProvidedId.toLowerCase(), userProvidedId ); - return; - } - - if ( keyMap.get( userProvidedId ) == null ) - { - keyMap.put( userProvidedId.toLowerCase(), userProvidedId ); - } - } - - - /** - * Gets the user provided key by looking it up using the normalized key in - * the key map. - * - * @param attrId - * the id of the Attribute in any case. - * @return the attribute id as it would be returned on a call to the - * Attribute's getID() method. - */ - private String getUserProvidedId( String attrId ) - { - // First check if it is correct form to save string creation below. - if ( map.containsKey( attrId ) ) - { - return attrId; - } - - if ( keyMap == null ) - { - keyMap = new HashMap(); - return null; - } - - return ( String ) keyMap.get( attrId.toLowerCase() ); } } Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/ModifyDnResponseImpl.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/ModifyDnResponseImpl.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/ModifyDnResponseImpl.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/message/ModifyDnResponseImpl.java Tue Aug 1 16:35:20 2006 @@ -1,3 +1,19 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.message; Propchange: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java ------------------------------------------------------------------------------ svn:executable = * Propchange: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java ------------------------------------------------------------------------------ svn:executable = * Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/NormalizerMappingResolver.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/NormalizerMappingResolver.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/NormalizerMappingResolver.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/NormalizerMappingResolver.java Tue Aug 1 16:35:20 2006 @@ -1,3 +1,19 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.schema; import java.util.Map; Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java Tue Aug 1 16:35:20 2006 @@ -1,51 +1,18 @@ /* - - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "Eve Directory Server", "Apache Directory Project", "Apache Eve" - and "Apache Software Foundation" must not be used to endorse or promote - products derived from this software without prior written - permission. For written permission, please contact apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation. For more information on the - Apache Software Foundation, please see . - + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.schema; Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SyntaxChecker.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SyntaxChecker.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SyntaxChecker.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SyntaxChecker.java Tue Aug 1 16:35:20 2006 @@ -1,51 +1,18 @@ /* - - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "Eve Directory Server", "Apache Directory Project", "Apache Eve" - and "Apache Software Foundation" must not be used to endorse or promote - products derived from this software without prior written - permission. For written permission, please contact apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation. For more information on the - Apache Software Foundation, please see . - + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.schema; Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParser.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParser.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParser.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParser.java Tue Aug 1 16:35:20 2006 @@ -20,6 +20,7 @@ import java.io.StringReader; import java.text.ParseException; +import java.util.Map; import org.apache.directory.shared.ldap.schema.NormalizerMappingResolver; @@ -51,13 +52,13 @@ /** * Creates a subtree specification parser. */ - public SubtreeSpecificationParser() + public SubtreeSpecificationParser( Map oidsMap ) { StringReader in = new StringReader( "" ); // place holder for the // first input this.lexer = new ReusableAntlrSubtreeSpecificationLexer( in ); this.parser = new ReusableAntlrSubtreeSpecificationParser( lexer ); - this.parser.init(); // this method MUST be called while we cannot do + this.parser.init( oidsMap ); // this method MUST be called while we cannot do // constructor overloading for antlr generated parser this.isNormalizing = false; } @@ -66,14 +67,14 @@ /** * Creates a normalizing subtree specification parser. */ - public SubtreeSpecificationParser( NormalizerMappingResolver resolver ) + public SubtreeSpecificationParser( NormalizerMappingResolver resolver, Map oidsMap ) { StringReader in = new StringReader( "" ); // place holder for the // first input this.lexer = new ReusableAntlrSubtreeSpecificationLexer( in ); this.parser = new ReusableAntlrSubtreeSpecificationParser( lexer ); this.parser.setNormalizerMappingResolver( resolver ); - this.parser.init(); // this method MUST be called while we cannot do + this.parser.init( oidsMap ); // this method MUST be called while we cannot do // constructor overloading for antlr generated parser this.isNormalizing = true; } Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/AttributeUtils.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/AttributeUtils.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/AttributeUtils.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/AttributeUtils.java Tue Aug 1 16:35:20 2006 @@ -23,6 +23,7 @@ import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; +import javax.naming.directory.ModificationItem; import javax.naming.NamingEnumeration; import javax.naming.NamingException; @@ -35,7 +36,88 @@ */ public class AttributeUtils { - public static boolean containsValue( Attribute attr, Object compared, AttributeType type ) throws NamingException + /** + * Utility method to extract an attribute from Attributes object using + * all combinationos of the name including aliases. + * + * @param attrs the Attributes to get the Attribute object from + * @param type the attribute type specification + * @return an Attribute with matching the attributeType spec or null + */ + public final static Attribute getAttribute( Attributes attrs, AttributeType type ) + { + // optimization bypass to avoid cost of the loop below + if ( type.getNames().length == 1 ) + { + return attrs.get( type.getNames()[0] ); + } + + // check if the attribute's OID is used + if ( attrs.get( type.getOid() ) != null ) + { + return attrs.get( type.getOid() ); + } + + // iterate through aliases + for ( int ii = 0; ii < type.getNames().length; ii++ ) + { + if ( attrs.get( type.getNames()[ii] ) != null ) + { + return attrs.get( type.getNames()[ii] ); + } + } + + return null; + } + + + /** + * Utility method to extract an attribute from an array of modifications. + * + * @param mods the array of ModificationItems to extract the Attribute from. + * @param type the attributeType spec of the Attribute to extract + * @return the extract Attribute or null if no such attribute exists + */ + public final static Attribute getAttribute( ModificationItem[] mods, AttributeType type ) + { + // optimization bypass to avoid cost of the loop below + if ( type.getNames().length == 1 ) + { + for ( int jj = 0; jj < mods.length; jj++ ) + { + if ( mods[jj].getAttribute().getID().equalsIgnoreCase( type.getNames()[0] ) ) + { + return mods[jj].getAttribute(); + } + } + } + + // check if the attribute's OID is used + for ( int jj = 0; jj < mods.length; jj++ ) + { + if ( mods[jj].getAttribute().getID().equals( type.getOid() ) ) + { + return mods[jj].getAttribute(); + } + } + + // iterate through aliases + for ( int ii = 0; ii < type.getNames().length; ii++ ) + { + for ( int jj = 0; jj < mods.length; jj++ ) + { + if ( mods[jj].getAttribute().getID().equalsIgnoreCase( type.getNames()[ii] ) ) + { + return mods[jj].getAttribute(); + } + } + } + + return null; + } + + + public final static boolean containsValue( Attribute attr, Object compared, AttributeType type ) throws NamingException { // quick bypass test if ( attr.contains( compared ) ) Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/ComponentsMonitor.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/ComponentsMonitor.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/ComponentsMonitor.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/ComponentsMonitor.java Tue Aug 1 16:35:20 2006 @@ -1,3 +1,19 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.util; Modified: directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java URL: http://svn.apache.org/viewvc/directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java?rev=427793&r1=427792&r2=427793&view=diff ============================================================================== --- directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java (original) +++ directory/branches/shared/0.9.5/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java Tue Aug 1 16:35:20 2006 @@ -16,6 +16,9 @@ */ package org.apache.directory.shared.ldap.util; +import org.apache.directory.shared.ldap.util.Position; +import org.apache.directory.shared.ldap.util.StringTools; + /** * Utility class used by the LdapDN Parser. @@ -26,69 +29,151 @@ { // ~ Static fields/initializers // ----------------------------------------------------------------- + /** A value if we got an error while parsing */ + public static final int PARSING_ERROR = -1; + + /** A value if we got a correct parsing */ + public static final int PARSING_OK = 0; + + /** If an hex pair contains only one char, this value is returned */ + public static final int BAD_HEX_PAIR = -2; + + /** A constant representing one char length */ + public static final int ONE_CHAR = 1; + + /** A constant representing two chars length */ + public static final int TWO_CHARS = 2; + + /** A constant representing one byte length */ + public static final int ONE_BYTE = 1; + + /** A constant representing two bytes length */ + public static final int TWO_BYTES = 2; /** * ::= [0x01-0x09] | 0x0B | 0x0C | [0x0E-0x1F] | * [0x21-0x39] | 0x3B | [0x3D-0x7F] */ private static final boolean[] SAFE_INIT_CHAR = - { false, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true }; + { + false, true, true, true, true, true, true, true, + true, true, false, true, true, false, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + false, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, false, true, false, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true + }; /** ::= [0x01-0x09] | 0x0B | 0x0C | [0x0E-0x7F] */ private static final boolean[] SAFE_CHAR = - { false, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true }; + { + false, true, true, true, true, true, true, true, + true, true, false, true, true, false, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + }; /** * ::= 0x2B | 0x2F | [0x30-0x39] | 0x3D | [0x41-0x5A] | * [0x61-0x7A] */ private static final boolean[] BASE64_CHAR = - { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, - false, false, true, true, true, true, true, true, true, true, true, true, true, false, false, false, true, - false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, false, false, false, false, false }; + { + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, true, false, false, false, true, + true, true, true, true, true, true, true, true, + true, true, false, false, false, true, false, false, + false, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, false, false, false, false, false, + false, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, false, false, false, false, false + }; /** - * '"' | '#' | '+' | ',' | [0-9] | ';' | '<' | '=' | '>' | [A-F] | '\' | + * ' ' | '"' | '#' | '+' | ',' | [0-9] | ';' | '<' | '=' | '>' | [A-F] | '\' | * [a-f] 0x22 | 0x23 | 0x2B | 0x2C | [0x30-0x39] | 0x3B | 0x3C | 0x3D | 0x3E | * [0x41-0x46] | 0x5C | [0x61-0x66] */ private static final boolean[] PAIR_CHAR = - { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, true, true, false, false, false, false, false, false, false, true, true, false, - false, false, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, - false, false, true, true, true, true, true, true, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, - false, false, false, true, true, true, true, true, true, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false }; + { + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + true, false, true, true, false, false, false, false, + false, false, false, true, true, false, false, false, + true, true, true, true, true, true, true, true, + true, true, false, true, true, true, true, false, + false, true, true, true, true, true, true, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, true, false, false, false, + false, true, true, true, true, true, true, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false + }; + + /** + * '"' | '#' | '+' | ',' | [0-9] | ';' | '<' | '=' | '>' | [A-F] | '\' | + * [a-f] 0x22 | 0x23 | 0x2B | 0x2C | [0x30-0x39] | 0x3B | 0x3C | 0x3D | 0x3E | + * [0x41-0x46] | 0x5C | [0x61-0x66] + */ + private static final int[] STRING_CHAR = + { + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 00 -> 03 + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 04 -> 07 + ONE_CHAR, ONE_CHAR, PARSING_ERROR, ONE_CHAR, // 08 -> 0B + ONE_CHAR, PARSING_ERROR, ONE_CHAR, ONE_CHAR, // 0C -> 0F + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 10 -> 13 + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 14 -> 17 + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 18 -> 1B + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 1C -> 1F + ONE_CHAR, ONE_CHAR, PARSING_ERROR, PARSING_ERROR,// 20 -> 23 + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 24 -> 27 + ONE_CHAR, ONE_CHAR, ONE_CHAR, PARSING_ERROR,// 28 -> 2B + PARSING_ERROR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 2C -> 2F + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 30 -> 33 + ONE_CHAR, ONE_CHAR, ONE_CHAR, ONE_CHAR, // 34 -> 37 + ONE_CHAR, ONE_CHAR, ONE_CHAR, PARSING_ERROR,// 38 -> 3B + PARSING_ERROR, PARSING_ERROR, PARSING_ERROR, ONE_CHAR // 3C -> 3F + }; /** "oid." static */ - public static final char[] OID_LOWER = new char[] - { 'o', 'i', 'd', '.' }; + public static final String OID_LOWER = "oid."; /** "OID." static */ - public static final char[] OID_UPPER = new char[] - { 'O', 'I', 'D', '.' }; + public static final String OID_UPPER = "OID."; /** "oid." static */ public static final byte[] OID_LOWER_BYTES = new byte[] @@ -98,23 +183,6 @@ public static final byte[] OID_UPPER_BYTES = new byte[] { 'O', 'I', 'D', '.' }; - /** A value if we got an error while parsing */ - public static final int PARSING_ERROR = -1; - - /** If an hex pair contains only one char, this value is returned */ - public static final int BAD_HEX_PAIR = -2; - - /** A constant representing one char length */ - public static final int ONE_CHAR = 1; - - /** A constant representing two chars length */ - public static final int TWO_CHARS = 2; - - /** A constant representing one byte length */ - public static final int ONE_BYTE = 1; - - /** A constant representing two bytes length */ - public static final int TWO_BYTES = 2; // ~ Methods @@ -308,6 +376,48 @@ } } + /** + * Check if the current character is a Pair Char + * + * ::= ' ' | ',' | '=' | '+' | '<' | '>' | '#' | ';' | + * '\' | '"' | [0-9a-fA-F] [0-9a-fA-F] + * + * @param string + * The string which contains the data + * @param index + * Current position in the string + * @return true if the current character is a Pair Char + */ + public static int isPairChar( String string, int index ) + { + int length = string.length(); + + if ( ( string == null ) || ( length == 0 ) || ( index < 0 ) || ( index >= length ) ) + { + return PARSING_ERROR; + } + else + { + char c = string.charAt( index ); + + if ( ( c > 127 ) || ( PAIR_CHAR[c] == false ) ) + { + return PARSING_ERROR; + } + else + { + if ( StringTools.isHex( string, index++ ) ) + { + return StringTools.isHex( string, index ) ? 2 : PARSING_ERROR; + } + else + { + return 1; + } + } + } + } + /** * Check if the current character is a String Char. Chars are Unicode, not @@ -330,10 +440,9 @@ { byte c = byteArray[index]; - if ( ( c == 0x0A ) || ( c == 0x0D ) || ( c == '"' ) || ( c == '#' ) || ( c == '+' ) || ( c == ',' ) - || ( c == ';' ) || ( c == '<' ) || ( c == '=' ) || ( c == '>' ) ) + if ( c < 0x40 ) { - return -1; + return STRING_CHAR[ c ]; } else { @@ -376,6 +485,40 @@ } } + /** + * Check if the current character is a String Char. Chars are Unicode, not + * ASCII. ::= [0x00-0xFFFF] - [,=+<>#;\"\n\r] + * + * @param string + * The string which contains the data + * @param index + * Current position in the string + * @return The current char if it is a String Char, or '#' (this is simpler + * than throwing an exception :) + */ + public static int isStringChar( String string, int index ) + { + int length = string.length(); + + if ( ( string == null ) || ( length == 0 ) || ( index < 0 ) || ( index >= length ) ) + { + return PARSING_ERROR; + } + else + { + char c = string.charAt( index ); + + if ( c < 0x40 ) + { + return STRING_CHAR[ c ]; + } + else + { + return ONE_CHAR; + } + } + } + /** * Check if the current character is a Quote Char We are testing Unicode @@ -438,6 +581,38 @@ } } + /** + * Check if the current character is a Quote Char We are testing Unicode + * chars ::= [0x00-0xFFFF] - [\"] + * + * @param string The string which contains the data + * @param index Current position in the string + * + * @return true if the current character is a Quote Char + */ + public static int isQuoteChar( String string, int index ) + { + int length = string.length(); + + if ( ( string == null ) || ( length == 0 ) || ( index < 0 ) || ( index >= length ) ) + { + return PARSING_ERROR; + } + else + { + char c = string.charAt( index ); + + if ( ( c == '\\' ) || ( c == '"' ) ) + { + return PARSING_ERROR; + } + else + { + return ONE_CHAR; + } + } + } + /** * Parse an hex pair ::= @@ -498,6 +673,34 @@ } } + /** + * Parse an hex pair ::= + * + * @param string + * The string which contains the data + * @param index + * Current position in the string + * @return The new position, -1 if the string does not contain an HexPair, + * -2 if the string contains an hex byte but not two. + */ + public static int parseHexPair( String string, int index ) + { + if ( StringTools.isHex( string, index ) ) + { + if ( StringTools.isHex( string, index + 1 ) ) + { + return index + TWO_CHARS; + } + else + { + return BAD_HEX_PAIR; + } + } + else + { + return PARSING_ERROR; + } + } /** * Parse an hex string, which is a list of hex pairs ::= @@ -566,6 +769,39 @@ return ( ( result == BAD_HEX_PAIR ) ? PARSING_ERROR : index ); } + /** + * Parse an hex string, which is a list of hex pairs ::= + * ::= | e + * + * @param string + * The string which contains the data + * @param index + * Current position in the string + * @return Return the first position which is not an hex pair, or -1 if + * there is no hexpair at the beginning or if an hexpair is invalid + * (if we have only one hex instead of 2) + */ + public static int parseHexString( String string, Position pos ) + { + pos.end = pos.start; + int result = parseHexPair( string, pos.start ); + + if ( result < 0 ) + { + return PARSING_ERROR; + } + else + { + pos.end += TWO_CHARS; + } + + while ( ( result = parseHexPair( string, pos.end ) ) >= 0 ) + { + pos.end += TWO_CHARS; + } + + return ( ( result == BAD_HEX_PAIR ) ? PARSING_ERROR : PARSING_OK ); + } /** * Walk the buffer while characters are Base64 characters : @@ -611,5 +847,4 @@ return index; } } - }