You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2007/04/26 13:48:04 UTC

svn commit: r532715 - in /incubator/tuscany/sandbox/SPI: implementation-crud/src/main/java/crud/ implementation-script/ implementation-script/src/main/java/org/apache/tuscany/implementation/script/ implementation-script/src/main/resources/META-INF/serv...

Author: antelder
Date: Thu Apr 26 04:48:02 2007
New Revision: 532715

URL: http://svn.apache.org/viewvc?view=rev&rev=532715
Log:
Implementation SPI strawman updates, update spi for properties and references, add an implementation-script using SPI, and get working for varrious scritp languages with helloworld, properties and references

Added:
    incubator/tuscany/sandbox/SPI/implementation-script/
      - copied from r531931, incubator/tuscany/java/sca/modules/implementation-script/
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java   (with props)
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java   (with props)
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java   (with props)
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.spi.implementation.ImplementationActivator
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java   (with props)
Removed:
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/InstanceWrapperBase.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptArtifactProcessor.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptComponent.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptComponentBuilder.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptModuleActivator.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptPropertyValueObjectFactory.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.core.ModuleActivator
    incubator/tuscany/sandbox/SPI/implementation-script/src/test/java/org/apache/tuscany/implementation/script/ScriptImplementationLoaderTestCase.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/test/java/org/apache/tuscany/implementation/script/ScriptInvokerTestCase.java
Modified:
    incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvoker.java
    incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvokerFactory.java
    incubator/tuscany/sandbox/SPI/implementation-script/pom.xml
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java
    incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplAtomicComponent.java
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplTargetInvoker.java
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationArtifactProcessor.java
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationBuilder.java
    incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationSPIModuleActivator.java
    incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/Invoker.java
    incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/InvokerFactory.java

Modified: incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvoker.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvoker.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvoker.java Thu Apr 26 04:48:02 2007
@@ -32,7 +32,7 @@
         this.operation = operation;
     }
 
-    public Object invoke(Object[] args) {
+    public Object invoke(Object arg0, Object[] args) {
         if (operation.getName().equals("create")) {
             return resourceManager.createResource(args[0]);
             

Modified: incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvokerFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvokerFactory.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvokerFactory.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-crud/src/main/java/crud/CRUDInvokerFactory.java Thu Apr 26 04:48:02 2007
@@ -19,6 +19,8 @@
 
 package crud;
 
+import java.util.Map;
+
 import org.apache.tuscany.interfacedef.Operation;
 import org.apache.tuscany.spi.implementation.InvokerFactory;
 
@@ -34,7 +36,7 @@
         return new CRUDInvoker(resourceManager, operation);
     }
 
-    public Object getInstance() {
+    public Object getInstance(Map<String, Object> arg0, Map<String, Object> arg1) {
         return resourceManager;
     }
 

Modified: incubator/tuscany/sandbox/SPI/implementation-script/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/pom.xml?view=diff&rev=532715&r1=531931&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/pom.xml (original)
+++ incubator/tuscany/sandbox/SPI/implementation-script/pom.xml Thu Apr 26 04:48:02 2007
@@ -27,43 +27,14 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>tuscany-implementation-script</artifactId>
+    <artifactId>tuscany-implementation-script2</artifactId>
     <name>Apache Tuscany Implementation Script</name>
 
     <dependencies>
+
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-assembly</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-core</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-interface</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>        
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-assembly-xml</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>        
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-contribution-impl</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.osoa</groupId>
-            <artifactId>sca-api</artifactId>
-            <version>1.0-incubating-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-assembly-xml</artifactId>
+            <artifactId>tuscany-implementation-spi</artifactId>
             <version>1.0-incubating-SNAPSHOT</version>
         </dependency>
 

Modified: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java?view=diff&rev=532715&r1=531931&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java Thu Apr 26 04:48:02 2007
@@ -18,12 +18,7 @@
  */
 package org.apache.tuscany.implementation.script;
 
-import java.util.List;
-
-import org.apache.tuscany.assembly.ComponentType;
 import org.apache.tuscany.assembly.Implementation;
-import org.apache.tuscany.assembly.Reference;
-import org.apache.tuscany.assembly.Service;
 import org.apache.tuscany.assembly.impl.ComponentTypeImpl;
 
 /**
@@ -34,11 +29,8 @@
     private String scriptName;
     private String scriptSrc;
     private String scriptLanguage;
-    private ComponentType componentType;
 
-    public ScriptImplementation(String scriptName, String scriptLanguage) {
-        this.scriptName = scriptName;
-        this.scriptLanguage = scriptLanguage;
+    public ScriptImplementation() {
         setUnresolved(true);
     }
 
@@ -58,19 +50,12 @@
         this.scriptSrc = scriptSrc;
     }
 
-    public ComponentType getComponentType() {
-        return componentType;
-    }
-
-    public void setComponentType(ComponentType componentType) {
-        this.componentType = componentType;
-    }
-
-    public List<Service> getServices() {
-        return componentType.getServices();
+    public void setScriptLanguage(String scriptLanguage) {
+        this.scriptLanguage = scriptLanguage;
     }
 
-    public List<Reference> getReferences() {
-        return componentType.getReferences();
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+        setURI(scriptName); // TODO: hack to enable getting componentType name
     }
 }

Added: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java?view=auto&rev=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java (added)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java Thu Apr 26 04:48:02 2007
@@ -0,0 +1,49 @@
+/*
+ * 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.implementation.script;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.assembly.xml.Constants;
+import org.apache.tuscany.spi.implementation.ImplementationActivator;
+import org.apache.tuscany.spi.implementation.InvokerFactory;
+import org.apache.tuscany.spi.implementation.XMLSCDLProcessor;
+
+public class ScriptImplementationActivator implements ImplementationActivator<ScriptImplementation>{
+
+    private static final QName IMPLEMENTATION_SCRIPT_QNAME = new QName(Constants.SCA10_NS, "implementation.script");
+
+    public Class getImplementationClass() {
+        return ScriptImplementation.class;
+    }
+
+    public InvokerFactory getInvokerFactory(ScriptImplementation impl) {
+        return new ScriptInvokerFactory(impl);
+    }
+
+    public QName getModelQName() {
+        return IMPLEMENTATION_SCRIPT_QNAME;
+    }
+
+    public XMLSCDLProcessor getSCDLProcessor() {
+        return new ScriptXMLSCDLProcessor();
+    }
+
+}

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java?view=diff&rev=532715&r1=531931&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java Thu Apr 26 04:48:02 2007
@@ -19,114 +19,30 @@
 
 package org.apache.tuscany.implementation.script;
 
-import java.lang.reflect.InvocationTargetException;
-
 import javax.script.Invocable;
 import javax.script.ScriptException;
 
-import org.apache.tuscany.spi.Scope;
-import org.apache.tuscany.spi.component.ComponentException;
-import org.apache.tuscany.spi.component.InstanceWrapper;
-import org.apache.tuscany.spi.component.InvalidConversationSequenceException;
-import org.apache.tuscany.spi.component.ScopeContainer;
-import org.apache.tuscany.spi.component.TargetException;
-import org.apache.tuscany.spi.component.WorkContext;
-import org.apache.tuscany.spi.extension.TargetInvokerExtension;
-
-/**
- * Perform the actual script invocation
- * TODO: move vertually all of this to SPI TargetInvokerExtension
- */
-@SuppressWarnings("deprecation")
-public class ScriptInvoker<T> extends TargetInvokerExtension {
-
-    protected Object clazz;
-    protected String operationName;
-
-    private final ScriptComponent component;
-    private final ScopeContainer scopeContainer;
-    protected InstanceWrapper<T> target;
-    protected boolean stateless;
-
-    public ScriptInvoker(String operationName,
-                         ScriptComponent component,
-                         ScopeContainer scopeContainer,
-                         WorkContext workContext) {
-
-        this.operationName = operationName;
-        this.component = component;
-        this.scopeContainer = scopeContainer;
-        stateless = Scope.STATELESS == scopeContainer.getScope();
+import org.apache.tuscany.interfacedef.Operation;
+import org.apache.tuscany.spi.implementation.Invoker;
+
+public class ScriptInvoker implements Invoker {
+
+    private String operationName;
 
-        // TODO: support script classes
+    public ScriptInvoker(ScriptImplementation impl, Operation operation) {
+        this.operationName = operation.getName();
     }
 
-    @SuppressWarnings("unchecked")
-    public Object invokeTarget(Object payload, short sequence, WorkContext workContext) throws InvocationTargetException {
-        Object contextId = workContext.getIdentifier(scopeContainer.getScope());
+    public Object invoke(Object instance, Object[] args) {
         try {
 
-            InstanceWrapper<T> wrapper = getInstance(sequence, contextId);
-            Invocable scriptEngine = (Invocable)wrapper.getInstance();
+            Invocable scriptEngine = (Invocable)instance;
 
-            Object ret;
-            if (clazz == null) {
-                ret = scriptEngine.invokeFunction(operationName, (Object[])payload);
-            } else {
-                ret =  scriptEngine.invokeMethod(clazz, operationName, (Object[])payload);
-            }
-
-            scopeContainer.returnWrapper(component, wrapper, contextId);
-            if (sequence == END) {
-                // if end conversation, remove resource
-                scopeContainer.remove(component);
-            }
-
-            return ret;
+            return scriptEngine.invokeFunction(operationName, args);
 
         } catch (ScriptException e) {
-            throw new InvocationTargetException(e);
-        } catch (ComponentException e) {
-            throw new InvocationTargetException(e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public ScriptInvoker clone() throws CloneNotSupportedException {
-        try {
-            ScriptInvoker invoker = (ScriptInvoker)super.clone();
-            invoker.target = null;
-            return invoker;
-        } catch (CloneNotSupportedException e) {
-            return null; // will not happen
+            throw new RuntimeException(e);
         }
     }
 
-    /**
-     * Resolves the target service instance or returns a cached one
-     */
-    @SuppressWarnings("unchecked")
-    protected InstanceWrapper<T> getInstance(short sequence, Object contextId) throws TargetException {
-        switch (sequence) {
-        case NONE:
-            if (cacheable) {
-                if (target == null) {
-                    target = scopeContainer.getWrapper(component, contextId);
-                }
-                return target;
-            } else {
-                return scopeContainer.getWrapper(component, contextId);
-            }
-        case START:
-            assert !cacheable;
-            return scopeContainer.getWrapper(component, contextId);
-        case CONTINUE:
-        case END:
-            assert !cacheable;
-            return scopeContainer.getAssociatedWrapper(component, contextId);
-        default:
-            throw new InvalidConversationSequenceException("Unknown sequence type", String.valueOf(sequence));
-        }
-    }
 }

Added: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java?view=auto&rev=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java (added)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java Thu Apr 26 04:48:02 2007
@@ -0,0 +1,74 @@
+/*
+ * 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.implementation.script;
+
+import java.io.StringReader;
+import java.util.Map;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+
+import org.apache.tuscany.interfacedef.Operation;
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.implementation.Invoker;
+import org.apache.tuscany.spi.implementation.InvokerFactory;
+
+public class ScriptInvokerFactory implements InvokerFactory {
+    
+    private ScriptImplementation impl;
+
+    public ScriptInvokerFactory(ScriptImplementation impl) {
+        this.impl = impl;
+    }
+
+    public Invoker createInvoker(Operation operation) {
+        return new ScriptInvoker(impl, operation);
+    }
+
+    public Object getInstance(Map<String, Object> references, Map<String, Object> properties) {
+        try {
+            ScriptEngineManager manager = new ScriptEngineManager();
+            
+            for (String referenceName : references.keySet()) {
+                Object reference = references.get(referenceName);
+                manager.put(referenceName, reference);
+            }
+            
+            for (String propertyName : properties.keySet()) {
+                Object propertyValue = properties.get(propertyName);
+                manager.put(propertyName, propertyValue);
+            }
+            
+            ScriptEngine engine = manager.getEngineByExtension(impl.getScriptLanguage());
+            if (engine == null) {
+                throw new ObjectCreationException("no script engine found for language: " + impl.getScriptLanguage());
+            }
+           
+            engine.eval(new StringReader(impl.getScriptSrc()));
+           
+            return engine;
+           
+        } catch (ScriptException e) {
+            throw new ObjectCreationException(e);
+        }
+    }
+
+}

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java?view=auto&rev=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java (added)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java Thu Apr 26 04:48:02 2007
@@ -0,0 +1,94 @@
+/*
+ * 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.implementation.script;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.assembly.Implementation;
+import org.apache.tuscany.spi.implementation.XMLSCDLProcessor;
+
+public class ScriptXMLSCDLProcessor implements XMLSCDLProcessor {
+
+    private static final String SCRIPT = "script";
+    private static final String LANGUAGE = "language";
+
+    public void read(Implementation impl, XMLStreamReader reader) {
+        ScriptImplementation scriptImplementation = (ScriptImplementation)impl;
+
+        String scriptName = reader.getAttributeValue(null, SCRIPT);
+        scriptImplementation.setScriptName(scriptName);
+
+        String scriptLanguage = reader.getAttributeValue(null, LANGUAGE);
+        if (scriptLanguage == null || scriptLanguage.length() < 1) {
+            int i = scriptName.lastIndexOf('.');
+            scriptLanguage = scriptName.substring(i+1);
+        }
+        scriptImplementation.setScriptLanguage(scriptLanguage);
+
+        scriptImplementation.setScriptSrc(readScript(scriptImplementation.getScriptName()));
+    }
+
+    public void write(Implementation impl, XMLStreamWriter writer) {
+    }
+
+    protected String readScript(String scriptName) {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        URL scriptSrcUrl = cl.getResource(scriptName);
+        if (scriptSrcUrl == null) {
+            throw new RuntimeException("No script: " + scriptName);
+        }
+
+        InputStream is;
+        try {
+            is = scriptSrcUrl.openStream();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        try {
+
+            Reader reader = new InputStreamReader(is, "UTF-8");
+            char[] buffer = new char[1024];
+            StringBuilder source = new StringBuilder();
+            int count;
+            while ((count = reader.read(buffer)) > 0) {
+                source.append(buffer, 0, count);
+            }
+
+            return source.toString();
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            try {
+                is.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+    }
+}

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.spi.implementation.ImplementationActivator
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.spi.implementation.ImplementationActivator?view=auto&rev=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.spi.implementation.ImplementationActivator (added)
+++ incubator/tuscany/sandbox/SPI/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.spi.implementation.ImplementationActivator Thu Apr 26 04:48:02 2007
@@ -0,0 +1,3 @@
+# Implementation class for the Script ImplementationActivator
+org.apache.tuscany.implementation.script.ScriptImplementationActivator
+

Modified: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplAtomicComponent.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplAtomicComponent.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplAtomicComponent.java Thu Apr 26 04:48:02 2007
@@ -20,18 +20,24 @@
 package org.apache.tuscany.spi.implementation.impl;
 
 import java.net.URI;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.tuscany.assembly.ComponentProperty;
 import org.apache.tuscany.assembly.Implementation;
 import org.apache.tuscany.core.component.ComponentContextImpl;
 import org.apache.tuscany.core.component.ComponentContextProvider;
 import org.apache.tuscany.core.component.ServiceReferenceImpl;
 import org.apache.tuscany.core.component.scope.InstanceWrapperBase;
+import org.apache.tuscany.databinding.DataBindingExtensionPoint;
 import org.apache.tuscany.interfacedef.Operation;
 import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.SingletonObjectFactory;
 import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.component.TargetInvokerCreationException;
+import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.extension.AtomicComponentExtension;
 import org.apache.tuscany.spi.implementation.ImplementationActivator;
 import org.apache.tuscany.spi.implementation.Invoker;
@@ -47,15 +53,30 @@
     private ImplementationActivator ia;
     private Implementation impl;
 
+    private Map<String, Object> references;
+    private Map<String, ObjectFactory<?>> propertyValueFactories;
+    
+    private PropertyValueObjectFactory propertyValueObjectFactory = null;
+    private DataBindingExtensionPoint dataBindingRegistry;
+
     public ImplAtomicComponent(URI uri, URI groupId, ImplementationActivator ia, Implementation impl) {
         super(uri, null, null, groupId, 50);
         this.ia = ia;
         this.componentContext = new ComponentContextImpl(this);
         this.impl = impl;
+        references = new HashMap<String, Object>();
+        propertyValueFactories = new HashMap<String, ObjectFactory<?>>();
     }
 
     public Object createInstance() throws ObjectCreationException {
-        return ia.getInvokerFactory(impl).getInstance();
+        Map<String, Object> properties = new HashMap<String, Object>();
+        for (String propertyName : propertyValueFactories.keySet()) {
+            ObjectFactory<?> propertyValueFactory = propertyValueFactories.get(propertyName);
+            if ( propertyValueFactory != null) {
+                properties.put(propertyName, propertyValueFactory.getInstance());
+            }
+        }
+        return ia.getInvokerFactory(impl).getInstance(references, properties);
     }
 
     public InstanceWrapper createInstanceWrapper() throws ObjectCreationException {
@@ -65,7 +86,19 @@
     public void attachCallbackWire(Wire arg0) {
     }
 
-    public void attachWire(Wire arg0) {
+    public void attachWire(Wire wire) {
+        references.put(wire.getSourceUri().getFragment(), createWireProxy(wire));
+    }
+
+    protected Object createWireProxy(Wire wire) {
+        // TODO: this is completly wrong :) Need to create a proxy wraping the wire
+        Object ref;
+        try {
+            ref = wire.getTargetInstance();
+        } catch (TargetResolutionException e) {
+            throw new RuntimeException(e);
+        }
+        return ref;
     }
 
     public void attachWires(List<Wire> arg0) {
@@ -78,7 +111,7 @@
     public TargetInvoker createTargetInvoker(String targetName, final Operation operation, boolean callback)
         throws TargetInvokerCreationException {
         Invoker invoker = ia.getInvokerFactory(impl).createInvoker(operation);
-        return new ImplTargetInvoker(invoker);
+        return new ImplTargetInvoker(invoker, this, scopeContainer, workContext);
     }
 
     @Override
@@ -100,5 +133,23 @@
 
     public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, String referenceName) {
         return new ServiceReferenceImpl<B>(businessInterface, new SingletonObjectFactory<B>((B)createInstance()));
+    }
+    public void setDataBindingRegistry(DataBindingExtensionPoint dataBindingRegistry) {
+        this.dataBindingRegistry = dataBindingRegistry;
+    }
+
+    public void setPropertyValueObjectFactory(PropertyValueObjectFactory propertyValueObjectFactory) {
+        this.propertyValueObjectFactory = propertyValueObjectFactory;
+    }
+    
+    public void initializePropertyValueFactories(List<ComponentProperty> properties) {
+        ObjectFactory<?> propertyObjectFactory = null;
+        
+        for (ComponentProperty aProperty : properties) {
+            if (aProperty.getValue() != null) {
+                propertyObjectFactory = propertyValueObjectFactory.createValueFactory(aProperty);
+                propertyValueFactories.put(aProperty.getName(), propertyObjectFactory);
+            }
+        }
     }
 }

Modified: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplTargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplTargetInvoker.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplTargetInvoker.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplTargetInvoker.java Thu Apr 26 04:48:02 2007
@@ -21,19 +21,103 @@
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.apache.tuscany.spi.Scope;
+import org.apache.tuscany.spi.component.ComponentException;
+import org.apache.tuscany.spi.component.InstanceWrapper;
+import org.apache.tuscany.spi.component.InvalidConversationSequenceException;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.extension.TargetInvokerExtension;
 import org.apache.tuscany.spi.implementation.Invoker;
 
-public class ImplTargetInvoker extends TargetInvokerExtension {
+/**
+ * Perform the actual script invocation
+ * TODO: move vertually all of this to SPI TargetInvokerExtension
+ */
+@SuppressWarnings("deprecation")
+public class ImplTargetInvoker<T> extends TargetInvokerExtension {
+
+    protected Object clazz;
+    protected Invoker invoker;
+
+    private final ImplAtomicComponent component;
+    private final ScopeContainer scopeContainer;
+    protected InstanceWrapper<T> target;
+    protected boolean stateless;
+
+    public ImplTargetInvoker(Invoker invoker,
+                         ImplAtomicComponent component,
+                         ScopeContainer scopeContainer,
+                         WorkContext workContext) {
 
-    private Invoker invoker;
-    public ImplTargetInvoker(Invoker invoker) {
         this.invoker = invoker;
+        this.component = component;
+        this.scopeContainer = scopeContainer;
+        stateless = Scope.STATELESS == scopeContainer.getScope();
+
+        // TODO: support script classes
     }
 
+    @SuppressWarnings("unchecked")
     public Object invokeTarget(Object payload, short sequence, WorkContext workContext) throws InvocationTargetException {
-        return invoker.invoke((Object[])payload);
+        Object contextId = workContext.getIdentifier(scopeContainer.getScope());
+        try {
+
+            InstanceWrapper<T> wrapper = getInstance(sequence, contextId);
+            Object instance = wrapper.getInstance();
+
+            Object ret = invoker.invoke(instance, (Object[])payload);
+
+            scopeContainer.returnWrapper(component, wrapper, contextId);
+            if (sequence == END) {
+                // if end conversation, remove resource
+                scopeContainer.remove(component);
+            }
+
+            return ret;
+
+        } catch (ComponentException e) {
+            throw new InvocationTargetException(e);
+        }
     }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    public ImplTargetInvoker clone() throws CloneNotSupportedException {
+        try {
+            ImplTargetInvoker invoker = (ImplTargetInvoker)super.clone();
+            invoker.target = null;
+            return invoker;
+        } catch (CloneNotSupportedException e) {
+            return null; // will not happen
+        }
+    }
+
+    /**
+     * Resolves the target service instance or returns a cached one
+     */
+    @SuppressWarnings("unchecked")
+    protected InstanceWrapper<T> getInstance(short sequence, Object contextId) throws TargetException {
+        switch (sequence) {
+        case NONE:
+            if (cacheable) {
+                if (target == null) {
+                    target = scopeContainer.getWrapper(component, contextId);
+                }
+                return target;
+            } else {
+                return scopeContainer.getWrapper(component, contextId);
+            }
+        case START:
+            assert !cacheable;
+            return scopeContainer.getWrapper(component, contextId);
+        case CONTINUE:
+        case END:
+            assert !cacheable;
+            return scopeContainer.getAssociatedWrapper(component, contextId);
+        default:
+            throw new InvalidConversationSequenceException("Unknown sequence type", String.valueOf(sequence));
+        }
+    }
 }

Modified: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationArtifactProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationArtifactProcessor.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationArtifactProcessor.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationArtifactProcessor.java Thu Apr 26 04:48:02 2007
@@ -26,7 +26,12 @@
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
+import org.apache.tuscany.assembly.ComponentType;
 import org.apache.tuscany.assembly.Implementation;
+import org.apache.tuscany.assembly.Property;
+import org.apache.tuscany.assembly.Reference;
+import org.apache.tuscany.assembly.Service;
+import org.apache.tuscany.assembly.impl.DefaultAssemblyFactory;
 import org.apache.tuscany.contribution.processor.StAXArtifactProcessorExtension;
 import org.apache.tuscany.contribution.resolver.ArtifactResolver;
 import org.apache.tuscany.contribution.service.ContributionReadException;
@@ -79,7 +84,28 @@
         return ia.getImplementationClass();
     }
 
-    public void resolve(Object arg0, ArtifactResolver arg1) throws ContributionResolveException {
+    public void resolve(Object arg0, ArtifactResolver resolver) throws ContributionResolveException {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        Implementation impl = (Implementation)arg0;
+        String scriptURI = cl.getResource(((Implementation)arg0).getURI()).toString();
+        int lastDot = scriptURI.lastIndexOf('.');
+        String ctURI = scriptURI.substring(0, lastDot) + ".componentType";
+        ComponentType componentType = new DefaultAssemblyFactory().createComponentType();
+        componentType.setUnresolved(true);
+        componentType.setURI(ctURI);
+        componentType = resolver.resolve(ComponentType.class, componentType);
+        if (componentType.isUnresolved()) {
+            throw new ContributionResolveException("missing .componentType side file");
+        }
+        for (Reference reference : componentType.getReferences()) {
+            impl.getReferences().add(reference);
+        }
+        for (Service service : componentType.getServices()) {
+            impl.getServices().add(service);
+        }
+        for (Property property : componentType.getProperties()) {
+            impl.getProperties().add(property);
+        }
     }
 
     public void wire(Object arg0) throws ContributionWireException {

Modified: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationBuilder.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationBuilder.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationBuilder.java Thu Apr 26 04:48:02 2007
@@ -25,6 +25,7 @@
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.assembly.Component;
 import org.apache.tuscany.assembly.Implementation;
+import org.apache.tuscany.databinding.DataBindingExtensionPoint;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.ComponentBuilderExtension;
 import org.apache.tuscany.spi.implementation.ImplementationActivator;
@@ -32,6 +33,8 @@
 public class ImplementationBuilder extends ComponentBuilderExtension {
 
     private ImplementationActivator ia;
+    private PropertyValueObjectFactory propertyValueObjectFactory;
+    private DataBindingExtensionPoint dataBindingRegistry;
 
     public ImplementationBuilder(ImplementationActivator ia) {
         this.ia = ia;
@@ -46,8 +49,17 @@
         URI uri = URI.create(context.getComponentId() + definition.getName());
         Implementation impl = definition.getImplementation();
         ImplAtomicComponent component = new ImplAtomicComponent(uri, context.getGroupId(), ia, impl);
+        component.setPropertyValueObjectFactory(propertyValueObjectFactory);
+        component.setDataBindingRegistry(dataBindingRegistry);
+        component.initializePropertyValueFactories(definition.getProperties());
         return component;
     }
 
+    public void setPropertyValueObjectFactory(PropertyValueObjectFactory propertyValueObjectFactory) {
+        this.propertyValueObjectFactory = propertyValueObjectFactory;
+    }
 
+    public void setDataBindingRegistry(DataBindingExtensionPoint dataBindingRegistry) {
+        this.dataBindingRegistry = dataBindingRegistry;
+    }
 }

Modified: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationSPIModuleActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationSPIModuleActivator.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationSPIModuleActivator.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/ImplementationSPIModuleActivator.java Thu Apr 26 04:48:02 2007
@@ -26,6 +26,8 @@
 import org.apache.tuscany.contribution.processor.StAXArtifactProcessorExtensionPoint;
 import org.apache.tuscany.core.ExtensionPointRegistry;
 import org.apache.tuscany.core.ModuleActivator;
+import org.apache.tuscany.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.databinding.Mediator;
 import org.apache.tuscany.spi.builder.BuilderRegistry;
 import org.apache.tuscany.spi.implementation.ImplementationActivator;
 
@@ -50,8 +52,17 @@
             as.add(implementationArtifactProcessor);
 
             ImplementationBuilder builder = new ImplementationBuilder(ia);
+            builder.setBuilderRegistry(builderRegistry);
             builderRegistry.register(ia.getImplementationClass(), builder);
 
+            Mediator mediator = epRegistry.getExtensionPoint(Mediator.class);
+            PropertyValueObjectFactory factory = new PropertyValueObjectFactory(mediator);
+            builder.setPropertyValueObjectFactory(factory);
+
+            DataBindingExtensionPoint dataBindingRegistry = epRegistry.getExtensionPoint(DataBindingExtensionPoint.class);
+            builder.setDataBindingRegistry(dataBindingRegistry);
+
+            builder.init();
         }
     }
 

Added: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java?view=auto&rev=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java (added)
+++ incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java Thu Apr 26 04:48:02 2007
@@ -0,0 +1,224 @@
+/*
+ * 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.spi.implementation.impl;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.tuscany.assembly.Property;
+import org.apache.tuscany.databinding.Mediator;
+import org.apache.tuscany.databinding.SimpleTypeMapper;
+import org.apache.tuscany.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.interfacedef.DataType;
+import org.apache.tuscany.interfacedef.util.XMLType;
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.ObjectFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class PropertyValueObjectFactory {
+    // protected DataBindingRegistry dbRegistry = new DataBindingRegistryImpl();
+    protected Mediator mediator = null;
+    protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperExtension();
+    boolean isSimpleType;
+    
+    public PropertyValueObjectFactory(Mediator mediator) {
+        this.mediator = mediator;
+    }
+    
+    public ObjectFactory createValueFactory(Property property) {
+        isSimpleType = isSimpleType(property);
+        Document doc = (Document)property.getValue();
+        Element rootElement = doc.getDocumentElement();
+        
+        //FIXME : since scripts use dynamic types we need to generate a dynamic java type using the 
+        //xml structure of the property value.  Should this be done in the JavaBeansDataBinding... 
+        Class javaType = null;
+        
+        if (property.isMany()) {
+            if (isSimpleType) {
+                String value = "";
+                if (rootElement.getChildNodes().getLength() > 0) {
+                    value = rootElement.getChildNodes().item(0).getTextContent();
+                }
+                List<String> values = 
+                    getSimplePropertyValues(value, javaType);
+                return new ListObjectFactoryImpl(property, 
+                                                 values,
+                                                 isSimpleType,
+                                                 javaType);
+            } else {
+                return new ListObjectFactoryImpl(property,
+                                                 getComplexPropertyValues(doc),
+                                                 isSimpleType,
+                                                 javaType);
+            }
+        } else {
+            if (isSimpleType) {
+                String value = "";
+                if (rootElement.getChildNodes().getLength() > 0) {
+                    value = rootElement.getChildNodes().item(0).getTextContent();
+                }
+                return new ObjectFactoryImpl(property,
+                                             value,
+                                             isSimpleType,
+                                             javaType);
+            } else {
+                Object value = getComplexPropertyValues(doc).get(0);
+                return new ObjectFactoryImpl(property,
+                                             value,
+                                             isSimpleType,
+                                             javaType);
+            }
+            
+        }
+    }
+    
+    private boolean isSimpleType(Property property) {
+        if (property.getXSDType() != null) {
+            return SimpleTypeMapperExtension.isSimpleXSDType(property.getXSDType());
+        } else {
+            if (property instanceof Document) {
+                Document doc = (Document)property;
+                Element element = doc.getDocumentElement(); 
+                if (element.getChildNodes().getLength() == 1 && 
+                    element.getChildNodes().item(0).getNodeType() == Element.TEXT_NODE) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    private List<String> getSimplePropertyValues(String concatenatedValue, Class javaType) {
+        List<String> propValues = new ArrayList<String>();
+        StringTokenizer st = null;
+        if ( javaType.getName().equals("java.lang.String")) {
+            st = new StringTokenizer(concatenatedValue, "\"");
+        } else {
+            st = new StringTokenizer(concatenatedValue);
+        }
+        String aToken = null;
+        while (st.hasMoreTokens()) {
+            aToken = st.nextToken();
+            if (aToken.trim().length() > 0) {
+                propValues.add(aToken);
+            }
+        }
+        return propValues;
+    }
+    
+    private List<Node> getComplexPropertyValues(Document document) {
+        Element rootElement = document.getDocumentElement();
+        List<Node> propValues = new ArrayList<Node>();
+        for (int count = 0 ; count < rootElement.getChildNodes().getLength() ; ++count) {
+            if (rootElement.getChildNodes().item(count).getNodeType() == Document.ELEMENT_NODE) {
+                propValues.add(rootElement.getChildNodes().item(count));
+            }
+        }
+        return propValues;
+    }
+    
+    public abstract class ObjectFactoryImplBase  implements ObjectFactory {
+        protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperExtension();
+        protected Property property;
+        protected Object propertyValue;
+        protected Class javaType;
+        protected DataType<XMLType> sourceDataType;
+        protected DataType<?> targetDataType;
+        boolean isSimpleType;
+
+        public ObjectFactoryImplBase(Property property, Object propertyValue, boolean isSimpleType, Class javaType)  {
+            
+            this.isSimpleType = isSimpleType;
+            this.property = property;
+            this.propertyValue = propertyValue;
+            this.javaType = javaType;
+            //FIXME : fix this when we have managed to generate dynamic java types
+            /*sourceDataType =
+                new DataTypeImpl<XMLType>(DOMDataBinding.NAME, Node.class, 
+                    new XMLType(null, this.property.getXSDType()));
+            TypeInfo typeInfo = null;
+            if (this.property.getXSDType() != null) {
+                if (SimpleTypeMapperExtension.isSimpleXSDType(this.property.getXSDType())) {
+                    typeInfo = new TypeInfo(property.getXSDType(), true, null);
+                } else {
+                    typeInfo = new TypeInfo(property.getXSDType(), false, null);
+                }
+            } else {
+                typeInfo = new TypeInfo(property.getXSDType(), false, null);
+            }
+
+            XMLType xmlType = new XMLType(typeInfo);
+            String dataBinding = null; //(String)property.getExtensions().get(DataBinding.class.getName());
+            if (dataBinding != null) {
+                targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
+            } else {
+                targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
+                mediator.getDataBindingRegistry().introspectType(targetDataType, null);  
+            }*/
+        }
+    }
+    
+    public class ObjectFactoryImpl extends ObjectFactoryImplBase {
+        public ObjectFactoryImpl(Property property, Object propertyValue, boolean isSimpleType, Class javaType) {
+            super(property, propertyValue, isSimpleType, javaType);
+        }
+
+        @SuppressWarnings("unchecked")
+        public Object getInstance() throws ObjectCreationException {
+            if (isSimpleType) {
+                return simpleTypeMapper.toJavaObject(property.getXSDType(), (String)propertyValue, null);
+            } else {
+                return mediator.mediate(propertyValue, sourceDataType, targetDataType, null);
+                //return null;
+            }
+        }
+    }
+
+    public class ListObjectFactoryImpl extends ObjectFactoryImplBase  {
+        public ListObjectFactoryImpl(Property property, List<?>propertyValues, boolean isSimpleType, Class javaType) {
+            super(property, propertyValues, isSimpleType, javaType);
+        }
+
+        @SuppressWarnings("unchecked")
+        public List<?> getInstance() throws ObjectCreationException {
+            if (isSimpleType) {
+                List<Object> values = new ArrayList<Object>();
+                for (String aValue : (List<String>)propertyValue) {
+                    values.add(simpleTypeMapper.toJavaObject(property.getXSDType(), aValue, null));
+                }
+                return values;
+            } else {
+                List instances = new ArrayList();
+                for (Node aValue : (List<Node>)propertyValue) {
+                    instances.add(mediator.mediate(aValue,
+                                                      sourceDataType,
+                                                      targetDataType,
+                                                      null));
+                }
+                return instances;
+            }
+        }
+    }
+}
+      
\ No newline at end of file

Propchange: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/SPI/implementation-spi-impl/src/main/java/org/apache/tuscany/spi/implementation/impl/PropertyValueObjectFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/Invoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/Invoker.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/Invoker.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/Invoker.java Thu Apr 26 04:48:02 2007
@@ -21,6 +21,6 @@
 
 public interface Invoker {
     
-    Object invoke(Object[] args);
+    Object invoke(Object instance, Object[] args);
 
 }

Modified: incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/InvokerFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/InvokerFactory.java?view=diff&rev=532715&r1=532714&r2=532715
==============================================================================
--- incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/InvokerFactory.java (original)
+++ incubator/tuscany/sandbox/SPI/implementation-spi/src/main/java/org/apache/tuscany/spi/implementation/InvokerFactory.java Thu Apr 26 04:48:02 2007
@@ -19,11 +19,13 @@
 
 package org.apache.tuscany.spi.implementation;
 
+import java.util.Map;
+
 import org.apache.tuscany.interfacedef.Operation;
 
 public interface InvokerFactory {
     
    Invoker createInvoker(Operation operation);
 
-   Object getInstance();
+   Object getInstance(Map<String, Object> references, Map<String, Object> properties);
 }



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