Added: 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringContextTie.java
URL: 
http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringContextTie.java?rev=772154&view=auto
==============================================================================
--- 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringContextTie.java
 (added)
+++ 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringContextTie.java
 Wed May  6 11:39:02 2009
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.implementation.spring.runtime.context;
+
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+
+import 
org.apache.tuscany.sca.implementation.spring.processor.ComponentNameAnnotationProcessor;
+import org.apache.tuscany.sca.implementation.spring.processor.ComponentStub;
+import 
org.apache.tuscany.sca.implementation.spring.processor.ConstructorAnnotationProcessor;
+import 
org.apache.tuscany.sca.implementation.spring.processor.InitDestroyAnnotationProcessor;
+import 
org.apache.tuscany.sca.implementation.spring.processor.PropertyAnnotationProcessor;
+import 
org.apache.tuscany.sca.implementation.spring.processor.PropertyValueStub;
+import 
org.apache.tuscany.sca.implementation.spring.processor.ReferenceAnnotationProcessor;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.ConstructorArgumentValues;
+import org.springframework.beans.factory.config.TypedStringValue;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.XmlBeanFactory;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.FileSystemXmlApplicationContext;
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.core.io.UrlResource;
+
+/**
+ * This is the runtime side tie for the corresponding tuscany side stub class.
+ * It enables the Tuscany code to invoke methods on a Spring context without
+ * needing to know about any Spring classes. See the SpringContextStub class
+ * in the implementation-spring module for what the stub does. 
+ */
+public class SpringContextTie {
+
+    private AbstractApplicationContext springContext;
+    private SpringImplementationStub implementation;
+    
+    public SpringContextTie(SpringImplementationStub implementation, URL 
resource) {
+        this.implementation = implementation;
+        SCAParentApplicationContext scaParentContext = new 
SCAParentApplicationContext(implementation);
+        springContext = createApplicationContext(scaParentContext, resource);  
+    }
+
+    public void start() {
+        // Do refresh here to ensure that Spring Beans are not touched before 
the SCA config process is complete...
+        springContext.refresh();
+        springContext.start();
+    }
+
+    public void close() {
+        springContext.close();
+        if (springContext instanceof GenericApplicationContext) {
+            springContext.stop();
+        }
+    }
+
+    /**
+     * Include BeanPostProcessor to deal with SCA Annotations in Spring Bean
+     */
+//    private Object createApplicationContext(SCAParentApplicationContext 
scaParentContext) {
+
+    private AbstractApplicationContext 
createApplicationContext(SCAParentApplicationContext scaParentContext, URL 
resource) {
+
+        XmlBeanFactory beanFactory = new XmlBeanFactory(new 
UrlResource(resource));
+        AbstractApplicationContext appContext = null;
+        
+        for (String bean : beanFactory.getBeanDefinitionNames()) {
+                String beanClassName = (beanFactory.getType(bean)).getName();
+                if (beanClassName.indexOf(".ClassPathXmlApplicationContext") 
!= -1 || 
+                                
beanClassName.indexOf(".FileSystemXmlApplicationContext") != -1) 
+                {
+                        BeanDefinition beanDef = 
beanFactory.getBeanDefinition(bean);                           
+                        String[] listValues = null;
+                        List<ConstructorArgumentValues.ValueHolder> conArgs = 
+                                
beanDef.getConstructorArgumentValues().getGenericArgumentValues();
+                        for (ConstructorArgumentValues.ValueHolder conArg : 
conArgs) {
+                                if (conArg.getValue() instanceof 
TypedStringValue) {
+                                        TypedStringValue value = 
(TypedStringValue) conArg.getValue();
+                                        if (value.getValue().indexOf(".xml") 
!= -1)
+                                                listValues = new 
String[]{value.getValue()};
+                                }
+                                if (conArg.getValue() instanceof ManagedList) {
+                                        Iterator itml = 
((ManagedList)conArg.getValue()).iterator();
+                                        StringBuffer values = new 
StringBuffer();
+                                        while (itml.hasNext()) {
+                                                TypedStringValue next = 
(TypedStringValue)itml.next();
+                                                if 
(next.getValue().indexOf(".xml") != -1) {
+                                                        
values.append(next.getValue());
+                                                        values.append("~");
+                                                }
+                                        }
+                                        listValues = 
(values.toString()).split("~");                                    
+                                }
+                        }
+                        
+                        if 
(beanClassName.indexOf(".ClassPathXmlApplicationContext") != -1) {              
                                                     
+                                appContext = new 
ClassPathXmlApplicationContext(listValues, false, scaParentContext);            
                       
+                                appContext.refresh();
+                                
includeAnnotationProcessors(appContext.getBeanFactory());
+                                return appContext;
+                        } else {
+                                appContext = new 
FileSystemXmlApplicationContext(listValues, false, scaParentContext);           
                       
+                                appContext.refresh();
+                                
includeAnnotationProcessors(appContext.getBeanFactory());
+                                return appContext;
+                        }
+                }               
+        }
+        
+        // use the generic application context as default 
+        includeAnnotationProcessors(beanFactory);
+        appContext = new GenericApplicationContext(beanFactory, 
scaParentContext);
+        return appContext;
+    }
+
+    public Object getBean(String id) throws BeansException {
+        return springContext.getBean(id);
+    }
+
+    /**
+     * Include BeanPostProcessor to deal with SCA Annotations in Spring Bean
+     */
+    private void includeAnnotationProcessors(ConfigurableListableBeanFactory 
beanFactory) {
+        
+        // Processor to deal with @Init and @Destroy SCA Annotations
+        BeanPostProcessor initDestroyProcessor = new 
InitDestroyAnnotationProcessor();
+        beanFactory.addBeanPostProcessor(initDestroyProcessor);
+
+        // Processor to deal with @Reference SCA Annotations
+        ComponentStub component = new 
ComponentStub(implementation.getComponentTie());
+        BeanPostProcessor referenceProcessor = new 
ReferenceAnnotationProcessor(component);
+        beanFactory.addBeanPostProcessor(referenceProcessor);
+        
+        // Processor to deal with @Property SCA Annotations
+        PropertyValueStub pvs = new 
PropertyValueStub(implementation.getPropertyValueTie());
+        BeanPostProcessor propertyProcessor = new 
PropertyAnnotationProcessor(pvs);
+        beanFactory.addBeanPostProcessor(propertyProcessor);
+        
+        // Processor to deal with @ComponentName SCA Annotations
+        BeanPostProcessor componentNameProcessor = new 
ComponentNameAnnotationProcessor(implementation.getComponentName());
+        beanFactory.addBeanPostProcessor(componentNameProcessor);
+        
+        // Processor to deal with @Constructor SCA Annotations
+        BeanPostProcessor constructorProcessor = new 
ConstructorAnnotationProcessor();
+        beanFactory.addBeanPostProcessor(constructorProcessor);         
+    }
+
+}

Added: 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringImplementationStub.java
URL: 
http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringImplementationStub.java?rev=772154&view=auto
==============================================================================
--- 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringImplementationStub.java
 (added)
+++ 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/runtime/context/SpringImplementationStub.java
 Wed May  6 11:39:02 2009
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.implementation.spring.runtime.context;
+
+import java.lang.reflect.Method;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+
+/**
+ * This is the runtime side stub for the corresponding Tuscany-side stub class.
+ * It enables the Spring code in the runtime module to invoke methods on a
+ * Tuscany SpringImplementation without the Spring runtime module
+ * needing to know about any Tuscany classes. See the SpringImplementationTie 
class
+ * in the implementation-spring module for what the tie does. 
+ */
+public class SpringImplementationStub {
+
+    Object tie;
+    Method getURI;
+    Method getBean;
+    Method getComponentName;
+    Method getComponentTie;
+    Method getPropertyValueTie;
+    
+    public SpringImplementationStub(Object tie) {
+        this.tie = tie;
+        Class<?> tieClass = tie.getClass();
+        try {
+            getURI = tieClass.getMethod("getURI", new Class<?>[]{});
+            getBean = tieClass.getMethod("getBean", new 
Class<?>[]{String.class, Class.class});
+            getComponentName = tieClass.getMethod("getComponentName");
+            getComponentTie = tieClass.getMethod("getComponentTie");
+            getPropertyValueTie = tieClass.getMethod("getPropertyValueTie");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    public String getURI() {
+        try {
+
+            return (String)getURI.invoke(tie);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Get a Bean for a reference or for a property.
+     *
+     * @param name - the name of the Bean required
+     * @param requiredType - the required type of the Bean (either a Java 
class or a Java interface)
+     * @return Object - a Bean which matches the requested bean
+     */
+    public Object getBean(String name, Class<?> requiredType) throws 
BeansException {
+        try {
+
+            Object bean = getBean.invoke(tie, new Object[] {name, 
requiredType});
+            if (bean == null) {
+                throw new NoSuchBeanDefinitionException("Unable to find Bean 
with name " + name);
+            }
+            return bean;
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public String getComponentName() {
+        try {
+
+            return (String)getComponentName.invoke(tie);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Object getComponentTie() {
+        try {
+
+            return getComponentTie.invoke(tie);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Object getPropertyValueTie() {
+        try {
+
+            return getPropertyValueTie.invoke(tie);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Added: 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
URL: 
http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers?rev=772154&view=auto
==============================================================================
--- 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
 (added)
+++ 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
 Wed May  6 11:39:02 2009
@@ -0,0 +1 @@
+http\://www.springframework.org/schema/sca=org.apache.tuscany.sca.implementation.spring.namespace.ScaNamespaceHandler

Added: 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.schemas
URL: 
http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.schemas?rev=772154&view=auto
==============================================================================
--- 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.schemas
 (added)
+++ 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.schemas
 Wed May  6 11:39:02 2009
@@ -0,0 +1 @@
+http\://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd=org/springframework/sca/xml/spring-sca.xsd

Added: 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/org/springframework/sca/xml/spring-sca.xsd
URL: 
http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/org/springframework/sca/xml/spring-sca.xsd?rev=772154&view=auto
==============================================================================
--- 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/org/springframework/sca/xml/spring-sca.xsd
 (added)
+++ 
tuscany/branches/sca-java-1.x/modules/implementation-spring-runtime/src/main/resources/org/springframework/sca/xml/spring-sca.xsd
 Wed May  6 11:39:02 2009
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    * 
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    * 
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.    
+-->
+<xsd:schema xmlns="http://www.springframework.org/schema/sca"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";
+    attributeFormDefault="unqualified" elementFormDefault="qualified"
+    targetNamespace="http://www.springframework.org/schema/sca";>
+
+    <xsd:element name="reference">
+        <xsd:complexType>
+            <xsd:attribute name="name" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="type" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="default" use="optional">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="property">
+        <xsd:complexType>
+            <xsd:attribute name="id" use="optional">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="name" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="type" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="service">
+        <xsd:complexType>
+            <xsd:attribute name="name" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="type" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+            <xsd:attribute name="target" use="required">
+                <xsd:simpleType>
+                    <xsd:restriction base="xsd:string" />
+                </xsd:simpleType>
+            </xsd:attribute>
+        </xsd:complexType>
+    </xsd:element>
+
+</xsd:schema>


Reply via email to