Author: rfeng
Date: Tue Aug 24 22:34:52 2010
New Revision: 988747

URL: http://svn.apache.org/viewvc?rev=988747&view=rev
Log:
Populate intents and policySets from sca:reference and sca:service elements

Modified:
    
tuscany/sca-java-2.x/trunk/itest/implementation-spring/src/main/resources/sca/services/META-INF/spring/SpringExplicitService-context.xml
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaNamespaceHandler.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaReferenceBeanDefinitionParser.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaServiceBeanDefinitionParser.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/processor/SpringXMLBeanDefinitionLoaderImpl.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAReferenceElement.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAServiceElement.java
    
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java

Modified: 
tuscany/sca-java-2.x/trunk/itest/implementation-spring/src/main/resources/sca/services/META-INF/spring/SpringExplicitService-context.xml
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/implementation-spring/src/main/resources/sca/services/META-INF/spring/SpringExplicitService-context.xml?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/itest/implementation-spring/src/main/resources/sca/services/META-INF/spring/SpringExplicitService-context.xml
 (original)
+++ 
tuscany/sca-java-2.x/trunk/itest/implementation-spring/src/main/resources/sca/services/META-INF/spring/SpringExplicitService-context.xml
 Tue Aug 24 22:34:52 2010
@@ -23,6 +23,7 @@ explicitly using an sca:service element 
 <beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:sca="http://www.springframework.org/schema/sca";
+       xmlns:spec="http://docs.oasis-open.org/ns/opencsa/sca/200912";
        xsi:schemaLocation="
 http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/sca 
http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd";>
@@ -30,6 +31,7 @@ http://www.springframework.org/schema/sc
     <sca:service name="fooService" 
                  type="helloworld.HelloWorld" 
                  target="testBean"/>
+                 <!-- requires="spec:serverAuthentication" -->
 
     <bean id="testBean" 
           class="mock.TestHelloWorldBean" 

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaNamespaceHandler.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaNamespaceHandler.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaNamespaceHandler.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaNamespaceHandler.java
 Tue Aug 24 22:34:52 2010
@@ -16,7 +16,15 @@
  */
 package org.apache.tuscany.sca.implementation.spring.namespace;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.xml.namespace.QName;
+
 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 /**
  * Handler for the &lt;sca:&gt; namespace in an application context
@@ -35,4 +43,51 @@ public class ScaNamespaceHandler extends
         registerBeanDefinitionParser("property", new 
ScaPropertyBeanDefinitionParser());
     }
 
+    private static String getNamespaceURI(Element element, String prefix) {
+        if (element == null) {
+            return null;
+        }
+        String name = ("".equals(prefix)) ? "xmlns" : "xmlns:" + prefix;
+        String ns = element.getAttribute(name);
+        if (ns != null && !"".equals(ns)) {
+            return ns;
+        }
+        Node parent = element.getParentNode();
+        if (parent instanceof Element) {
+            return getNamespaceURI((Element)parent, prefix);
+        } else {
+            return null;
+        }
+    }
+
+    public static List<QName> resolve(Element element, String listOfNames) {
+        List<QName> qnames = new ArrayList<QName>();
+        StringTokenizer tokenizer = new StringTokenizer(listOfNames);
+        while (tokenizer.hasMoreTokens()) {
+            String qname = tokenizer.nextToken();
+            String prefix = "";
+            String local = qname;
+            int index = qname.indexOf(':');
+            if (index != -1) {
+                local = qname.substring(index + 1);
+                prefix = qname.substring(0, index);
+            }
+            String ns = getNamespaceURI(element, prefix);
+            if (ns != null) {
+                qnames.add(new QName(ns, local, prefix));
+            } else {
+                throw new IllegalArgumentException("Prefix " + prefix + "is 
not bound to a namespace");
+            }
+        }
+        return qnames;
+    }
+
+    public static String getAttribute(Element element, String name) {
+        String attr = element.getAttributeNS(null, name);
+        if ("".equals(attr)) {
+            return null;
+        } else {
+            return attr;
+        }
+    }
 }

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaReferenceBeanDefinitionParser.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaReferenceBeanDefinitionParser.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaReferenceBeanDefinitionParser.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaReferenceBeanDefinitionParser.java
 Tue Aug 24 22:34:52 2010
@@ -16,6 +16,12 @@
  */
 package org.apache.tuscany.sca.implementation.spring.namespace;
 
+import static 
org.apache.tuscany.sca.implementation.spring.namespace.ScaNamespaceHandler.getAttribute;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.sca.implementation.spring.SpringSCAReferenceElement;
 import 
org.apache.tuscany.sca.implementation.spring.context.SCAGenericApplicationContext;
 import org.springframework.beans.factory.config.BeanDefinition;
@@ -36,9 +42,21 @@ public class ScaReferenceBeanDefinitionP
         if (registry instanceof SCAGenericApplicationContext) {
             SCAGenericApplicationContext context = 
(SCAGenericApplicationContext)registry;
             SpringSCAReferenceElement referenceElement =
-                new SpringSCAReferenceElement(element.getAttributeNS(null, 
"name"),
-                                              element.getAttributeNS(null, 
"type"));
-            referenceElement.setDefaultBean(element.getAttributeNS(null, 
"default"));
+                new SpringSCAReferenceElement(getAttribute(element, "name"), 
getAttribute(element, "type"));
+            referenceElement.setDefaultBean(getAttribute(element, "default"));
+
+            String requires = getAttribute(element, "requires");
+            if (requires != null) {
+                List<QName> qnames = ScaNamespaceHandler.resolve(element, 
requires);
+                referenceElement.getIntentNames().addAll(qnames);
+            }
+
+            String policySets = getAttribute(element, "policySets");
+            if (policySets != null) {
+                List<QName> qnames = ScaNamespaceHandler.resolve(element, 
policySets);
+                referenceElement.getPolicySetNames().addAll(qnames);
+            }
+
             context.addSCAReferenceElement(referenceElement);
         }
 

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaServiceBeanDefinitionParser.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaServiceBeanDefinitionParser.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaServiceBeanDefinitionParser.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/namespace/ScaServiceBeanDefinitionParser.java
 Tue Aug 24 22:34:52 2010
@@ -16,6 +16,12 @@
  */
 package org.apache.tuscany.sca.implementation.spring.namespace;
 
+import static 
org.apache.tuscany.sca.implementation.spring.namespace.ScaNamespaceHandler.getAttribute;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.sca.implementation.spring.SpringSCAServiceElement;
 import 
org.apache.tuscany.sca.implementation.spring.context.SCAGenericApplicationContext;
 import org.springframework.beans.factory.config.BeanDefinition;
@@ -36,9 +42,21 @@ public class ScaServiceBeanDefinitionPar
         if (registry instanceof SCAGenericApplicationContext) {
             SCAGenericApplicationContext context = 
(SCAGenericApplicationContext)registry;
             SpringSCAServiceElement serviceElement =
-                new SpringSCAServiceElement(element.getAttributeNS(null, 
"name"),
-                                            element.getAttributeNS(null, 
"target"));
-            serviceElement.setType(element.getAttributeNS(null, "type"));
+                new SpringSCAServiceElement(getAttribute(element, "name"), 
getAttribute(element, "target"));
+            serviceElement.setType(getAttribute(element, "type"));
+
+            String requires = getAttribute(element, "requires");
+            if (requires != null) {
+                List<QName> qnames = ScaNamespaceHandler.resolve(element, 
requires);
+                serviceElement.getIntentNames().addAll(qnames);
+            }
+
+            String policySets = getAttribute(element, "policySets");
+            if (policySets != null) {
+                List<QName> qnames = ScaNamespaceHandler.resolve(element, 
policySets);
+                serviceElement.getPolicySetNames().addAll(qnames);
+            }
+
             context.addSCAServiceElement(serviceElement);
         }
         // do nothing, handled by Tuscany

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/processor/SpringXMLBeanDefinitionLoaderImpl.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/processor/SpringXMLBeanDefinitionLoaderImpl.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/processor/SpringXMLBeanDefinitionLoaderImpl.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/java/org/apache/tuscany/sca/implementation/spring/processor/SpringXMLBeanDefinitionLoaderImpl.java
 Tue Aug 24 22:34:52 2010
@@ -67,6 +67,7 @@ public class SpringXMLBeanDefinitionLoad
                        List<SpringSCAPropertyElement> propertyElements,
                        List<SpringBeanElement> beanElements,
                        ProcessorContext context) {
+        // FIXME: [rfeng] We should try to avoid parsing the Spring xml twice 
for the deployment and runtime
         SCAGenericApplicationContext applicationContext = 
createApplicationContext(null, null, resources);
         serviceElements.addAll(applicationContext.getServiceElements());
         referenceElements.addAll(applicationContext.getReferenceElements());

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring-runtime/src/main/resources/META-INF/spring.handlers
 Tue Aug 24 22:34:52 2010
@@ -1 +1,2 @@
 
http\://www.springframework.org/schema/sca=org.apache.tuscany.sca.implementation.spring.namespace.ScaNamespaceHandler
+http\://docs.oasis-open.org/ns/opencsa/sca-j/spring/200810=org.apache.tuscany.sca.implementation.spring.namespace.ScaNamespaceHandler

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAReferenceElement.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAReferenceElement.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAReferenceElement.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAReferenceElement.java
 Tue Aug 24 22:34:52 2010
@@ -21,6 +21,8 @@ package org.apache.tuscany.sca.implement
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.sca.policy.Intent;
 import org.apache.tuscany.sca.policy.PolicySet;
 
@@ -39,6 +41,9 @@ public class SpringSCAReferenceElement {
     private List<Intent> intents = new ArrayList<Intent>();
     private List<PolicySet> policySets = new ArrayList<PolicySet>();
 
+    private List<QName> intentNames = new ArrayList<QName>();
+    private List<QName> policySetNames = new ArrayList<QName>();
+
     public SpringSCAReferenceElement() {
 
     }
@@ -80,12 +85,21 @@ public class SpringSCAReferenceElement {
         return policySets;
     }
 
+    public List<QName> getIntentNames() {
+        return intentNames;
+    }
+
+    public List<QName> getPolicySetNames() {
+        return policySetNames;
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
         builder.append("SpringSCAReferenceElement 
[name=").append(name).append(", type=").append(type)
             .append(", defaultBean=").append(defaultBean).append(", 
intents=").append(intents).append(", policySets=")
-            .append(policySets).append("]");
+            .append(policySets).append(", 
intentNames=").append(intentNames).append(", policySetNames=")
+            .append(policySetNames).append("]");
         return builder.toString();
     }
 

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAServiceElement.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAServiceElement.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAServiceElement.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringSCAServiceElement.java
 Tue Aug 24 22:34:52 2010
@@ -21,6 +21,8 @@ package org.apache.tuscany.sca.implement
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.sca.policy.Intent;
 import org.apache.tuscany.sca.policy.PolicySet;
 
@@ -38,6 +40,8 @@ public class SpringSCAServiceElement {
     private String target;
     private List<Intent> intents = new ArrayList<Intent>();
     private List<PolicySet> policySets = new ArrayList<PolicySet>();
+    private List<QName> intentNames = new ArrayList<QName>();
+    private List<QName> policySetNames = new ArrayList<QName>();
 
     public SpringSCAServiceElement() {
 
@@ -80,12 +84,21 @@ public class SpringSCAServiceElement {
         return policySets;
     }
 
+    public List<QName> getIntentNames() {
+        return intentNames;
+    }
+
+    public List<QName> getPolicySetNames() {
+        return policySetNames;
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
         builder.append("SpringSCAServiceElement 
[name=").append(name).append(", type=").append(type)
             .append(", target=").append(target).append(", 
intents=").append(intents).append(", policySets=")
-            .append(policySets).append("]");
+            .append(policySets).append(", 
intentNames=").append(intentNames).append(", policySetNames=")
+            .append(policySetNames).append("]");
         return builder.toString();
     }
 

Modified: 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java?rev=988747&r1=988746&r2=988747&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
 Tue Aug 24 22:34:52 2010
@@ -41,6 +41,8 @@ import java.util.jar.Manifest;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.ComponentType;
 import org.apache.tuscany.sca.assembly.Multiplicity;
@@ -76,6 +78,9 @@ import org.apache.tuscany.sca.interfaced
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.monitor.Problem;
 import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.policy.PolicySet;
 
 /**
  * Introspects a Spring XML application-context configuration file to create 
<implementation-spring../>
@@ -89,6 +94,7 @@ public class SpringXMLComponentTypeLoade
     private ExtensionPointRegistry registry;
     private ContributionFactory contributionFactory;
     private AssemblyFactory assemblyFactory;
+    private PolicyFactory policyFactory;
     private JavaInterfaceFactory javaFactory;
     private SpringBeanIntrospector beanIntrospector;
 
@@ -99,6 +105,7 @@ public class SpringXMLComponentTypeLoade
         this.registry = registry;
         FactoryExtensionPoint factories = 
registry.getExtensionPoint(FactoryExtensionPoint.class);
         this.assemblyFactory = factories.getFactory(AssemblyFactory.class);
+        this.policyFactory = factories.getFactory(PolicyFactory.class);
         this.javaFactory = factories.getFactory(JavaInterfaceFactory.class);
         this.contributionFactory = 
factories.getFactory(ContributionFactory.class);
         this.xmlBeanDefinitionLoader =
@@ -219,6 +226,7 @@ public class SpringXMLComponentTypeLoade
                                                    appCxtProperties,
                                                    appCxtBeans,
                                                    context);
+                populatePolicies(appCxtServices, appCxtReferences);
             }
             // Validate the beans from individual application context for 
uniqueness
             validateBeans(appCxtBeans, appCxtServices, appCxtReferences, 
appCxtProperties, context.getMonitor());
@@ -239,6 +247,35 @@ public class SpringXMLComponentTypeLoade
         return;
     } // end method loadFromXML
 
+    public void populatePolicies(List<SpringSCAServiceElement> appCxtServices,
+                                 List<SpringSCAReferenceElement> 
appCxtReferences) {
+        for (SpringSCAReferenceElement e : appCxtReferences) {
+            for (QName qn : e.getIntentNames()) {
+                Intent intent = policyFactory.createIntent();
+                intent.setName(qn);
+                e.getRequiredIntents().add(intent);
+            }
+            for (QName qn : e.getPolicySetNames()) {
+                PolicySet ps = policyFactory.createPolicySet();
+                ps.setName(qn);
+                e.getPolicySets().add(ps);
+            }
+        }
+        
+        for (SpringSCAServiceElement e : appCxtServices) {
+            for (QName qn : e.getIntentNames()) {
+                Intent intent = policyFactory.createIntent();
+                intent.setName(qn);
+                e.getRequiredIntents().add(intent);
+            }
+            for (QName qn : e.getPolicySetNames()) {
+                PolicySet ps = policyFactory.createPolicySet();
+                ps.setName(qn);
+                e.getPolicySets().add(ps);
+            }
+        }
+    }
+
     private URL resolveLocation(ModelResolver resolver, String contextPath, 
ProcessorContext context)
         throws MalformedURLException, ContributionReadException {
         URL resource = null;


Reply via email to