diff options
Diffstat (limited to '')
3 files changed, 161 insertions, 133 deletions
diff --git a/sca-java-2.x/trunk/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServlet.java b/sca-java-2.x/trunk/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServlet.java index d20019372e..6da546d11a 100644 --- a/sca-java-2.x/trunk/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServlet.java +++ b/sca-java-2.x/trunk/modules/host-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/TuscanyServlet.java @@ -26,6 +26,8 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; +import org.apache.tuscany.sca.node.Node; + /** * A Servlet that provides a hook to control the lifecycle of Tuscany node @@ -37,6 +39,7 @@ public class TuscanyServlet extends HttpServlet { private Logger logger = Logger.getLogger(TuscanyServlet.class.getName()); private transient WebContextConfigurator configurator; + private transient Node node; public TuscanyServlet() { super(); @@ -47,7 +50,7 @@ public class TuscanyServlet extends HttpServlet { try { super.init(config); configurator = WebAppHelper.getConfigurator(this); - WebAppHelper.init(configurator); + node = WebAppHelper.init(configurator); } catch (Throwable e) { logger.log(Level.SEVERE, e.getMessage(), e); configurator.getServletContext().log(e.getMessage(), e); @@ -57,6 +60,13 @@ public class TuscanyServlet extends HttpServlet { public void destroy() { WebAppHelper.stop(configurator); + node = null; + configurator = null; + super.destroy(); + } + + public Node getNode() { + return node; } } diff --git a/sca-java-2.x/trunk/modules/implementation-spring-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/spring/TuscanyDispatcherServlet.java b/sca-java-2.x/trunk/modules/implementation-spring-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/spring/TuscanyDispatcherServlet.java index e15840f613..9976ab0100 100644 --- a/sca-java-2.x/trunk/modules/implementation-spring-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/spring/TuscanyDispatcherServlet.java +++ b/sca-java-2.x/trunk/modules/implementation-spring-webapp/src/main/java/org/apache/tuscany/sca/host/webapp/spring/TuscanyDispatcherServlet.java @@ -27,6 +27,7 @@ import javax.servlet.ServletException; import org.apache.tuscany.sca.host.webapp.WebAppHelper; import org.apache.tuscany.sca.host.webapp.WebContextConfigurator; +import org.apache.tuscany.sca.node.Node; import org.springframework.web.servlet.DispatcherServlet; /** @@ -39,6 +40,7 @@ public class TuscanyDispatcherServlet extends DispatcherServlet { private Logger logger = Logger.getLogger(TuscanyDispatcherServlet.class.getName()); private transient WebContextConfigurator configurator; + private transient Node node; public TuscanyDispatcherServlet() { super(); @@ -49,7 +51,7 @@ public class TuscanyDispatcherServlet extends DispatcherServlet { try { super.init(config); configurator = WebAppHelper.getConfigurator(this); - WebAppHelper.init(configurator); + node = WebAppHelper.init(configurator); } catch (Throwable e) { logger.log(Level.SEVERE, e.getMessage(), e); configurator.getServletContext().log(e.getMessage(), e); @@ -59,7 +61,13 @@ public class TuscanyDispatcherServlet extends DispatcherServlet { public void destroy() { WebAppHelper.stop(configurator); + node = null; + configurator = null; super.destroy(); } + public Node getNode() { + return node; + } + } diff --git a/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java b/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java index 2a90886394..8c58ef0cf9 100644 --- a/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java +++ b/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java @@ -101,7 +101,7 @@ public class SpringXMLComponentTypeLoader { private SpringBeanIntrospector beanIntrospector; private SpringXMLBeanDefinitionLoader xmlBeanDefinitionLoader; - + private JavaIntrospectionHelper javaIntrospectionHelper; public SpringXMLComponentTypeLoader(ExtensionPointRegistry registry) { @@ -136,6 +136,7 @@ public class SpringXMLComponentTypeLoader { monitor.problem(problem); } } + /** * Report a error. * @@ -155,6 +156,7 @@ public class SpringXMLComponentTypeLoader { monitor.problem(problem); } } + protected Class<SpringImplementation> getImplementationClass() { return SpringImplementation.class; } @@ -226,11 +228,11 @@ public class SpringXMLComponentTypeLoader { if (xmlBeanDefinitionLoader != null) { xmlBeanDefinitionLoader.load(contextResources, - appCxtServices, - appCxtReferences, - appCxtProperties, - appCxtBeans, - context); + appCxtServices, + appCxtReferences, + appCxtProperties, + appCxtBeans, + context); populatePolicies(appCxtServices, appCxtReferences); } // Validate the beans from individual application context for uniqueness @@ -266,7 +268,7 @@ public class SpringXMLComponentTypeLoader { e.getPolicySets().add(ps); } } - + for (SpringSCAServiceElement e : appCxtServices) { for (QName qn : e.getIntentNames()) { Intent intent = policyFactory.createIntent(); @@ -352,7 +354,7 @@ public class SpringXMLComponentTypeLoader { } 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 @@ -381,7 +383,7 @@ public class SpringXMLComponentTypeLoader { } } } // 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 @@ -480,118 +482,123 @@ public class SpringXMLComponentTypeLoader { } // 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; + // [rfeng] We only try to implicitly map Spring beans if no sca:reference or sca:property is present + if (references.isEmpty() && scaproperties.isEmpty()) { + itb = beans.iterator(); + while (itb.hasNext()) { + SpringBeanElement beanElement = itb.next(); - ComponentType beanComponentType = assemblyFactory.createComponentType(); + // 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; - 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 + ComponentType beanComponentType = assemblyFactory.createComponentType(); - 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()) { - String paramType = parameter.getType().getName(); - Class<?> interfaze = resolveClass(resolver, paramType, context); - // Create a component type reference/property if the constructor-arg element has a - // type attribute OR index attribute declared... - if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) || (conArgElement - .getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex()))) { - // [rfeng] Commenting out the following code as the constructor parameter based SCA - // references are added already - /* - if (parameter.getClassifer() == org.oasisopen.sca.annotation.Reference.class) { - Reference theReference = createReference(interfaze, constructorArgRef); - componentType.getReferences().add(theReference); - } - */ - if (parameter.getClassifer() == org.oasisopen.sca.annotation.Property.class) { - // Store the unresolved references as unresolvedBeanRef in the Spring Implementation type - // we might need to verify with the component definition later. - Reference theReference = createReference(interfaze, constructorArgRef); - implementation.setUnresolvedBeanRef(constructorArgRef, theReference); + 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); + // reference.setWiredByImpl(true); + 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()) { + String paramType = parameter.getType().getName(); + Class<?> interfaze = resolveClass(resolver, paramType, context); + // Create a component type reference/property if the constructor-arg element has a + // type attribute OR index attribute declared... + if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) || (conArgElement + .getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex()))) { + // [rfeng] Commenting out the following code as the constructor parameter based SCA + // references are added already + /* + if (parameter.getClassifer() == org.oasisopen.sca.annotation.Reference.class) { + Reference theReference = createReference(interfaze, constructorArgRef); + componentType.getReferences().add(theReference); + } + */ + if (parameter.getClassifer() == org.oasisopen.sca.annotation.Property.class) { + // Store the unresolved references as unresolvedBeanRef in the Spring Implementation type + // we might need to verify with the component definition later. + Reference theReference = createReference(interfaze, constructorArgRef); + implementation.setUnresolvedBeanRef(constructorArgRef, theReference); + } } - } - } // end for - } // end if - } // end for - } // end while - - // [rfeng] Add the remaining introspected references (w/ @Reference but without Spring property ref) - for (Reference ref : beanReferences) { - if (!excludedNames.contains(ref.getName()) && componentType.getReference(ref.getName()) == null) { - // Only add the ones that not listed by sca:reference - componentType.getReferences().add(ref); + } // end for + } // end if + } // end for + } // end while + + // [rfeng] Add the remaining introspected references (w/ @Reference but without Spring property ref) + for (Reference ref : beanReferences) { + if (!excludedNames.contains(ref.getName()) && componentType.getReference(ref.getName()) == null) { + // Only add the ones that not listed by sca:reference + componentType.getReferences().add(ref); + } } - } - } // end while + } // end while + } } catch (ClassNotFoundException e) { // Means that either an interface class, property class or a bean was not found @@ -606,31 +613,34 @@ public class SpringXMLComponentTypeLoader { 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; - } - + 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 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 |