package org.atricore.idbus.kernel.main.mediation.osgi;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.atricore.idbus.kernel.main.federation.metadata.CircleOfTrustManager;
import org.atricore.idbus.kernel.main.federation.metadata.EndpointDescriptorImpl;
import org.atricore.idbus.kernel.main.federation.metadata.MetadataEntry;
import org.atricore.idbus.kernel.main.mediation.*;
import org.atricore.idbus.kernel.main.mediation.channel.AbstractFederationChannel;
import org.atricore.idbus.kernel.main.mediation.channel.FederationChannel;
import org.atricore.idbus.kernel.main.mediation.endpoint.IdentityMediationEndpoint;
import org.atricore.idbus.kernel.main.mediation.endpoint.IdentityMediationEndpointImpl;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
import org.springframework.osgi.context.BundleContextAware;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author <a href="mailto:sgonzalez@atricore.org">Sebastian Gonzalez Oyuela</a>
* @version $Id$
*/
public class OsgiIdentityMediationUnit extends SpringMediationUnit
implements BundleContextAware {
private static final Log logger = LogFactory.getLog(OsgiIdentityMediationUnit.class);
private BundleContext bundleContext;
public void setBundleContext(BundleContext bundleContext) {
this.bundleContext = bundleContext;
}
public BundleContext getBundleContext() {
return bundleContext;
}
@Override
public void afterPropertiesSet() throws Exception {
IdentityMediationUnitContainer container = null;
try {
// We need this code to run here, triggered by spring, so that
// the identity appliance unit classloader is used ...
super.afterPropertiesSet();
ApplicationContext applicationContext = this.getApplicationContext();
Collection<Channel> channels = this.getChannels();
long now = System.currentTimeMillis();
Map<String, CircleOfTrustManager> cots = applicationContext.getBeansOfType(CircleOfTrustManager.class);
if (cots.values().size() > 1)
throw new IdentityMediationException("Multiple Circle of Trust managers not supported!");
// The mediation process can use COTs ...
CircleOfTrustManager cotMgr = null;
if (cots.values().size() < 1) {
logger.debug("No Circle of Trust manager found");
} else {
cotMgr = cots.values().iterator().next();
if (logger.isDebugEnabled())
logger.debug("Initializing Mediation infrastructure using COT manager " + cotMgr);
cotMgr.init();
}
Set<String> channelNames = new HashSet<String>();
Set<String> endpointNames = new HashSet<String>();
// Register mediators with container
for (Channel channel : channels) {
if (channel.getUnitContainer() == null) {
throw new IllegalArgumentException("Channel " + channel.getName() +
" ["+channel.getClass().getSimpleName()+"] does not have a mediation unitContainer!");
}
if (channel.getName() == null) {
throw new IllegalArgumentException("Channel " + channel + " name cannot be null");
}
if (channelNames.contains(channel.getName())) {
throw new IllegalArgumentException("Channel name already in use " + channel.getName());
}
channelNames.add(channel.getName());
// Register channel ID Mediator with channel mediation unitContainer
IdentityMediationUnitContainer unitContainer = channel.getUnitContainer();
IdentityMediator mediator = channel.getIdentityMediator();
logger.info("Registering channel " + channel+ " with mediator/unitContainer " + mediator + "/" + unitContainer);
channel.getUnitContainer().getMediators().add(mediator);
// Setup Federation Channels (SPs/IDPs)
if (channel instanceof FederationChannel) {
logger.info("Registering Federation channel " + channel);
if (cotMgr == null) {
logger.error("No circle of trust defined. Federation features cannot be configured for channel " + channel.getName() + " !!!");
continue;
}
AbstractFederationChannel fedChannel = (AbstractFederationChannel) channel;
// Some federation channels may not have Metadata files
MetadataEntry md = cotMgr.findEntityRoleMetadata(fedChannel.getMember().getAlias(),
fedChannel.getRole());
if (md != null) {
fedChannel.setMetadata(md);
}
// Federation channels without MD can have a COT
fedChannel.setCircleOfTrust(cotMgr.getCot());
if (fedChannel.getEndpoints() != null) {
for (IdentityMediationEndpoint identityMediationEndpoint : fedChannel.getEndpoints()) {
// Endpoints MUST have unique, not null names!
IdentityMediationEndpointImpl endpoint = (IdentityMediationEndpointImpl) identityMediationEndpoint;
if (endpoint.getName() == null)
throw new IllegalArgumentException("Endpoint name cannot be null " + endpoint);
// TODO : qualify endpoint name with channel name!
if (endpointNames.contains(endpoint.getName())) {
throw new IllegalArgumentException("Endpoint name already in use " + endpoint.getName());
}
endpointNames.add(endpoint.getName());
MetadataEntry endpointMetadata = cotMgr.findEndpointMetadata(fedChannel.getMember().getAlias(),
fedChannel.getRole(),
new EndpointDescriptorImpl(identityMediationEndpoint.getName(),
identityMediationEndpoint.getType(),
identityMediationEndpoint.getBinding()));
endpoint.setMetadata(endpointMetadata);
}
} else {
logger.warn("Federation channel does not define endpoints : " + fedChannel.getName());
}
}
}
// initialize mediation mediation unit container (e.g. create context)
container = this.getContainer();
container.init(this);
// Prepare mediators onto engines and start each one (e.g. create routes and components)
for (Channel channel : channels) {
if (channel.getIdentityMediator() != null) {
logger.info("Setting up endpoints for channel : " + channel.getName());
IdentityMediator mediator = channel.getIdentityMediator();
mediator.setupEndpoints(channel);
} else {
logger.warn("Channel does not have an Identity Mediator");
}
}
// start container
container.start();
logger.info("IDBus Identity Mediation Unit [" + getName() + "] started in " + (System.currentTimeMillis() - now) + "ms");
// Display message in stdout, so that it's shown in command prompt
System.out.println("\n***>> IDBus Identity Mediation Unit [" + getName() + "] started in " + (System.currentTimeMillis() - now) + "ms\n");
} catch (Exception e) {
System.err.println("\n***>> IDBus Identity Mediation Unit [" + getName() + "] initialization error: " + e.getMessage() + "\n");
logger.error("IDBus Identity Mediation Unit [" + getName() + "] initialization error: " + e.getMessage(), e);
if (container != null)
try { container.stop(); } catch (Exception ce) { /* Ignore this */}
throw new IdentityMediationException("IDBus Identity Mediation Unit [" + getName() + "] initialization error:" + e.getMessage(), e);
}
}
@Override
public void destroy() throws Exception {
super.destroy();
IdentityMediationUnitContainer c = this.getContainer();
if (c != null) {
c.stop();
}
}
}