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();
// Exclude the reference that is also known as a spring property
excludedNames.add(propertyElement.getName());
for (String propertyRef : propertyElement.getRefs()) {
if (propertyRefUnresolved(propertyRef, beans, references, scaproperties)) {
// This means an unresolved reference from the spring bean...
for (Reference reference : beanReferences) {
if (propertyElement.getName().equals(reference.getName())) {
// The name of the reference in this case is the string in
// the @ref attribute of the Spring property element, NOT the
// name of the field in the Spring bean....
reference.setName(propertyRef);
componentType.getReferences().add(reference);
break;
} // end if
} // end for
// Store the unresolved references as unresolvedBeanRef in the Spring Implementation type
for (Property scaproperty : beanProperties) {
if (propertyElement.getName().equals(scaproperty.getName())) {
// The name of the reference in this case is the string in
// the @ref attribute of the Spring property element, NOT the
// name of the field in the Spring bean....
Class<?> interfaze =
resolveClass(resolver,
(propertyMap.get(propertyElement.getName()).getType()).getName(),
context);
Reference theReference = createReference(interfaze, propertyRef);
implementation.setUnresolvedBeanRef(propertyRef, theReference);
break;
} // end if
} // end for
} // end if
} // end for
} // end while
Iterator<SpringConstructorArgElement> itcr = beanElement.getCustructorArgs().iterator();
while (itcr.hasNext()) {
SpringConstructorArgElement conArgElement = itcr.next();
for (String constructorArgRef : conArgElement.getRefs()) {
if (propertyRefUnresolved(constructorArgRef, beans, references, scaproperties)) {
for (JavaParameterImpl parameter : constructor.getParameters()) {