in core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java [332:510]
public void bind( Name name, Object obj, Attributes attrs ) throws NamingException
{
if ( ( null == obj ) && ( null == attrs ) )
{
throw new NamingException( I18n.err( I18n.ERR_06019_ABJ_AND_ATTRS_ARGS_ARE_NULL ) );
}
// A null attrs defaults this to the Context.bind() operation
if ( null == attrs )
{
super.bind( name, obj );
return;
}
Dn target = buildTarget( JndiUtils.fromName( name ) );
Entry serverEntry = null;
try
{
serverEntry = ServerEntryUtils.toServerEntry( AttributeUtils.toCaseInsensitive( attrs ), target,
getDirectoryService().getSchemaManager() );
}
catch ( LdapInvalidAttributeTypeException liate )
{
throw new InvalidAttributesException( liate.getMessage() );
}
// No object binding so we just add the attributes
if ( null == obj )
{
Entry clone = serverEntry.clone();
try
{
doAddOperation( target, clone );
}
catch ( Exception e )
{
JndiUtils.wrap( e );
}
return;
}
// First, use state factories to do a transformation
DirStateFactory.Result res = DirectoryManager.getStateToBind( obj, name, this, getEnvironment(), attrs );
Entry outServerEntry = null;
try
{
outServerEntry = ServerEntryUtils.toServerEntry(
res.getAttributes(), target, getDirectoryService().getSchemaManager() );
}
catch ( LdapInvalidAttributeTypeException le )
{
throw new InvalidAttributesException( le.getMessage() );
}
if ( outServerEntry != serverEntry )
{
Entry clone = serverEntry.clone();
if ( ( outServerEntry != null ) && ( outServerEntry.size() > 0 ) )
{
for ( Attribute attribute : outServerEntry )
{
try
{
clone.put( attribute );
}
catch ( LdapException e )
{
// TODO Auto-generated catch block
}
}
}
try
{
// setup the op context
doAddOperation( target, clone );
}
catch ( Exception e )
{
JndiUtils.wrap( e );
}
return;
}
// Check for Referenceable
if ( obj instanceof Referenceable )
{
throw new NamingException( I18n.err( I18n.ERR_06010_CANT_STORE_REFERENCEABLE ) );
}
// Store different formats
if ( obj instanceof Reference )
{
// Store as ref and add outAttrs
throw new NamingException( I18n.err( I18n.ERR_06011_CANT_STORE_REFERENCE ) );
}
else if ( obj instanceof Serializable )
{
// Serialize and add outAttrs
Entry clone = serverEntry.clone();
if ( outServerEntry.size() > 0 )
{
for ( Attribute attribute : outServerEntry )
{
try
{
clone.put( attribute );
}
catch ( LdapException le )
{
throw new InvalidAttributesException( le.getMessage() );
}
}
}
try
{
// Serialize object into entry attributes and add it.
JavaLdapSupport.serialize( serverEntry, obj, getDirectoryService().getSchemaManager() );
// setup the op context
doAddOperation( target, clone );
}
catch ( Exception e )
{
JndiUtils.wrap( e );
}
}
else if ( obj instanceof DirContext )
{
// Grab attributes and merge with outAttrs
Entry entry = null;
try
{
entry = ServerEntryUtils.toServerEntry( ( ( DirContext ) obj ).getAttributes( "" ), target,
getDirectoryService().getSchemaManager() );
}
catch ( LdapInvalidAttributeTypeException liate )
{
throw new InvalidAttributeIdentifierException( liate.getMessage() );
}
if ( ( outServerEntry != null ) && ( outServerEntry.size() > 0 ) )
{
for ( Attribute attribute : outServerEntry )
{
try
{
entry.put( attribute );
}
catch ( LdapException le )
{
throw new InvalidAttributeValueException( le.getMessage() );
}
}
}
try
{
// setup the op context
doAddOperation( target, entry );
}
catch ( Exception e )
{
JndiUtils.wrap( e );
}
}
else
{
throw new NamingException( I18n.err( I18n.ERR_06012_CANT_BIND, obj ) );
}
}