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