package org.atricore.idbus.kernel.main.mediation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.atricore.idbus.kernel.main.mediation.osgi.OsgiIdentityMediationUnit;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Collection;
/**
* @author <a href="mailto:sgonzalez@atricore.org">Sebastian Gonzalez Oyuela</a>
* @version $Id$
*/
public class MediationEngineImpl implements MediationEngine, MediationUnitLifecycleListener,
InitializingBean, DisposableBean, ApplicationContextAware {
private static final Log logger = LogFactory.getLog(MediationEngineImpl.class);
private IdentityMediationUnitRegistry registry;
private ApplicationContext applicationContext;
public void afterPropertiesSet() throws Exception {
for (IdentityMediationUnit unit : registry.getIdentityMediationUnits()) {
if (unit instanceof OsgiIdentityMediationUnit)
startUnit((OsgiIdentityMediationUnit) unit);
else {
logger.error("Unsupported Identity Mediation Unit type " + unit.getClass().getName());
}
}
}
public Collection<IdentityMediationUnit> getAllUnits() {
return registry.getIdentityMediationUnits();
}
public IdentityMediationUnit lookupUnit(String name) {
return registry.lookupUnit(name);
}
public void destroy() throws Exception {
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public IdentityMediationUnitRegistry getRegistry() {
return registry;
}
public void setRegistry(IdentityMediationUnitRegistry registry) {
this.registry = registry;
}
public void notify(MediationUnitLifecycleEvent event) {
try {
String unitName = event.getUnitName();
if (logger.isTraceEnabled())
logger.trace("Procesing event " + event.getType() + " for unit " + event.getUnitName());
IdentityMediationUnit unit = registry.lookupUnit(unitName);
if (unit == null) {
logger.error("Cannot resolve unit for " + unitName);
return;
}
if (event.getType().equals("REGISTERED")) {
startUnit((OsgiIdentityMediationUnit) unit);
} else if (event.getType().equals("UNREGISTERED")) {
stopUnit((OsgiIdentityMediationUnit) unit);
} else {
logger.warn("Unhandled event " + event.getType());
}
} catch (IdentityMediationException e) {
logger.error(e.getMessage(), e);
}
}
protected void startUnit(OsgiIdentityMediationUnit unit) throws IdentityMediationException {
// TODO : For classloader issues that need to be solved, the unit is tarted by spring
}
protected void stopUnit(OsgiIdentityMediationUnit unit) throws IdentityMediationException {
Collection<Channel> channels = unit.getChannels();
// initialize mediation mediation engines (e.g. create context)
for (Channel channel : channels) {
// TODO : Stop engines only once
if (channel.getUnitContainer() != null) {
IdentityMediationUnitContainer unitContainer = channel.getUnitContainer();
unitContainer.stop();
}
}
}
}