private void deployImplementations() {
if (getConfig().getComposite() == null) {
return;
}
for (ComponentModel component : getConfig().getComposite().getComponents()) {
Activator activator = findActivator(component);
if (activator == null) {
continue;
}
List<Policy> requiresImpl = null;
try {
requiresImpl = getPolicyRequirements(component.getImplementation());
} catch (Exception e) {
throw new SwitchYardException(e);
}
Implementation impl = new Implementation(component.getImplementation());
List<ServiceReference> references = new LinkedList<ServiceReference>();
// register a reference for each one declared in the component
for (ComponentReferenceModel reference : component.getReferences()) {
// Create the reference name qualified with component name to ensure uniqueness
QName refName = ComponentNames.qualify(component.getQName(), reference.getQName());
_log.debug("Registering reference " + refName + " for component "
+ component.getImplementation().getType() + " for deployment " + getName());
// Component Reference bindings not allowed, check to see if we find one and throw an exception
List<Model> models = reference.getModelChildren();
for (Model model : models) {
if (BindingModel.class.isAssignableFrom(model.getClass())) {
throw BaseDeployMessages.MESSAGES.componentReferenceBindingsNotAllowed(model.toString(), reference.toString());
}
}
List<Policy> requires = null;
try {
requires = getPolicyRequirements(reference);
} catch (Exception e) {
throw BaseDeployMessages.MESSAGES.unableCollectRequirements(reference.toString(), e);
}
processPolicyDependency(requires, requiresImpl);
validatePolicy(requires, requiresImpl);
ServiceInterface refIntf = getComponentReferenceInterface(reference);
ServiceMetadata metadata = ServiceMetadataBuilder.create()
.security(getDomain().getServiceSecurity(reference.getSecurity()))
.requiredPolicies(requires).registrant(impl)
.build();
ServiceReference svcRef = getDomain().registerServiceReference(refName, refIntf, null, metadata);
boolean wired = false;
// wire a reference if the name is different from promoted name
compositeReferenceLoop: for (CompositeReferenceModel compositeReference : getConfig().getComposite().getReferences()) {
for (ComponentReferenceModel componentReference : compositeReference.getComponentReferences()) {
if (componentReference != null && componentReference.equals(reference)) {
if (!componentReference.getQName().equals(compositeReference.getQName())) {
svcRef.wire(compositeReference.getQName());
wired = true;
break compositeReferenceLoop;
}
}
}
}
// if we didn't wire to a promoted reference, then default to unqualified service name
if (!wired) {
svcRef.wire(ComponentNames.unqualify(svcRef));
}
references.add(svcRef);
}
// register a service for each one declared in the component
if (component.getServices().size() > 1) {
throw BaseDeployMessages.MESSAGES.multipleServicesFound(component.getName());
} else if (component.getServices().size() == 1) {
ComponentServiceModel service = component.getServices().get(0);
_log.debug("Registering service " + service.getQName()
+ " for component " + component.getImplementation().getType() + " for deployment " + getName());
// Component Service bindings not allowed, check to see if we find one and throw an exception
List<Model> models = service.getModelChildren();
for (Model model : models) {
if (BindingModel.class.isAssignableFrom(model.getClass())) {
throw BaseDeployMessages.MESSAGES.componentServiceBindingsNotAllowed(model.toString(), service.toString());
}
}
List<Policy> requires = null;
try {
requires = getPolicyRequirements(service);
processPolicyDependency(requires, requiresImpl);
validatePolicy(requires, requiresImpl);
} catch (Exception e) {
throw new SwitchYardException(e);
}
requires.addAll(requiresImpl);
ServiceHandler handler = activator.activateService(service.getQName(), component);
Activation activation = new Activation(activator, component.getQName(), null, handler);
ServiceInterface serviceIntf = getComponentServiceInterface(service);
ServiceMetadata metadata = ServiceMetadataBuilder.create()
.security(getDomain().getServiceSecurity(service.getSecurity()))
.requiredPolicies(requires)
.registrant(impl)
.build();
Service svc = getDomain().registerService(service.getQName(), serviceIntf, handler, metadata);
activation.addService(svc);
activation.addReferences(references);
// register any service promotions
for (CompositeServiceModel compositeService : getConfig().getComposite().getServices()) {
ComponentServiceModel componentService = compositeService.getComponentService();
if (componentService != null && componentService.equals(service)) {
// avoid duplicates
if (!service.getQName().equals(compositeService.getQName())) {
validateServiceRegistration(compositeService.getQName());
Service promotedService = getDomain().registerService(
compositeService.getQName(), serviceIntf, handler, metadata);
activation.addPromotion(promotedService);
}
}
}
_components.add(activation);
handler.start();
} else {
// we don't have a distinct call for activateReference right now,
// so this catches cases where an implementation has one or more
// references, but no services. (this is pretty crappy)
_log.debug("Activating component " + component.getQName());
activator.activateService(null, component);
// while this is not a service, it will ensure that the component is deactivated
Activation activation = new Activation(activator, component.getQName(), null, null);
activation.addReferences(references);
_components.add(activation);
}