List<ServiceDependencyMetaData> dependencies = new ArrayList<ServiceDependencyMetaData>();
// CCM for CachedConnectionInterceptor dependency
// TODO: this should be injected directly to the interceptor
if( ccmServiceName != null && ccmServiceName.length() > 0 )
{
ServiceDependencyMetaData ccm = new ServiceDependencyMetaData();
ccm.setIDependOn(ccmServiceName);
dependencies.add(ccm);
}
// Add dependencies on the invoker services in use
JBossEnterpriseBeansMetaData beans = deployment.getEnterpriseBeans();
Iterator<JBossEnterpriseBeanMetaData> beansIter = beans.iterator();
HashSet<String> invokerNames = new HashSet<String>();
HashSet<String> beanDepends = new HashSet<String>();
// Process ContainerDependencyMetaData
VFSDeploymentUnit topUnit = unit.getTopLevel();
Map<String, ContainerDependencyMetaData> endpoints = (Map<String, ContainerDependencyMetaData>) topUnit.getAttachment(MappedReferenceMetaDataResolverDeployer.ENDPOINT_MAP_KEY);
if(endpoints == null)
log.warn(unit+" has no ContainerDependencyMetaData attachment");
String vfsPath = unit.getRelativePath();
ArrayList<BeanMetaData> mcBeanMD = new ArrayList<BeanMetaData>();
while( beansIter.hasNext() )
{
JBossEnterpriseBeanMetaData bmd = beansIter.next();
Set<String> depends = bmd.getDepends();
if (depends != null)
beanDepends.addAll(depends);
String configName = bmd.getConfigurationName();
ContainerConfigurationMetaData cmd = bmd.determineContainerConfiguration();
Set<String> invokers = cmd.getInvokerProxyBindingNames();
if(invokers != null)
for(String iname : invokers)
{
InvokerProxyBindingMetaData imd = deployment.getInvokerProxyBinding(iname);
if (imd == null)
throw new DeploymentException("Failed to locate invoker: "+iname);
String invokerName = imd.getInvokerMBean();
if( invokerName.equalsIgnoreCase("default") )
{
// TODO: JBAS-4306 hack to ingore the invalid default invoker-mbean
continue;
}
if( invokerNames.contains(invokerName) == false )
{
invokerNames.add(invokerName);
ServiceDependencyMetaData invoker = new ServiceDependencyMetaData();
invoker.setIDependOn(invokerName);
dependencies.add(invoker);
}
}
// Create mc beans that declare the container ejb jndi name supplies
if(endpoints != null)
{
String ejbKey = "ejb/" + vfsPath + "#" + bmd.getEjbName();
ContainerDependencyMetaData cdmd = endpoints.get(ejbKey);
if(cdmd != null)
{
// Create the metadata for the bean to install
String mcname = ejbKey + ",uid"+System.identityHashCode(bmd);
BeanMetaDataBuilder builder = BeanMetaDataBuilderFactory.createBuilder(mcname, Ejb2xMCContainer.class.getName());
for(String jndiName : cdmd.getJndiNames())
{
String supplyName = "jndi:" + jndiName;
builder.addSupply(supplyName);
}
BeanMetaData mcbmd = builder.getBeanMetaData();
log.info("installing bean: " + mcname);
log.info(" with dependencies:");
log.info(" and supplies:");
for(SupplyMetaData smd : mcbmd.getSupplies())
{
log.info("\t" + smd.getSupply());
}
mcBeanMD.add(mcbmd);
}
}
}
// Add any declared dependencies
/* TODO: this is too coarse as bean to bean depends are being pulled up to the module level
and an ejb module cannot depend on the beans it creates. The ejb deployer needs to
be refactored into a component based deployer.
*/
try
{
for(String depend : beanDepends)
{
ObjectName n = new ObjectName(depend);
ServiceDependencyMetaData sdmd = new ServiceDependencyMetaData();
sdmd.setIDependOn(n.toString());
dependencies.add(sdmd);
}
}
catch(MalformedObjectNameException e)
{