in ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifReader.java [1133:1316]
private void parseModify( LdifEntry entry, Iterator<String> iter ) throws LdapLdifException
{
int state = MOD_SPEC;
String modified = null;
ModificationOperation modificationType = ModificationOperation.ADD_ATTRIBUTE;
Attribute attribute = null;
// The following flag is used to deal with empty modifications
boolean isEmptyValue = true;
while ( iter.hasNext() )
{
String line = iter.next();
String lowerLine = Strings.toLowerCaseAscii( line );
if ( lowerLine.startsWith( "-" ) )
{
if ( ( state != ATTRVAL_SPEC_OR_SEP ) && ( state != ATTRVAL_SPEC ) )
{
String msg = I18n.err( I18n.ERR_13413_BAD_MODIFY_SEPARATOR, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
else
{
if ( isEmptyValue )
{
if ( state == ATTRVAL_SPEC_OR_SEP )
{
entry.addModification( modificationType, modified );
}
else
{
// Update the entry with a null value
entry.addModification( modificationType, modified, null );
}
}
else
{
// Update the entry with the attribute
entry.addModification( modificationType, attribute );
}
state = MOD_SPEC;
isEmptyValue = true;
}
}
else if ( lowerLine.startsWith( "add:" ) )
{
if ( ( state != MOD_SPEC ) && ( state != ATTRVAL_SPEC ) )
{
String msg = I18n.err( I18n.ERR_13414_BAD_MODIFY_SEPARATOR_2, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
modified = Strings.trim( line.substring( "add:".length() ) );
modificationType = ModificationOperation.ADD_ATTRIBUTE;
attribute = new DefaultAttribute( modified );
state = ATTRVAL_SPEC;
}
else if ( lowerLine.startsWith( "delete:" ) )
{
if ( ( state != MOD_SPEC ) && ( state != ATTRVAL_SPEC ) )
{
String msg = I18n.err( I18n.ERR_13414_BAD_MODIFY_SEPARATOR_2, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
modified = Strings.trim( line.substring( "delete:".length() ) );
modificationType = ModificationOperation.REMOVE_ATTRIBUTE;
attribute = new DefaultAttribute( modified );
isEmptyValue = false;
state = ATTRVAL_SPEC_OR_SEP;
}
else if ( lowerLine.startsWith( "replace:" ) )
{
if ( ( state != MOD_SPEC ) && ( state != ATTRVAL_SPEC ) )
{
String msg = I18n.err( I18n.ERR_13414_BAD_MODIFY_SEPARATOR_2, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
modified = Strings.trim( line.substring( "replace:".length() ) );
modificationType = ModificationOperation.REPLACE_ATTRIBUTE;
if ( schemaManager != null )
{
AttributeType attributeType = schemaManager.getAttributeType( modified );
attribute = new DefaultAttribute( modified, attributeType );
}
else
{
attribute = new DefaultAttribute( modified );
}
state = ATTRVAL_SPEC_OR_SEP;
}
else if ( lowerLine.startsWith( "increment:" ) )
{
if ( ( state != MOD_SPEC ) && ( state != ATTRVAL_SPEC ) )
{
String msg = I18n.err( I18n.ERR_13414_BAD_MODIFY_SEPARATOR_2, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
modified = Strings.trim( line.substring( "increment:".length() ) );
modificationType = ModificationOperation.INCREMENT_ATTRIBUTE;
if ( schemaManager != null )
{
AttributeType attributeType = schemaManager.getAttributeType( modified );
attribute = new DefaultAttribute( modified, attributeType );
}
else
{
attribute = new DefaultAttribute( modified );
}
state = ATTRVAL_SPEC_OR_SEP;
}
else
{
if ( ( state != ATTRVAL_SPEC ) && ( state != ATTRVAL_SPEC_OR_SEP ) )
{
String msg = I18n.err( I18n.ERR_13413_BAD_MODIFY_SEPARATOR, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
// A standard AttributeType/AttributeValue pair
int colonIndex = line.indexOf( ':' );
String attributeType = line.substring( 0, colonIndex );
if ( !attributeType.equalsIgnoreCase( modified ) )
{
LOG.error( I18n.err( I18n.ERR_13415_MOD_ATTR_AND_VALUE_SPEC_NOT_EQUAL, lineNumber ) );
throw new LdapLdifException( I18n.err( I18n.ERR_13454_BAD_MODIFY_ATTRIBUTE ) );
}
// We should *not* have a Dn twice
if ( "dn".equalsIgnoreCase( attributeType ) )
{
LOG.error( I18n.err( I18n.ERR_13400_ENTRY_WITH_TWO_DNS, lineNumber ) );
throw new LdapLdifException( I18n.err( I18n.ERR_13439_LDIF_ENTRY_WITH_TWO_DNS ) );
}
Object attributeValue = parseValue( attributeType, line, colonIndex );
try
{
if ( attributeValue instanceof String )
{
attribute.add( ( String ) attributeValue );
}
else
{
attribute.add( ( byte[] ) attributeValue );
}
}
catch ( LdapInvalidAttributeValueException liave )
{
throw new LdapLdifException( liave.getMessage(), liave );
}
isEmptyValue = false;
state = ATTRVAL_SPEC_OR_SEP;
}
}
if ( state != MOD_SPEC )
{
String msg = I18n.err( I18n.ERR_13414_BAD_MODIFY_SEPARATOR_2, lineNumber );
LOG.error( msg );
throw new LdapLdifException( msg );
}
}