Author: jboynes
Date: Wed Apr  5 16:21:50 2006
New Revision: 391845

URL: http://svn.apache.org/viewcvs?rev=391845&view=rev
Log:
simplify model for container.java by moving introspection to loader
make Java AssemblyFactory available as a service

Added:
    
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/
    
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
   (with props)
Removed:
    
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationTestCase.java
Modified:
    
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java
    
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java
    
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java
    
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
    
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java
    
incubator/tuscany/java/sca/containers/container.java/src/main/resources/system.fragment

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java
 Wed Apr  5 16:21:50 2006
@@ -23,10 +23,8 @@
  * The Factory for the model.
  */
 public interface JavaAssemblyFactory extends AssemblyFactory {
-
     /**
      * Returns a new JavaImplementation.
      */
     JavaImplementation createJavaImplementation();
-
 }

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java
 Wed Apr  5 16:21:50 2006
@@ -21,17 +21,19 @@
 
 /**
  * Represents a java implementation.
+ * 
+ * @version $Rev$ $Date$
  */
 public interface JavaImplementation extends ComponentImplementation {
 
     /**
      * Returns the implementation class.
      */
-    Class getImplementationClass();
+    Class<?> getImplementationClass();
 
     /**
      * Sets the implementation class.
      */
-    void setImplementationClass(Class value);
+    void setImplementationClass(Class<?> value);
 
 }

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java
 Wed Apr  5 16:21:50 2006
@@ -16,6 +16,8 @@
  */
 package org.apache.tuscany.container.java.assembly.impl;
 
+import org.osoa.sca.annotations.Service;
+
 import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory;
 import org.apache.tuscany.container.java.assembly.JavaImplementation;
 import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
@@ -23,6 +25,7 @@
 /**
  * A factory for the model.
  */
[EMAIL PROTECTED](interfaces = {JavaAssemblyFactory.class})
 public class JavaAssemblyFactoryImpl extends AssemblyFactoryImpl implements 
JavaAssemblyFactory {
 
     /**

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
 Wed Apr  5 16:21:50 2006
@@ -16,82 +16,29 @@
  */
 package org.apache.tuscany.container.java.assembly.impl;
 
-import java.net.URL;
-
-import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory;
 import org.apache.tuscany.container.java.assembly.JavaImplementation;
-import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector;
-import org.apache.tuscany.core.config.ComponentTypeIntrospector;
-import org.apache.tuscany.core.config.ConfigurationException;
-import org.apache.tuscany.core.config.JavaIntrospectionHelper;
-import org.apache.tuscany.model.assembly.AssemblyModelContext;
-import org.apache.tuscany.model.assembly.ComponentType;
 import org.apache.tuscany.model.assembly.impl.ComponentImplementationImpl;
 
 /**
  * An implementation of JavaImplementation.
+ *
+ * @version $Rev$ $Date$
  */
 public class JavaImplementationImpl extends ComponentImplementationImpl 
implements JavaImplementation {
-
     private Class<?> implementationClass;
 
     /**
-     * Constructor
+     * Default constructor.
      */
     protected JavaImplementationImpl() {
     }
 
-    /**
-     * @see 
org.apache.tuscany.container.java.assembly.JavaImplementation#getImplementationClass()
-     */
-    public Class getImplementationClass() {
+    public Class<?> getImplementationClass() {
         return implementationClass;
     }
 
-    /**
-     * @see 
org.apache.tuscany.container.java.assembly.JavaImplementation#setImplementationClass(java.lang.Class)
-     */
-    public void setImplementationClass(Class value) {
+    public void setImplementationClass(Class<?> value) {
         checkNotFrozen();
-        implementationClass=value;
-    }
-
-    /**
-     * @see 
org.apache.tuscany.model.assembly.AssemblyModelObject#initialize(org.apache.tuscany.model.assembly.AssemblyModelContext)
-     */
-    public void initialize(AssemblyModelContext modelContext) {
-        if (isInitialized())
-            return;
-
-        // Initialize the component type
-        ComponentType componentType=getComponentType();
-        if (componentType==null) {
-            componentType=createComponentType(modelContext, 
implementationClass);
-            setComponentType(componentType);
-        }
-        
-        super.initialize(modelContext);
-    }
-
-    /**
-     * Create the component type
-     * @param modelContext
-     * @param implClass
-     */
-    private static ComponentType createComponentType(AssemblyModelContext 
modelContext, Class<?> implClass) {
-        String baseName = JavaIntrospectionHelper.getBaseName(implClass);
-        URL componentTypeFile = implClass.getResource(baseName + 
".componentType");
-        if (componentTypeFile != null) {
-            return 
modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
-        } else {
-            JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl();
-            ComponentTypeIntrospector introspector = new 
Java5ComponentTypeIntrospector(factory);
-            try {
-                return introspector.introspect(implClass);
-            } catch (ConfigurationException e) {
-                throw new IllegalArgumentException("Unable to introspect 
implementation class: " + implClass.getName(), e);
-            }
-        }
+        implementationClass = value;
     }
-
- }
+}

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java
 Wed Apr  5 16:21:50 2006
@@ -16,22 +16,32 @@
  */
 package org.apache.tuscany.container.java.loader;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
 import org.osoa.sca.annotations.Destroy;
 import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
 import org.osoa.sca.annotations.Scope;
 
 import org.apache.tuscany.common.resource.ResourceLoader;
 import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory;
 import org.apache.tuscany.container.java.assembly.JavaImplementation;
-import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl;
+import org.apache.tuscany.core.config.ComponentTypeIntrospector;
+import org.apache.tuscany.core.config.ConfigurationException;
 import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.config.JavaIntrospectionHelper;
+import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector;
 import org.apache.tuscany.core.loader.StAXElementLoader;
 import org.apache.tuscany.core.loader.StAXLoaderRegistry;
+import org.apache.tuscany.core.loader.assembly.AssemblyConstants;
 import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.model.assembly.ComponentType;
 
 /**
  * @version $Rev$ $Date$
@@ -40,15 +50,28 @@
 public class JavaImplementationLoader implements 
StAXElementLoader<JavaImplementation> {
     public static final QName IMPLEMENTATION_JAVA = new 
QName("http://www.osoa.org/xmlns/sca/0.9";, "implementation.java");
 
-    private static final JavaAssemblyFactory factory = new 
JavaAssemblyFactoryImpl();
+    private StAXLoaderRegistry registry;
+    private XMLInputFactory xmlFactory;
 
-    protected StAXLoaderRegistry registry;
+    private JavaAssemblyFactory factory;
+    private ComponentTypeIntrospector introspector;
 
-    @Autowire
+    public JavaImplementationLoader() {
+        // todo make this a reference to a system service
+        xmlFactory = XMLInputFactory.newInstance();
+    }
+
+    @Autowire(required = true)
     public void setRegistry(StAXLoaderRegistry registry) {
         this.registry = registry;
     }
 
+    @Autowire(required = true)
+    public void setFactory(JavaAssemblyFactory factory) {
+        this.factory = factory;
+        introspector = new Java5ComponentTypeIntrospector(factory);
+    }
+
     @Init(eager = true)
     public void start() {
         registry.registerLoader(this);
@@ -63,24 +86,83 @@
         return IMPLEMENTATION_JAVA;
     }
 
-    public Class getModelType() {
+    public Class<JavaImplementation> getModelType() {
         return JavaImplementation.class;
     }
 
     public JavaImplementation load(XMLStreamReader reader, ResourceLoader 
resourceLoader) throws XMLStreamException, ConfigurationLoadException {
         JavaImplementation javaImpl = factory.createJavaImplementation();
         String typeName = reader.getAttributeValue(null, "class");
+        Class<?> implementationClass = getImplementationClass(resourceLoader, 
typeName);
+        javaImpl.setImplementationClass(implementationClass);
+        javaImpl.setComponentType(loadComponentType(resourceLoader, 
implementationClass));
+        return javaImpl;
+    }
+
+    protected Class<?> getImplementationClass(ResourceLoader resourceLoader, 
String typeName) throws ConfigurationLoadException {
         ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
         try {
+            // set TCCL in case the application code needs it
             
Thread.currentThread().setContextClassLoader(resourceLoader.getClassLoader());
-            // todo the type information should not require loading of an 
application class, save until build time
-            Class<?> type = resourceLoader.loadClass(typeName);
-            javaImpl.setImplementationClass(type);
+            return resourceLoader.loadClass(typeName);
         } catch (ClassNotFoundException e) {
             throw (ConfigurationLoadException) new 
ConfigurationLoadException(e.getMessage()).initCause(e);
         } finally {
             Thread.currentThread().setContextClassLoader(oldCL);
         }
-        return javaImpl;
+    }
+
+    protected ComponentType loadComponentType(ResourceLoader loader, Class<?> 
implClass) throws ConfigurationLoadException, XMLStreamException {
+        String baseName = JavaIntrospectionHelper.getBaseName(implClass);
+        URL sidefile = implClass.getResource(baseName + ".componentType");
+        if (sidefile == null) {
+            return loadComponentTypeByIntrospection(implClass);
+        } else {
+            return loadComponentTypeFromSidefile(sidefile, loader);
+        }
+    }
+
+    protected ComponentType loadComponentTypeByIntrospection(Class<?> 
implClass) throws ConfigurationLoadException {
+        try {
+            return introspector.introspect(implClass);
+        } catch (ConfigurationException e) {
+            throw (ConfigurationLoadException) new 
ConfigurationLoadException(e.getMessage()).initCause(e);
+        }
+    }
+
+    protected ComponentType loadComponentTypeFromSidefile(URL sidefile, 
ResourceLoader loader) throws ConfigurationLoadException, XMLStreamException {
+        XMLStreamReader reader;
+        InputStream is;
+        try {
+            is = sidefile.openStream();
+        } catch (IOException e) {
+            throw (ConfigurationLoadException) new 
ConfigurationLoadException(e.getMessage()).initCause(e);
+        }
+        try {
+            try {
+                reader = xmlFactory.createXMLStreamReader(is);
+            } catch (XMLStreamException e) {
+                throw (ConfigurationLoadException) new 
ConfigurationLoadException(e.getMessage()).initCause(e);
+            }
+            try {
+                reader.nextTag();
+                if 
(!AssemblyConstants.COMPONENT_TYPE.equals(reader.getName())) {
+                    throw new ConfigurationLoadException(sidefile + " is not a 
<componentType> document");
+                }
+                return (ComponentType) registry.load(reader, loader);
+            } finally{
+                try {
+                    reader.close();
+                } catch (XMLStreamException e) {
+                    // ignore
+                }
+            }
+        } finally{
+            try {
+                is.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
     }
 }

Modified: 
incubator/tuscany/java/sca/containers/container.java/src/main/resources/system.fragment
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/main/resources/system.fragment?rev=391845&r1=391844&r2=391845&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/main/resources/system.fragment
 (original)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/main/resources/system.fragment
 Wed Apr  5 16:21:50 2006
@@ -26,6 +26,10 @@
         <system:implementation.system 
class="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder"/>
     </component>
 
+    <component 
name="org.apache.tuscany.container.java.assembly.JavaAssemblyFactory">
+        <system:implementation.system 
class="org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl"/>
+    </component>
+
     <component 
name="org.apache.tuscany.container.java.loader.JavaImplementationLoader">
         <system:implementation.system 
class="org.apache.tuscany.container.java.loader.JavaImplementationLoader"/>
     </component>

Added: 
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
URL: 
http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java?rev=391845&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
 (added)
+++ 
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
 Wed Apr  5 16:21:50 2006
@@ -0,0 +1,134 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.container.java.loader;
+
+import java.net.URL;
+import java.util.List;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLInputFactory;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory;
+import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl;
+import org.apache.tuscany.container.java.assembly.mock.HelloWorldImpl;
+import 
org.apache.tuscany.container.java.assembly.mock.HelloWorldWithFieldProperties;
+import org.apache.tuscany.container.java.assembly.mock.NakedHelloWorld;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.loader.StAXElementLoader;
+import org.apache.tuscany.core.loader.StAXLoaderRegistry;
+import org.apache.tuscany.core.loader.assembly.AssemblyConstants;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
+import org.apache.tuscany.model.assembly.AssemblyModelObject;
+import org.apache.tuscany.model.assembly.ComponentType;
+import org.apache.tuscany.model.assembly.Property;
+import org.apache.tuscany.model.assembly.Service;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class JavaImplementationLoaderTestCase extends TestCase {
+    private JavaImplementationLoader loader;
+    private ComponentType mockType;
+
+    public void testNakedHelloWorld() throws ConfigurationLoadException {
+        ComponentType type = 
loader.loadComponentTypeByIntrospection(NakedHelloWorld.class);
+        Assert.assertNotNull(type);
+        Assert.assertTrue(type.getProperties().isEmpty());
+        Assert.assertTrue(type.getReferences().isEmpty());
+        List<Service> services = type.getServices();
+        Assert.assertEquals(1, services.size());
+        Assert.assertEquals("NakedHelloWorld", services.get(0).getName());
+    }
+
+    public void testHelloWorldWithSidefile() throws XMLStreamException, 
ConfigurationLoadException {
+        StAXLoaderRegistry mockRegistry = new MockRegistry(mockType);
+        loader.setRegistry(mockRegistry);
+        URL sidefile = 
HelloWorldImpl.class.getResource("HelloWorldImpl.componentType");
+        ComponentType type = loader.loadComponentTypeFromSidefile(sidefile, 
null);
+        assertSame(mockType, type);
+    }
+
+    public void testHelloWorldWithFieldProperties() throws 
ConfigurationLoadException {
+        ComponentType type = 
loader.loadComponentTypeByIntrospection(HelloWorldWithFieldProperties.class);
+        type.initialize(null);
+        Assert.assertNotNull(type);
+        List<Property> props = type.getProperties();
+        Assert.assertEquals(3, props.size());
+
+        Property prop = type.getProperty("text");
+        Assert.assertNotNull(prop);
+        Assert.assertEquals("text", prop.getName());
+        Assert.assertEquals(false, prop.isRequired());
+        Assert.assertEquals(String.class, prop.getType());
+
+        prop = type.getProperty("text2");
+        Assert.assertNotNull(prop);
+        Assert.assertEquals("text2", prop.getName());
+        Assert.assertEquals(true, prop.isRequired());
+        Assert.assertEquals(Integer.class, prop.getType());
+
+        prop = type.getProperty("foo");
+        Assert.assertNotNull(prop);
+        Assert.assertEquals("foo", prop.getName());
+        Assert.assertEquals(false, prop.isRequired());
+        Assert.assertEquals(Integer.TYPE, prop.getType());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl();
+        mockType = factory.createComponentType();
+
+        loader = new JavaImplementationLoader();
+        loader.setFactory(factory);
+    }
+
+    private static class MockRegistry implements StAXLoaderRegistry {
+        private final ComponentType mockType;
+
+        public MockRegistry(ComponentType mockType) {
+            this.mockType = mockType;
+        }
+
+        public AssemblyModelObject load(XMLStreamReader reader, ResourceLoader 
resourceLoader) throws XMLStreamException, ConfigurationLoadException {
+            assertEquals(AssemblyConstants.COMPONENT_TYPE, reader.getName());
+            return mockType;
+        }
+
+        public <T extends AssemblyModelObject> void 
registerLoader(StAXElementLoader<T> loader) {
+            throw new UnsupportedOperationException();
+        }
+
+        public <T extends AssemblyModelObject> void 
unregisterLoader(StAXElementLoader<T> loader) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Deprecated
+        public AssemblyModelContext getContext() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Deprecated
+        public void setContext(AssemblyModelContext context) {
+            throw new UnsupportedOperationException();
+        }
+    }
+}

Propchange: 
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date


Reply via email to