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