You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ed...@apache.org on 2007/06/05 07:58:59 UTC

svn commit: r544394 - /incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/

Author: edwardsmj
Date: Mon Jun  4 22:58:58 2007
New Revision: 544394

URL: http://svn.apache.org/viewvc?view=rev&rev=544394
Log:
First working version of Spring implementation - services supported, but not references

Modified:
    incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringArtifactProcessor.java
    incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementation.java
    incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProvider.java
    incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProviderFactory.java
    incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringInvoker.java

Modified: incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringArtifactProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringArtifactProcessor.java?view=diff&rev=544394&r1=544393&r2=544394
==============================================================================
--- incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringArtifactProcessor.java (original)
+++ incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringArtifactProcessor.java Mon Jun  4 22:58:58 2007
@@ -39,6 +39,7 @@
 import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
 import org.apache.tuscany.implementation.spi.AbstractStAXArtifactProcessor;
 import org.apache.tuscany.implementation.spi.ResourceHelper;
+import org.apache.tuscany.implementation.spring.xml.SpringXMLComponentTypeLoader;
 import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
 
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;

Modified: incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementation.java?view=diff&rev=544394&r1=544393&r2=544394
==============================================================================
--- incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementation.java (original)
+++ incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementation.java Mon Jun  4 22:58:58 2007
@@ -19,6 +19,7 @@
 package org.apache.tuscany.implementation.spring;
 
 import java.util.List;
+import java.util.Hashtable;
 
 import org.apache.tuscany.sca.assembly.ComponentType;
 import org.apache.tuscany.sca.assembly.Implementation;
@@ -26,6 +27,10 @@
 import org.apache.tuscany.sca.assembly.Service;
 import org.apache.tuscany.sca.assembly.impl.ComponentTypeImpl;
 
+import org.springframework.core.io.Resource;
+
+import org.apache.tuscany.implementation.spring.xml.SpringBeanElement;
+
 /**
  * Represents a Spring implementation.
  * 
@@ -33,13 +38,19 @@
  */
 public class SpringImplementation  extends ComponentTypeImpl implements Implementation {
 
-	/* The location attribute which points to the Spring application-context XML file */
+	// The location attribute which points to the Spring application-context XML file
     private String springLocation;
+    // The application-context file as a Spring Resource
+    private Resource resource;
     private ComponentType componentType;
+    // Mapping of Services to Beans
+    private Hashtable<String,SpringBeanElement> serviceMap;
 
     protected SpringImplementation() {
         this.springLocation = null;
+        this.resource = null;
         setUnresolved(true);
+        serviceMap = new Hashtable<String,SpringBeanElement>();
     }
 
     /* Returns the location attribute for this Spring implementation */
@@ -55,6 +66,14 @@
     	this.springLocation = location;
         return;
     }
+    
+    public void setResource( Resource resource ) {
+    	this.resource = resource;
+    }
+    
+    public Resource getResource() {
+    	return resource;
+    }
 
     /* 
      * Returns the componentType for this Spring implementation 
@@ -76,5 +95,24 @@
 
     public List<Reference> getReferences() {
         return componentType.getReferences();
+    }
+    
+    /**
+     * Returns the Spring Bean which implements a particular service
+     * @param service the service
+     * @return the bean which implements the service, as a SpringBeanElement
+     */
+    public SpringBeanElement getBeanFromService( Service service ) {
+    	SpringBeanElement theBean = serviceMap.get( service.getName() );
+    	return theBean;
+    }
+    
+    /**
+     * Sets the mapping from a service to the Spring Bean that implements the service
+     * @param service the service
+     * @param theBean a SpringBeanElement for the Bean implementing the service
+     */
+    public void setBeanForService( Service service, SpringBeanElement theBean ) {
+    	serviceMap.put( service.getName(), theBean );
     }
 }

Modified: incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProvider.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProvider.java?view=diff&rev=544394&r1=544393&r2=544394
==============================================================================
--- incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProvider.java (original)
+++ incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProvider.java Mon Jun  4 22:58:58 2007
@@ -14,33 +14,58 @@
 import org.apache.tuscany.sca.provider.ImplementationProvider;
 import org.osoa.sca.ComponentContext;
 
-// TODO - create a working version of this invoker...
+import org.springframework.context.support.AbstractApplicationContext;
+
+// TODO - create a working version of this class...
+/**
+ * A provider class for runtime Spring implementation instances
+ */
 public class SpringImplementationProvider implements ImplementationProvider {
-    private SpringImplementation implementation;
-    private RuntimeComponent component;
+    private SpringImplementation 	implementation;
+    private RuntimeComponent 		component;
+    
+    // A Spring application context object
+    private AbstractApplicationContext springContext;
     
+    /**
+     * Constructor for the provider - takes a component definition and a Spring implementation
+     * description
+     * @param component - the component in the assembly
+     * @param implementation - the implementation
+     */
     public SpringImplementationProvider( RuntimeComponent component,
                                          SpringImplementation implementation ) {
         super();
         this.implementation = implementation;
-        this.component = component;
+        this.component 		= component;
+        SCAParentApplicationContext scaParentContext = 
+            	new SCAParentApplicationContext( implementation );
+        springContext = new SCAApplicationContext(scaParentContext, implementation.getResource() );
     } // end constructor
 
     public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
-        return new SpringInvoker(this, operation);
+        return new SpringInvoker( component, springContext, service, operation );
     }
 
     public Invoker createCallbackInvoker(Operation operation) {
-        return new SpringInvoker(this, operation);
+        return new SpringInvoker( component, springContext, null, operation );
     }
     
-
+    /**
+     * Start this Spring implementation instance
+     */
     public void start() {
-        // TODO
-    }
+        springContext.start();
+        System.out.println("SpringImplementationProvider: Spring context started");
+    } // end method start()
 
+    /**
+     * Stop this implementation instance
+     */
     public void stop() {
-        // TODO
-    }
+        // TODO - complete 
+    	springContext.stop();
+    	System.out.println("SpringImplementationProvider: Spring context stopped");
+    } // end method stop
 
 } // end class SpringImplementationProvider

Modified: incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProviderFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProviderFactory.java?view=diff&rev=544394&r1=544393&r2=544394
==============================================================================
--- incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProviderFactory.java (original)
+++ incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringImplementationProviderFactory.java Mon Jun  4 22:58:58 2007
@@ -11,15 +11,29 @@
  */
 public class SpringImplementationProviderFactory implements ImplementationProviderFactory<SpringImplementation> {
 
+	/**
+	 * Simple constructor
+	 *
+	 */
     public SpringImplementationProviderFactory() {
         super();
-    }
+    } 
 
+    /**
+     * Returns a SpringImplementationProvider for a given component and Spring implementation
+     * @param component the component for which implementation instances are required
+     * @param implementation the Spring implementation with details of the component
+     * implementation
+     * @return the SpringImplementationProvider for the specified component
+     */
     public ImplementationProvider createImplementationProvider(RuntimeComponent component,
                                                                SpringImplementation implementation) {
         return new SpringImplementationProvider( component, implementation );
     }
 
+    /**
+     * Returns the class of the Spring implementation
+     */
     public Class<SpringImplementation> getModelType() {
         return SpringImplementation.class;
     }

Modified: incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringInvoker.java?view=diff&rev=544394&r1=544393&r2=544394
==============================================================================
--- incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringInvoker.java (original)
+++ incubator/tuscany/sandbox/implementation-spring2/src/main/java/org/apache/tuscany/implementation/spring/SpringInvoker.java Mon Jun  4 22:58:58 2007
@@ -1,38 +1,101 @@
 package org.apache.tuscany.implementation.spring;
 
 
-import javax.script.Invocable;
-import javax.script.ScriptException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 
-import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.core.invocation.ThreadMessageContext;
+import org.apache.tuscany.sca.interfacedef.ConversationSequence;
 import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
 import org.apache.tuscany.sca.invocation.Invoker;
 import org.apache.tuscany.sca.invocation.Message;
-
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.scope.InstanceWrapper;
+
+import org.apache.tuscany.implementation.spring.xml.SpringBeanElement;
+
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.beans.BeansException;
+
+/**
+ * Initial implementation of a Spring bean invoker
+ * @author MikeEdwards
+ *
+ */
 public class SpringInvoker implements Invoker {
 	
-	private SpringImplementationProvider provider;
-	private Operation operation;
+	private Method					theMethod;
+	private Object					bean;
+	private SpringBeanElement		beanElement;
+	private boolean					badInvoker = false;
 	
-    public SpringInvoker(SpringImplementationProvider provider, Operation operation) {
-        this.provider = provider;
+	/**
+	 * SpringInvoker constructor
+	 * @param component - the Spring component to invoke
+	 * @param service - the service to invoke
+	 * @param operation - the operation to invoke
+	 */
+    public SpringInvoker( RuntimeComponent component,
+    					  AbstractApplicationContext springContext,
+    					  RuntimeComponentService service, 
+    					  Operation operation) {
+
+        // From the component and the service, identify the Spring Bean which is the target
+        SpringImplementation theImplementation = (SpringImplementation) component.getImplementation();
+        beanElement = theImplementation.getBeanFromService( service.getService() );
         
-        // Use the Operation instead of the Operation name as it may be a dynamic
-        // operation so the name may change at runtime
-        this.operation = operation;
-    }
-
-    private Object doInvoke(Object[] objects) throws ScriptException {
-    	// TODO
-    	Object response = new Object();
-
-        return response;
-    }
-
+        if( beanElement == null ) {
+        	badInvoker = true;
+        	return;
+        }
+        // Now load the class for the bean and get the method relating to the operation....
+        try {
+        	bean = springContext.getBean( beanElement.getId() );
+            Class<?> beanClass = bean.getClass();
+            theMethod = JavaInterfaceUtil.findMethod( beanClass, operation );
+            System.out.println("SpringInvoker - found method " + theMethod.getName() );
+        } catch ( BeansException e ) {
+        	badInvoker = true;
+        } catch ( NoSuchMethodException e ) {
+        	badInvoker = true;
+        }
+    } // end constructor SpringInvoker
+
+    private Object doInvoke(Object payload) throws SpringInvocationException {
+    	if( badInvoker ) throw new SpringInvocationException("Spring invoker incorrectly configured");
+    	// Invoke the method on the Spring bean using the payload, returning the results
+        try {
+            Object ret;
+
+            if (payload != null && !payload.getClass().isArray()) {
+                ret = theMethod.invoke(bean, payload);
+            } else {
+                ret = theMethod.invoke(bean, (Object[])payload);
+            }
+            return ret;
+        } catch (InvocationTargetException e) {
+            throw new SpringInvocationException( e.getMessage() );
+        } catch (Exception e) {
+            throw new SpringInvocationException( e.getMessage() );
+        }
+
+    } // end method doInvoke
+
+    /**
+     * @param msg the message to invoke on the target bean
+     */
     public Message invoke(Message msg) {
-    	// TODO
+        try {
+            Object resp = doInvoke(msg.getBody());
+            msg.setBody(resp);
+        } catch (SpringInvocationException e) {
+            msg.setFaultBody(e.getCause());
+        }
+        System.out.println("Spring Invoker - invoke called");
         return msg;
-    }
+    } // end method invoke
 
 
-}
+} // end class SpringInvoker



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org