in ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java [2907:3114]
private static AttributeType parseAttributeTypeStrict( 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 );
// Check that the OID is valid
if ( !Oid.isOid( oid ) )
{
throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
}
AttributeType attributeType = new AttributeType( oid );
boolean hasSup = false;
boolean hasSyntax = false;
int elementsSeen = 0;
while ( true )
{
if ( startsWith( reader, pos, RPAREN ) )
{
pos.start++;
break;
}
skipWhites( reader, pos, true );
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, STRICT ) );
}
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 = getOidStrict( pos );
attributeType.setSuperiorOid( superiorOid );
hasSup = true;
}
else if ( startsWith( pos, EQUALITY_STR ) )
{
elementsSeen = checkElement( elementsSeen, AttributeTypeElements.EQUALITY, pos );
pos.start += EQUALITY_STR.length();
skipWhites( reader, pos, true );
String equalityOid = getOidStrict( pos );
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 = getOidStrict( pos );
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 = getOidStrict( pos );
attributeType.setSubstringOid( substrOid );
}
else if ( startsWith( pos, SYNTAX_STR ) )
{
elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SYNTAX, pos );
pos.start += SYNTAX_STR.length();
skipWhites( reader, pos, true );
getNoidLenStrict( attributeType, pos );
hasSyntax = true;
}
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 = getUsageStrict( 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 ) );
}
}
// Semantic checks
if ( !hasSup && !hasSyntax )
{
throw new LdapSchemaException( I18n.err( I18n.ERR_13799_SYNTAX_OR_SUP_REQUIRED,
pos.lineNumber, pos.start ) );
}
if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
{
throw new LdapSchemaException( I18n.err( I18n.ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION,
pos.lineNumber, pos.start ) );
}
// NO-USER-MODIFICATION requires an operational USAGE.
if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
{
throw new LdapSchemaException( I18n.err( I18n.ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL,
pos.lineNumber, pos.start ) );
}
return attributeType;
}