You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2006/08/15 20:45:34 UTC
svn commit: r431666 - in
/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring:
impl/ model/
Author: jmarino
Date: Tue Aug 15 11:45:33 2006
New Revision: 431666
URL: http://svn.apache.org/viewvc?rev=431666&view=rev
Log:
refactor handling of Spring service elements to build up component type info
Modified:
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringComponentTypeLoader.java
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringImplementationLoader.java
incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/model/SpringComponentType.java
Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringComponentTypeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringComponentTypeLoader.java?rev=431666&r1=431665&r2=431666&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringComponentTypeLoader.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringComponentTypeLoader.java Tue Aug 15 11:45:33 2006
@@ -19,24 +19,18 @@
package org.apache.tuscany.container.spring.impl;
import org.osoa.sca.annotations.Constructor;
-import org.osoa.sca.annotations.Remotable;
import org.apache.tuscany.spi.annotation.Autowire;
import org.apache.tuscany.spi.component.CompositeComponent;
import org.apache.tuscany.spi.deployer.DeploymentContext;
import org.apache.tuscany.spi.extension.ComponentTypeLoaderExtension;
+import org.apache.tuscany.spi.loader.LoaderException;
import org.apache.tuscany.spi.loader.LoaderRegistry;
-import org.apache.tuscany.spi.model.InteractionScope;
-import org.apache.tuscany.spi.model.ServiceContract;
-import org.apache.tuscany.spi.model.ServiceDefinition;
-import org.apache.tuscany.spi.model.BoundServiceDefinition;
import org.apache.tuscany.container.spring.config.SCAService;
import org.apache.tuscany.container.spring.config.ScaServiceBeanDefinitionParser;
import org.apache.tuscany.container.spring.model.SpringComponentType;
import org.apache.tuscany.container.spring.model.SpringImplementation;
-import org.apache.tuscany.container.spring.model.SpringServiceContract;
-import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
@@ -61,10 +55,14 @@
return SpringImplementation.class;
}
- /* Major work in progress here */
+ /**
+ * Responsible for loading the Spring composite component type. The the application context is instantiated here as
+ * it is needed to derive component type information. Since the component type is loaded per SCDL entry (i.e.
+ * composite use) one application context instance will be created per Spring composite instance.
+ */
public void load(CompositeComponent<?> parent,
SpringImplementation implementation,
- DeploymentContext deploymentContext) {
+ DeploymentContext deploymentContext) throws LoaderException {
Resource resource = implementation.getApplicationResource();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
@@ -87,59 +85,61 @@
String serviceTypeName = serviceBean.getType();
try {
Class serviceInterface = Class.forName(serviceTypeName, true, deploymentContext.getClassLoader());
- ServiceDefinition service = createService(serviceInterface);
- componentType.getServices().put(serviceName, service);
+ componentType.addServiceType(serviceName, serviceInterface);
+ //ServiceDefinition service = createService(serviceInterface);
+ //componentType.getServices().put(serviceName, service);
} catch (ClassNotFoundException e) {
- // FIXME
- e.printStackTrace();
+ throw new LoaderException(e);
}
}
+ // if no service tags are specified, expose all beans
+ componentType.setExposeAllBeans(componentType.getServiceTypes().isEmpty());
- // If there were no <sca:service> elements, expose all beans as SCA services
- // REVIEW: this needs a lot of refinement; we almost certainly don't want to expose
- // _all_ beans willy nilly.
- if (serviceBeanNames.length == 0) {
- String [] allBeanDefNames = ctx.getBeanDefinitionNames();
- for (String beanDefName : allBeanDefNames) {
- BeanDefinition beanDef = ctx.getBeanDefinition(beanDefName);
- String beanClassName = beanDef.getBeanClassName();
- String beanName = (String) beanDef.getAttribute("name");
- try {
- Class beanClass = Class.forName(beanClassName, true, deploymentContext.getClassLoader());
- Class [] beanInterfaces = beanClass.getInterfaces();
- // hack, just using the 1st impl'ed interface for now
- if (beanInterfaces.length > 0) {
- ServiceDefinition service = createService(beanInterfaces[0]);
- componentType.getServices().put(beanName, service);
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
+// // If there were no <sca:service> elements, expose all beans as SCA services
+// // REVIEW: this needs a lot of refinement; we almost certainly don't want to expose
+// // _all_ beans willy nilly.
+// if (serviceBeanNames.length == 0) {
+// String [] allBeanDefNames = ctx.getBeanDefinitionNames();
+// for (String beanDefName : allBeanDefNames) {
+// BeanDefinition beanDef = ctx.getBeanDefinition(beanDefName);
+// String beanClassName = beanDef.getBeanClassName();
+// String beanName = (String) beanDef.getAttribute("name");
+// try {
+// Class beanClass = Class.forName(beanClassName, true, deploymentContext.getClassLoader());
+// Class [] beanInterfaces = beanClass.getInterfaces();
+// // hack, just using the 1st impl'ed interface for now
+// if (beanInterfaces.length > 0) {
+// ServiceDefinition service = createService(beanInterfaces[0]);
+// componentType.getServices().put(beanName, service);
+// }
+// } catch (ClassNotFoundException e) {
+// e.printStackTrace();
+// }
+// }
+// }
implementation.setComponentType(componentType);
}
- private ServiceDefinition createService(Class<?> interfaze) {
- ServiceDefinition service = new BoundServiceDefinition();
- service.setName(getBaseName(interfaze));
- service.setRemotable(interfaze.getAnnotation(Remotable.class) != null);
- ServiceContract contract = new SpringServiceContract();
- contract.setInterfaceClass(interfaze);
- contract.setInteractionScope(InteractionScope.NONCONVERSATIONAL);
- service.setServiceContract(contract);
- return service;
- }
-
- private String getBaseName(Class<?> implClass) {
- String baseName = implClass.getName();
- int lastDot = baseName.lastIndexOf('.');
- if (lastDot != -1) {
- baseName = baseName.substring(lastDot + 1);
- }
- return baseName;
- }
+// private ServiceDefinition createService(Class<?> interfaze) {
+// ServiceDefinition service = new BoundServiceDefinition();
+// service.setName(getBaseName(interfaze));
+// service.setRemotable(interfaze.getAnnotation(Remotable.class) != null);
+// ServiceContract contract = new SpringServiceContract();
+// contract.setInterfaceClass(interfaze);
+// contract.setInteractionScope(InteractionScope.NONCONVERSATIONAL);
+// service.setServiceContract(contract);
+// return service;
+// }
+//
+// private String getBaseName(Class<?> implClass) {
+// String baseName = implClass.getName();
+// int lastDot = baseName.lastIndexOf('.');
+// if (lastDot != -1) {
+// baseName = baseName.substring(lastDot + 1);
+// }
+// return baseName;
+// }
}
Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java?rev=431666&r1=431665&r2=431666&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringCompositeBuilder.java Tue Aug 15 11:45:33 2006
@@ -60,7 +60,7 @@
// We still need to set the target invoker as opposed to having the connector do it since the
// Spring context is "opaque" to the wiring fabric. In other words, the Spring context does not expose
- // its beans as SCA components to the connector t wire the services to
+ // its beans as SCA components to the connector to wire the services to
for (BoundServiceDefinition<? extends Binding> serviceDefinition : componentType.getServices().values()) {
// call back into builder registry to handle building of services
Service<?> service = (Service) builderRegistry.build(parent, serviceDefinition, deploymentContext);
Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringImplementationLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringImplementationLoader.java?rev=431666&r1=431665&r2=431666&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringImplementationLoader.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/impl/SpringImplementationLoader.java Tue Aug 15 11:45:33 2006
@@ -62,6 +62,7 @@
import org.apache.tuscany.spi.model.BoundServiceDefinition;
import org.apache.tuscany.spi.services.info.RuntimeInfo;
+import org.apache.tuscany.container.spring.model.SpringComponentType;
import org.apache.tuscany.container.spring.model.SpringImplementation;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
@@ -105,6 +106,7 @@
SpringImplementation implementation = new SpringImplementation();
implementation.setApplicationResource(getApplicationContextResource(locationAttr));
registry.loadComponentType(parent, implementation, deploymentContext);
+ SpringComponentType type = implementation.getComponentType();
while (true) {
switch (reader.next()) {
case START_ELEMENT:
@@ -112,6 +114,14 @@
if (SERVICE_ELEMENT.equals(qname)) {
BoundServiceDefinition service =
(BoundServiceDefinition) registry.load(parent, reader, deploymentContext);
+ if (!type.isExposeAllBeans()) {
+ String name = service.getName();
+ if (!type.getServiceTypes().containsKey(name)) {
+ LoaderException e = new LoaderException("No service defined in Spring context for ");
+ e.setIdentifier(name);
+ throw e;
+ }
+ }
implementation.getComponentType().getServices().put(service.getName(), service);
} else if (REFERENCE_ELEMENT.equals(qname)) {
throw new UnsupportedOperationException();
Modified: incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/model/SpringComponentType.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/model/SpringComponentType.java?rev=431666&r1=431665&r2=431666&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/model/SpringComponentType.java (original)
+++ incubator/tuscany/java/sca/containers/container.spring/src/main/java/org/apache/tuscany/container/spring/model/SpringComponentType.java Tue Aug 15 11:45:33 2006
@@ -18,6 +18,9 @@
*/
package org.apache.tuscany.container.spring.model;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.tuscany.spi.model.CompositeComponentType;
import org.apache.tuscany.spi.model.Property;
import org.apache.tuscany.spi.model.ReferenceDefinition;
@@ -33,6 +36,8 @@
P extends Property<?>> extends CompositeComponentType<S, R, P> {
private GenericApplicationContext applicationContext;
+ private Map<String, Class<?>> serviceTypes = new HashMap<String, Class<?>>();
+ private boolean exposeAllBeans;
public SpringComponentType(GenericApplicationContext applicationContext) {
this.applicationContext = applicationContext;
@@ -40,6 +45,22 @@
public GenericApplicationContext getApplicationContext() {
return applicationContext;
+ }
+
+ public Map<String, Class<?>> getServiceTypes() {
+ return serviceTypes;
+ }
+
+ public void addServiceType(String name, Class<?> type) {
+ this.serviceTypes.put(name, type);
+ }
+
+ public boolean isExposeAllBeans() {
+ return exposeAllBeans;
+ }
+
+ public void setExposeAllBeans(boolean exposeAllBeans) {
+ this.exposeAllBeans = exposeAllBeans;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org