package com.eucalyptus.event;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.log4j.Logger;
import com.eucalyptus.bootstrap.ServiceJarDiscovery;
public class EventListenerDiscovery extends ServiceJarDiscovery {
private static Logger LOG = Logger.getLogger( EventListenerDiscovery.class );
public EventListenerDiscovery( ) {}
@Override
public Double getPriority( ) {
return 0.5;
}
@Override
public boolean processClass( Class candidate ) throws Throwable {
Class listener = this.getEventListener( candidate );
return true;
}
@SuppressWarnings( "unchecked" )
private Class getEventListener( Class candidate ) throws Exception {
if ( !EventListener.class.isAssignableFrom( candidate ) ) {
throw new InstantiationException( candidate + " does not conform to " + EventListener.class );
}
LOG.trace( "Candidate event listener: " + candidate.getName( ) );
Method factory;
factory = candidate.getDeclaredMethod( "register", new Class[] {} );
if ( !Modifier.isStatic( factory.getModifiers( ) ) || !Modifier.isPublic( factory.getModifiers( ) ) ) {
throw new InstantiationException( candidate.getCanonicalName( ) + " does not declare public static register()V" );
}
LOG.trace( "-> Registered event listener: " + candidate.getName( ) );
factory.invoke( null, new Object[] {} );
return candidate;
}
}