private static AttributeType parseAttributeTypeRelaxed()

in ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java [3111:3289]


    private static AttributeType parseAttributeTypeRelaxed( Reader reader, PosSchema pos,
        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
    {
        // Get rid of whites, comments end empty lines
        skipWhites( reader, pos, false );
        
        // we must have a '('
        if ( pos.line.charAt( pos.start ) != LPAREN )
        {
            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
                pos.lineNumber, pos.start ) );
        }
        else
        {
            pos.start++;
        }
        
        // Get rid of whites, comments end empty lines
        skipWhites( reader, pos, false );
        
        // Now, the OID. 
        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
        
        AttributeType attributeType = new AttributeType( oid );
        int elementsSeen = 0;
        
        while ( true )
        {
            if ( startsWith( reader, pos, RPAREN ) )
            {
                pos.start++;
                break;
            }
            
            // Make whitespace non-mandatory here.
            // E.g. OpenDJ is missing the the space in some schema definitions.
            skipWhites( reader, pos, false );

            if ( startsWith( pos, NAME_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NAME, pos );
                
                pos.start += NAME_STR.length();
                
                skipWhites( reader, pos, true );

                attributeType.setNames( getQDescrs( reader, pos, RELAXED ) );
            }
            else if ( startsWith( pos, DESC_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.DESC, pos );

                pos.start += DESC_STR.length();
                
                skipWhites( reader, pos, true );

                attributeType.setDescription( getQDString( reader, pos ) );
            }
            else if ( startsWith( pos, OBSOLETE_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.OBSOLETE, pos );
                
                pos.start += OBSOLETE_STR.length();
                
                attributeType.setObsolete( true );
            }
            else if ( startsWith( pos, SUP_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUP, pos );
                
                pos.start += SUP_STR.length();
                
                skipWhites( reader, pos, true );
                
                String superiorOid = getOidRelaxed( pos, false );

                attributeType.setSuperiorOid( superiorOid );
            }
            else if ( startsWith( pos, EQUALITY_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.EQUALITY, pos );
                
                pos.start += EQUALITY_STR.length();
                
                skipWhites( reader, pos, true );
                
                String equalityOid = getOidRelaxed( pos, false );

                attributeType.setEqualityOid( equalityOid );
            }
            else if ( startsWith( pos, ORDERING_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.ORDERING, pos );
                
                pos.start += ORDERING_STR.length();
                
                skipWhites( reader, pos, true );
                
                String orderingOid = getOidRelaxed( pos, false );

                attributeType.setOrderingOid( orderingOid );
            }
            else if ( startsWith( pos, SUBSTR_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUBSTR, pos );

                pos.start += SUBSTR_STR.length();
                
                skipWhites( reader, pos, true );
                
                String substrOid = getOidRelaxed( pos, false );

                attributeType.setSubstringOid( substrOid );
            }
            else if ( startsWith( pos, SYNTAX_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SYNTAX, pos );
                
                pos.start += SYNTAX_STR.length();
                
                skipWhites( reader, pos, true );
                
                getNoidLenRelaxed( attributeType, pos );
            }
            else if ( startsWith( pos, SINGLE_VALUE_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SINGLE_VALUE, pos );
                
                pos.start += SINGLE_VALUE_STR.length();
                
                attributeType.setSingleValued( true );
            }
            else if ( startsWith( pos, COLLECTIVE_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.COLLECTIVE, pos );
                
                pos.start += COLLECTIVE_STR.length();
                
                attributeType.setCollective( true );
            }
            else if ( startsWith( pos, NO_USER_MODIFICATION_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NO_USER_MODIFICATION, pos );
                
                pos.start += NO_USER_MODIFICATION_STR.length();
                
                attributeType.setUserModifiable( false );
            }
            else if ( startsWith( pos, USAGE_STR ) )
            {
                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.USAGE, pos );
                
                pos.start += USAGE_STR.length();
                
                skipWhites( reader, pos, true );
                
                UsageEnum usage = getUsageRelaxed( pos );

                attributeType.setUsage( usage );
            }
            else if ( startsWith( pos, EXTENSION_PREFIX ) )
            {
                processExtension( reader, pos, attributeType );
            }
            else if ( startsWith( reader, pos, RPAREN ) )
            {
                pos.start++;
                break;
            }
            else
            {
                // This is an error
                throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
                    pos.lineNumber, pos.start ) );
            }
        }
        
        return attributeType;
    }