blob: 92d9ba35ecef99c223c9c91e06b308bc1238b9f3 [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.server.core.jndi;
import javax.naming.Binding;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.event.NamespaceChangeListener;
import javax.naming.event.NamingEvent;
import javax.naming.event.NamingExceptionEvent;
import javax.naming.event.NamingListener;
import javax.naming.event.ObjectChangeListener;
import org.apache.directory.server.core.api.entry.ClonedServerEntry;
import org.apache.directory.server.core.api.entry.ServerEntryUtils;
import org.apache.directory.server.core.api.event.DirectoryListener;
import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveOperationContext;
import org.apache.directory.server.core.api.interceptor.context.RenameOperationContext;
import org.apache.directory.server.i18n.I18n;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A DirectoryListener implementation which adapts call back to methods
* notifying of changes to the DIT into NamingEvents for use with the ApacheDS
* DirectoryService JNDI provider.
*
* TODO for the time being bindings in NamingEvents generated are not relative
* to the source context which they should be.
*
* TODO presume correctly manipulated entry values in opContext.getEntry()
* objects to function properly - at this point this is not handled in the
* Interceptors and needs to be added for this adapter to populate the event
* bindings.
*
* TODO - Should we factor in the attributes to be returned in bindings?
* Perhaps this should be privided as search controls along with the info
* we need to handle aliases, and referals?
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class EventListenerAdapter implements DirectoryListener
{
private static final Logger LOG = LoggerFactory.getLogger( EventListenerAdapter.class );
private final NamingListener listener;
private final ServerLdapContext source;
public EventListenerAdapter( ServerLdapContext source, NamingListener listener )
{
this( source, listener, new SearchControls() );
}
public EventListenerAdapter( ServerLdapContext source, NamingListener listener, SearchControls controls )
{
this.source = source;
this.listener = listener;
}
@Override
public boolean isSynchronous()
{
return false; // always asynchronous
}
private void deliverNamingExceptionEvent( Exception e )
{
LOG.error( I18n.err( I18n.ERR_118 ), e );
NamingExceptionEvent evt = null;
if ( e instanceof NamingException )
{
evt = new NamingExceptionEvent( source, ( NamingException ) e );
}
else
{
NamingException ne = new NamingException( I18n.err( I18n.ERR_119 ) );
ne.setRootCause( e );
evt = new NamingExceptionEvent( source, ne );
}
listener.namingExceptionThrown( evt );
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryAdded(org.apache.directory.server.core.interceptor.context.AddOperationContext)
*/
public void entryAdded( AddOperationContext addContext )
{
try
{
Binding binding = new Binding( addContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( addContext.getEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_ADDED,
binding, null, addContext );
if ( listener instanceof NamespaceChangeListener )
{
( ( NamespaceChangeListener ) listener ).objectAdded( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryDeleted(org.apache.directory.server.core.interceptor.context.DeleteOperationContext)
*/
public void entryDeleted( DeleteOperationContext deleteContext )
{
try
{
if ( listener instanceof NamespaceChangeListener )
{
Binding binding = new Binding( deleteContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( deleteContext.getEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_REMOVED, null,
binding, deleteContext );
( ( NamespaceChangeListener ) listener ).objectAdded( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryModified(org.apache.directory.server.core.interceptor.context.ModifyOperationContext)
*/
public void entryModified( ModifyOperationContext modifyContext )
{
try
{
Binding newBinding = new Binding( modifyContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( modifyContext.getEntry() ), false );
Binding oldBinding = new Binding( modifyContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( ( ( ClonedServerEntry ) modifyContext.getEntry() )
.getOriginalEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_CHANGED,
newBinding, oldBinding, modifyContext );
if ( listener instanceof ObjectChangeListener )
{
( ( ObjectChangeListener ) listener ).objectChanged( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryMoved(org.apache.directory.server.core.interceptor.context.MoveOperationContext)
*/
public void entryMoved( MoveOperationContext moveContext )
{
try
{
if ( listener instanceof NamespaceChangeListener )
{
Binding newBinding = new Binding( moveContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( moveContext.getEntry() ), false );
Binding oldBinding = new Binding( moveContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( ( ( ClonedServerEntry ) moveContext.getEntry() )
.getOriginalEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_RENAMED,
newBinding, oldBinding, moveContext );
( ( NamespaceChangeListener ) listener ).objectRenamed( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryMovedAndRenamed(org.apache.directory.server.core.interceptor.context.MoveAndRenameOperationContext)
*/
public void entryMovedAndRenamed( MoveAndRenameOperationContext moveAndRenameContext )
{
try
{
if ( listener instanceof NamespaceChangeListener )
{
Binding newBinding = new Binding( moveAndRenameContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( moveAndRenameContext.getEntry() ), false );
Binding oldBinding = new Binding( moveAndRenameContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( ( ( ClonedServerEntry ) moveAndRenameContext.getEntry() )
.getOriginalEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_RENAMED,
newBinding, oldBinding, moveAndRenameContext );
( ( NamespaceChangeListener ) listener ).objectRenamed( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
/* (non-Javadoc)
* @see org.apache.directory.server.core.event.DirectoryListener#entryRenamed(org.apache.directory.server.core.interceptor.context.RenameOperationContext)
*/
public void entryRenamed( RenameOperationContext renameContext )
{
try
{
if ( listener instanceof NamespaceChangeListener )
{
Binding newBinding = new Binding( renameContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( renameContext.getEntry() ), false );
Binding oldBinding = new Binding( renameContext.getDn().getName(),
ServerEntryUtils.toBasicAttributes( ( ( ClonedServerEntry ) renameContext.getEntry() )
.getOriginalEntry() ), false );
NamingEvent evt = new NamingEvent( source, NamingEvent.OBJECT_RENAMED,
newBinding, oldBinding, null );
( ( NamespaceChangeListener ) listener ).objectRenamed( evt );
}
}
catch ( Exception e )
{
deliverNamingExceptionEvent( e );
}
}
}