* 6. Each bean property which is not a reference and which is not pointing
* at another bean in the application context becomes a property in the component type
*/
JavaImplementation javaImplementation = null;
ComponentType componentType = implementation.getComponentType();
try {
// Deal with the services first....
Iterator<SpringSCAServiceElement> its = services.iterator();
while (its.hasNext()) {
SpringSCAServiceElement serviceElement = its.next();
Class<?> interfaze = resolveClass(resolver, serviceElement.getType(), context);
Service theService = createService(interfaze, serviceElement.getName());
// Spring allows duplication of bean definitions in multiple context scenario,
// in such cases, the latest bean definition overrides the older ones, hence
// we will remove any older definition and use the latest.
Service duplicate = null;
for (Service service : componentType.getServices()) {
if (service.getName().equals(theService.getName()))
duplicate = service;
}
if (duplicate != null)
componentType.getServices().remove(duplicate);
componentType.getServices().add(theService);
// Add this service to the Service / Bean map
String beanName = serviceElement.getTarget();
boolean found = false;
for (SpringBeanElement beanElement : beans) {
if (beanName.equals(beanElement.getId())) {
if (isValidBeanForService(beanElement)) {
// add the required intents and policySets for the service
theService.getRequiredIntents().addAll(serviceElement.getRequiredIntents());
theService.getPolicySets().addAll(serviceElement.getPolicySets());
implementation.setBeanForService(theService, beanElement);
found = true;
break;
}
}
} // end for
if (!found) {
// REVIEW: Adding a SpringBeanElement "proxy" so that the bean id can be used at runtime to look
// up the bean instance from the parent context
implementation.setBeanForService(theService,
new SpringBeanElement(serviceElement.getTarget(), null));
}
} // end while
// Next handle the references
Iterator<SpringSCAReferenceElement> itr = references.iterator();
while (itr.hasNext()) {
SpringSCAReferenceElement referenceElement = itr.next();
Class<?> interfaze = resolveClass(resolver, referenceElement.getType(), context);
Reference theReference = createReference(interfaze, referenceElement.getName());
// Override the older bean definition with the latest ones
// for the duplicate definitions found.
Reference duplicate = null;
for (Reference reference : componentType.getReferences()) {
if (reference.getName().equals(theReference.getName()))
duplicate = reference;
}
if (duplicate != null)
componentType.getReferences().remove(duplicate);
// add the required intents and policySets for this reference
theReference.getRequiredIntents().addAll(referenceElement.getRequiredIntents());
theReference.getPolicySets().addAll(referenceElement.getPolicySets());
componentType.getReferences().add(theReference);
} // end while
// Next handle the properties
Iterator<SpringSCAPropertyElement> itsp = scaproperties.iterator();
while (itsp.hasNext()) {
SpringSCAPropertyElement scaproperty = itsp.next();
// Create a component type property if the SCA property element has a name
// and a type declared...
if (scaproperty.getType() != null && scaproperty.getName() != null) {
Property theProperty = assemblyFactory.createProperty();
theProperty.setName(scaproperty.getName());
// Get the Java class and then an XSD element type for the property
Class<?> propType = Class.forName(scaproperty.getType());
theProperty.setXSDType(JavaXMLMapper.getXMLType(propType));
// Override the older bean definition with the latest ones
// for the duplicate definitions found.
Property duplicate = null;
for (Property property : componentType.getProperties()) {
if (property.getName().equals(theProperty.getName()))
duplicate = property;
}
if (duplicate != null)
componentType.getProperties().remove(duplicate);
componentType.getProperties().add(theProperty);
// Remember the Java Class (ie the type) for this property
implementation.setPropertyClass(theProperty.getName(), propType);
} // end if
} // end while
// Finally deal with the beans
Iterator<SpringBeanElement> itb;
// If there are no explicit service elements, then expose all the beans
if (services.isEmpty()) {
itb = beans.iterator();
// Loop through all the beans found
while (itb.hasNext()) {
SpringBeanElement beanElement = itb.next();
// If its not a valid bean for service, ignore it
if (!isValidBeanForService(beanElement)) {
continue;
}
try {
// Load the Spring bean class
Class<?> beanClass = resolveClass(resolver, beanElement.getClassName(), context);
// Introspect the bean
beanIntrospector = new SpringBeanIntrospector(registry, beanElement.getCustructorArgs());
ComponentType beanComponentType = assemblyFactory.createComponentType();
javaImplementation = beanIntrospector.introspectBean(beanClass, beanComponentType);
// Set the service name as bean name
for (Service componentService : beanComponentType.getServices()) {
componentService.setName(beanElement.getId());
}
// Get the service interface defined by this Spring Bean and add to
// the component type of the Spring Assembly
List<Service> beanServices = beanComponentType.getServices();
componentType.getServices().addAll(beanServices);
// Add these services to the Service / Bean map
for (Service beanService : beanServices) {
implementation.setBeanForService(beanService, beanElement);
}
} catch (Throwable e) {
// [rfeng] FIXME: Some Spring beans have constructors that take pararemters injected by Spring and
// Tuscany is not happy with that during the introspection
log.log(Level.SEVERE, e.getMessage(), e);
}
} // end while
} // end if
itb = beans.iterator();
while (itb.hasNext()) {
SpringBeanElement beanElement = itb.next();
// If its not a valid bean for service, ignore it
if (!isValidBeanForService(beanElement)) {
continue;
}
// Ignore if the bean has no properties and constructor arguments
if (beanElement.getProperties().isEmpty() && beanElement.getCustructorArgs().isEmpty())
continue;
ComponentType beanComponentType = assemblyFactory.createComponentType();
try {
Class<?> beanClass = resolveClass(resolver, beanElement.getClassName(), context);
// Introspect the bean
beanIntrospector = new SpringBeanIntrospector(registry, beanElement.getCustructorArgs());
javaImplementation = beanIntrospector.introspectBean(beanClass, beanComponentType);
} catch (Exception e) {
// [rfeng] FIXME: Some Spring beans have constructors that take pararemters injected by Spring and
// Tuscany is not happy with that during the introspection
log.log(Level.SEVERE, e.getMessage(), e);
continue;
}
Map<String, JavaElementImpl> propertyMap = javaImplementation.getPropertyMembers();
JavaConstructorImpl constructor = javaImplementation.getConstructor();
// Get the references by this Spring Bean and add the unresolved ones to
// the component type of the Spring Assembly
List<Reference> beanReferences = beanComponentType.getReferences();
List<Property> beanProperties = beanComponentType.getProperties();
Set<String> excludedNames = new HashSet<String>();
Iterator<SpringPropertyElement> itp = beanElement.getProperties().iterator();
while (itp.hasNext()) {
SpringPropertyElement propertyElement = itp.next();