blob: 5640b3465cf7893de384911dd5ac34d4e5d8c37b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.model.entry;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.apache.directory.shared.i18n.I18n;
import org.apache.directory.shared.ldap.model.exception.LdapException;
import org.apache.directory.shared.ldap.model.exception.LdapInvalidAttributeValueException;
import org.apache.directory.shared.ldap.model.schema.AttributeType;
import org.apache.directory.shared.ldap.model.schema.SchemaManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An internal implementation for a ModificationItem. The name has been
* chosen so that it does not conflict with @see ModificationItem
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class DefaultModification implements Modification
{
/** The modification operation */
private ModificationOperation operation;
/** The attribute which contains the modification */
private Attribute attribute;
/** The AtributeType */
private AttributeType attributeType;
/** logger for reporting errors that might not be handled properly upstream */
protected static final Logger LOG = LoggerFactory.getLogger( Modification.class );
/**
* Creates a new instance of DefaultModification.
*/
public DefaultModification()
{
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attribute The associated attribute
*/
public DefaultModification( ModificationOperation operation, Attribute attribute )
{
this.operation = operation;
this.attribute = attribute;
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeId The associated attribute ID
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, String attributeId, String... values )
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeId, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeId The associated attribute ID
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, String attributeId, byte[]... values )
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeId, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeId The associated attribute ID
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, String attributeId, Value<?>... values )
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeId, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeType The associated attributeType
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, AttributeType attributeType, String... values )
throws LdapInvalidAttributeValueException
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeType, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeType The associated attributeType
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, AttributeType attributeType, byte[]... values )
throws LdapInvalidAttributeValueException
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeType, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param operation The modification operation
* @param attributeType The associated attributeType
* @param values the associated values
*/
public DefaultModification( ModificationOperation operation, AttributeType attributeType, Value<?>... values )
throws LdapInvalidAttributeValueException
{
this.operation = operation;
this.attribute = new DefaultAttribute( attributeType, values );
}
/**
* Creates a new instance of DefaultModification.
*
* @param schemaManager The schema manager
* @param modification The modification
*/
public DefaultModification( SchemaManager schemaManager, Modification modification )
{
operation = modification.getOperation();
Attribute modAttribute = modification.getAttribute();
try
{
AttributeType at = modAttribute.getAttributeType();
if ( at == null )
{
at = schemaManager.lookupAttributeTypeRegistry( modAttribute.getId() );
}
attribute = new DefaultAttribute( at, modAttribute );
}
catch ( LdapException ne )
{
// The attributeType is incorrect. Log, but do nothing otherwise.
LOG.error( I18n.err( I18n.ERR_04472, modAttribute.getId() ) );
}
}
/**
* {@inheritDoc}
*/
public ModificationOperation getOperation()
{
return operation;
}
/**
* {@inheritDoc}
*/
public void setOperation( int operation )
{
this.operation = ModificationOperation.getOperation( operation );
}
/**
* {@inheritDoc}
*/
public void setOperation( ModificationOperation operation )
{
this.operation = operation;
}
/**
* {@inheritDoc}
*/
public Attribute getAttribute()
{
return attribute;
}
/**
* {@inheritDoc}
*/
public void setAttribute( Attribute attribute )
{
this.attribute = attribute;
}
/**
* {@inheritDoc}
*/
public void apply( AttributeType attributeType ) throws LdapInvalidAttributeValueException
{
this.attributeType = attributeType;
if ( attribute != null )
{
attribute.apply( attributeType );
}
}
/**
* {@inheritDoc}
*/
public AttributeType getAttributeType()
{
return attributeType;
}
/**
* @see Object#equals(Object)
* @return <code>true</code> if both values are equal
*/
public boolean equals( Object that )
{
// Basic equals checks
if ( this == that )
{
return true;
}
if ( ! (that instanceof Modification ) )
{
return false;
}
Modification otherModification = (Modification)that;
// Check the operation
if ( operation != otherModification.getOperation() )
{
return false;
}
// Check the attribute
if ( attribute == null )
{
return otherModification.getAttribute() == null;
}
return attribute.equals( otherModification.getAttribute() );
}
/**
* Compute the modification @see Object#hashCode
* @return the instance's hash code
*/
public int hashCode()
{
int h = 37;
h += h*17 + operation.getValue();
h += h*17 + attribute.hashCode();
return h;
}
/**
* @see java.io.Externalizable#readExternal(ObjectInput)
*/
public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
{
// The operation
operation = ModificationOperation.getOperation( in.readInt() );
// The EntryAttribute if we have some
boolean hasAttribute = in.readBoolean();
if ( hasAttribute )
{
attribute = new DefaultAttribute();
attribute.readExternal( in );
}
}
/**
* @see java.io.Externalizable#writeExternal(ObjectOutput)
*/
public void writeExternal( ObjectOutput out ) throws IOException
{
// The operation
out.writeInt( operation.getValue() );
// The EntryAttribute if not null
if ( attribute != null )
{
out.writeBoolean( true );
attribute.writeExternal( out );
}
else
{
out.writeBoolean( false );
}
out.flush();
}
/**
* {@inheritDoc}
*/
public DefaultModification clone()
{
try
{
DefaultModification clone = (DefaultModification)super.clone();
clone.attribute = this.attribute.clone();
return clone;
}
catch ( CloneNotSupportedException cnse )
{
return null;
}
}
/**
* @see Object#toString()
*/
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "Modification: " ).
append( operation ).
append( "\n" ).
append( ", attribute : " ).
append( attribute );
return sb.toString();
}
}