Author: antelder
Date: Wed Feb 23 12:42:38 2011
New Revision: 1073721
URL: http://svn.apache.org/viewvc?rev=1073721&view=rev
Log:
Handle the case where the sca service type attribute is not specified. I'm
going to raise a spec querry about the bean improspection rules in this
situation
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java?rev=1073721&r1=1073720&r2=1073721&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
Wed Feb 23 12:42:38 2011
@@ -49,6 +49,7 @@ import org.apache.tuscany.sca.assembly.M
import org.apache.tuscany.sca.assembly.Property;
import org.apache.tuscany.sca.assembly.Reference;
import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.common.java.reflection.JavaIntrospectionHelper;
import org.apache.tuscany.sca.contribution.Artifact;
import org.apache.tuscany.sca.contribution.ContributionFactory;
import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
@@ -81,6 +82,7 @@ import org.apache.tuscany.sca.monitor.Pr
import org.apache.tuscany.sca.policy.Intent;
import org.apache.tuscany.sca.policy.PolicyFactory;
import org.apache.tuscany.sca.policy.PolicySet;
+import org.oasisopen.sca.annotation.Remotable;
/**
* Introspects a Spring XML application-context configuration file to create
<implementation-spring../>
@@ -99,6 +101,8 @@ public class SpringXMLComponentTypeLoade
private SpringBeanIntrospector beanIntrospector;
private SpringXMLBeanDefinitionLoader xmlBeanDefinitionLoader;
+
+ private JavaIntrospectionHelper javaIntrospectionHelper;
public SpringXMLComponentTypeLoader(ExtensionPointRegistry registry) {
super();
@@ -110,6 +114,7 @@ public class SpringXMLComponentTypeLoade
this.contributionFactory =
factories.getFactory(ContributionFactory.class);
this.xmlBeanDefinitionLoader =
registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(SpringXMLBeanDefinitionLoader.class);
+ this.javaIntrospectionHelper =
JavaIntrospectionHelper.getInstance(registry);
}
/**
@@ -340,7 +345,14 @@ public class SpringXMLComponentTypeLoade
Iterator<SpringSCAServiceElement> its = services.iterator();
while (its.hasNext()) {
SpringSCAServiceElement serviceElement = its.next();
- Class<?> interfaze = resolveClass(resolver,
serviceElement.getType(), context);
+
+ Class<?> interfaze;
+ if (serviceElement.getType() != null) {
+ interfaze = resolveClass(resolver,
serviceElement.getType(), context);
+ } else {
+ interfaze = getBeanInterface(resolver,
serviceElement.getTarget(), beans, 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
@@ -594,7 +606,31 @@ public class SpringXMLComponentTypeLoade
return;
} // end method generateComponentType
- /*
+ private Class<?> getBeanInterface(ModelResolver resolver, String target,
List<SpringBeanElement> beans, ProcessorContext context) throws
ClassNotFoundException {
+ SpringBeanElement bean = null;
+ for (SpringBeanElement sbe : beans) {
+ if (sbe.getId().equals(target)) {
+ bean = sbe;
+ break;
+ }
+ }
+ if (bean == null) {
+ error(context.getMonitor(), "TargetBeanDoesNotExist", null,
target);
+ return null;
+ }
+
+ Class<?> beanClass = resolveClass(resolver, bean.getClassName(),
context);
+ Set<Class<?>> ifaces =
javaIntrospectionHelper.getAllInterfaces(beanClass);
+ for (Class<?> interfaze : ifaces) {
+ if (interfaze.isAnnotationPresent(Remotable.class)) {
+ return interfaze;
+ }
+ }
+
+ return beanClass;
+ }
+
+ /*
* Determines whether a reference attribute of a Spring property element
is resolved either
* by a bean in the application context or by an SCA reference element or
by an SCA property
* element