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;
}