You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jb...@apache.org on 2006/02/03 02:57:52 UTC

svn commit: r374561 - in /incubator/tuscany/java/sdo/impl: ./ src/main/java/org/apache/tuscany/sdo/ src/main/java/org/apache/tuscany/sdo/codegen/ src/test/java/org/apache/tuscany/sdo/codegen/

Author: jboynes
Date: Thu Feb  2 17:57:42 2006
New Revision: 374561

URL: http://svn.apache.org/viewcvs?rev=374561&view=rev
Log:
refactor the visitor interface and support bytecode generation of interface classes

Added:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java   (with props)
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java   (with props)
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java   (with props)
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java   (with props)
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java   (with props)
Removed:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOPropertyVisitor.java
Modified:
    incubator/tuscany/java/sdo/impl/pom.xml
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOTypeVisitor.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/GenerationException.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGenerator.java
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGeneratorTestCase.java

Modified: incubator/tuscany/java/sdo/impl/pom.xml
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/pom.xml?rev=374561&r1=374560&r2=374561&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/pom.xml (original)
+++ incubator/tuscany/java/sdo/impl/pom.xml Thu Feb  2 17:57:42 2006
@@ -45,6 +45,13 @@
         </dependency>
 
         <dependency>
+            <groupId>asm</groupId>
+            <artifactId>asm</artifactId>
+            <version>2.2</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.eclipse.emf</groupId>
             <artifactId>common</artifactId>
             <version>2.2.0-M4</version>

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOTypeVisitor.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOTypeVisitor.java?rev=374561&r1=374560&r2=374561&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOTypeVisitor.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/SDOTypeVisitor.java Thu Feb  2 17:57:42 2006
@@ -16,10 +16,9 @@
  */
 package org.apache.tuscany.sdo;
 
+import commonj.sdo.Property;
 import commonj.sdo.Type;
 
-import org.apache.tuscany.sdo.codegen.GenerationException;
-
 /**
  * Visitor interface that allows applications to process SDO type metadata.
  *
@@ -27,56 +26,21 @@
  */
 public interface SDOTypeVisitor {
     /**
-     * Visit the type definition.
-     *
-     * @param namespace  the namespace that the type is declared in
-     * @param name       the name of the type
-     * @param open       true if the type is open
-     * @param sequenced  true if the type is sequenced
-     * @param isAbstract true if the type is abstract
-     * @return this visitor
-     */
-    SDOTypeVisitor visitType(String namespace, String name, boolean open, boolean sequenced, boolean isAbstract);
-
-    /**
-     * Visit the declaration of a base type this type extends.
-     *
-     * @param baseType a base type this type extends
-     * @return this visitor
-     */
-    SDOTypeVisitor visitBaseType(Type baseType) throws GenerationException;
-
-    /**
-     * Visit the declaration of an alias for this type.
-     *
-     * @param aliasName an alias for this type
-     * @return this visitor
-     */
-    SDOTypeVisitor visitAlias(String aliasName);
-
-    /**
-     * Visit a property declared by this type. Property indices are determined by the order in which
-     * properties are visited.
+     * Visit a type definition.
      *
-     * @param name     the name of the property
-     * @param type     the SDO type of the property
-     * @param many     true if the property is multi-valued
-     * @param contains true if the property is a containing property
-     * @param readOnly true if the property only supports read access through the SDO API
-     * @return a property visitor that can be used to visit the property
+     * @param type the type to visit
      */
-    SDOPropertyVisitor visitProperty(String name, Type type, boolean many, boolean contains, boolean readOnly) throws GenerationException;
+    void visitType(Type type);
 
     /**
-     * Visit the Java type associated with this SDO type.
+     * Visit a property definition.
      *
-     * @param javaType the Java type for an interface associated with this SDO type
-     * @return this visitor
+     * @param property the property to visit
      */
-    SDOTypeVisitor visitJavaType(java.lang.reflect.Type javaType);
+    void visitProperty(Property property);
 
     /**
-     * Indicate that this visitor will not be called again.
+     * Visit after all properties.
      */
     void visitEnd();
 }

Added: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java?rev=374561&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java (added)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java Thu Feb  2 17:57:42 2006
@@ -0,0 +1,84 @@
+/**
+ *
+ * Copyright 2005 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.sdo.codegen;
+
+import java.util.List;
+
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+import org.objectweb.asm.ClassWriter;
+import static org.objectweb.asm.Opcodes.*;
+
+import org.apache.tuscany.sdo.SDOTypeVisitor;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BytecodeInterfaceGenerator implements SDOTypeVisitor {
+    private final ClassWriter cw;
+
+    protected BytecodeInterfaceGenerator() {
+        cw = new ClassWriter(false);
+    }
+
+    public void visitType(Type type) {
+        String name = type.getName();
+        int lastDot = name.lastIndexOf('.');
+        if (lastDot != -1) {
+            name = name.replace('.', '/');
+        } else {
+            name = Character.toUpperCase(name.charAt(0)) + name.substring(1);
+        }
+
+        List baseTypes = type.getBaseTypes();
+        String[] interfaces = new String[baseTypes.size()];
+        for (int i = 0; i < baseTypes.size(); i++) {
+            Type baseType = (Type) baseTypes.get(i);
+            interfaces[i] = baseType.getInstanceClass().getName().replace('.', '/');
+        }
+
+        cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, name, null, "java/lang/Object", interfaces);
+    }
+
+    public void visitProperty(Property property) {
+        String name = property.getName();
+        String propertyName = Character.toUpperCase(name.charAt(0)) + name.substring(1);
+        Class<?> javaType = property.getType().getInstanceClass();
+        String desc = org.objectweb.asm.Type.getDescriptor(javaType);
+
+        if (property.isMany()) {
+            cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "get" + propertyName, "()Ljava/util/List;", null, null).visitEnd();
+        } else {
+            if (boolean.class.equals(javaType)) {
+                cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "is" + propertyName, "()Z", null, null).visitEnd();
+            } else {
+                cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "get" + propertyName, "()" + desc, null, null).visitEnd();
+            }
+            if (!property.isReadOnly()) {
+                cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "set" + propertyName, '(' + desc + ")V", null, null).visitEnd();
+            }
+        }
+    }
+
+    public void visitEnd() {
+        cw.visitEnd();
+    }
+
+    public byte[] getClassData() {
+        return cw.toByteArray();
+    }
+}

Propchange: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/GenerationException.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/GenerationException.java?rev=374561&r1=374560&r2=374561&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/GenerationException.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/GenerationException.java Thu Feb  2 17:57:42 2006
@@ -21,7 +21,7 @@
  *
  * @version $Rev$ $Date$
  */
-public abstract class GenerationException extends Exception {
+public abstract class GenerationException extends RuntimeException {
     public GenerationException() {
     }
 

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGenerator.java?rev=374561&r1=374560&r2=374561&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGenerator.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGenerator.java Thu Feb  2 17:57:42 2006
@@ -17,164 +17,80 @@
 package org.apache.tuscany.sdo.codegen;
 
 import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
 import java.util.List;
-import java.lang.reflect.Method;
 
-import commonj.sdo.Type;
 import commonj.sdo.Property;
+import commonj.sdo.Type;
 
-import org.apache.tuscany.sdo.SDOPropertyVisitor;
 import org.apache.tuscany.sdo.SDOTypeVisitor;
 
 /**
  * @version $Rev$ $Date$
  */
 public class JavaInterfaceGenerator implements SDOTypeVisitor {
-    private String packageName;
-    private String interfaceName;
-    private List<Type> baseTypes = new ArrayList<Type>();
-    private List<PropVisitor> props = new ArrayList<PropVisitor>();
-
-    public SDOTypeVisitor visitType(String namespace, String name, boolean open, boolean sequenced, boolean isAbstract) {
-        int lastDot = name.lastIndexOf('.');
-        if (lastDot == -1) {
-            packageName = null;
-            this.interfaceName = name;
-        } else {
-            packageName = name.substring(0, lastDot);
-            interfaceName = name.substring(lastDot + 1);
-        }
-        return this;
-    }
-
-    public SDOTypeVisitor visitBaseType(Type baseType) throws NoJavaImplementationException {
-        if (baseType.getInstanceClass() == null) {
-            throw new NoJavaImplementationException(baseType);
-        }
-        baseTypes.add(baseType);
-        return this;
-    }
-
-    public SDOTypeVisitor visitAlias(String aliasName) {
-        return this;
-    }
-
-    public SDOPropertyVisitor visitProperty(String name, Type type, boolean many, boolean contains, boolean readOnly) throws NoJavaImplementationException {
-        if (type.getInstanceClass() == null) {
-            throw new NoJavaImplementationException(type);
-        }
-        PropVisitor propVisitor = new PropVisitor(name, type, many, readOnly);
-        props.add(propVisitor);
-        return propVisitor;
-    }
+    private final PrintWriter writer;
 
-    public SDOTypeVisitor visitJavaType(java.lang.reflect.Type javaType) {
-        if (javaType instanceof Class<?>) {
-            Class<?> javaClass = (Class<?>) javaType;
-            packageName = javaClass.getPackage().getName();
-            interfaceName = javaClass.getSimpleName();
-        } else {
-            throw new UnsupportedOperationException();
-        }
-        return this;
+    public JavaInterfaceGenerator(PrintWriter writer) {
+        this.writer = writer;
     }
 
-    public void visitEnd() {
-    }
-
-    public void writeTo(PrintWriter writer) {
-        if (packageName != null) {
+    public void visitType(Type type) {
+        String name = type.getName();
+        int lastDot = name.lastIndexOf('.');
+        if (lastDot != -1) {
             writer.print("package ");
-            writer.print(packageName);
+            writer.print(name.substring(0, lastDot));
             writer.println(';');
             writer.println();
+
+            name = name.substring(lastDot + 1);
+        } else {
+            name = Character.toUpperCase(name.charAt(0)) + name.substring(1);
         }
+
         writer.print("public interface ");
-        writer.print(interfaceName);
+        writer.print(name);
+        List baseTypes = type.getBaseTypes();
         for (int i = 0; i < baseTypes.size(); i++) {
-            Type type = baseTypes.get(i);
+            Type baseType = (Type) baseTypes.get(i);
             if (i == 0) {
                 writer.print(" extends ");
             } else {
                 writer.print(", ");
             }
-            writer.print(type.getInstanceClass().getName());
+            writer.print(baseType.getInstanceClass().getName());
         }
-        writer.println(" {");
-        for (PropVisitor prop : props) {
-            prop.writeTo(writer);
-        }
-        writer.println('}');
-    }
 
-    public String toString() {
-        StringWriter out = new StringWriter();
-        PrintWriter writer = new PrintWriter(out);
-        writeTo(writer);
-        writer.flush();
-        return out.toString();
+        writer.println(" {");
     }
 
-    private static class PropVisitor implements SDOPropertyVisitor {
-        private final String name;
-        private final Type type;
-        private final boolean many;
-        private final boolean readOnly;
-
-        public PropVisitor(String name, Type type, boolean many, boolean readOnly) {
-            this.name = name;
-            this.type = type;
-            this.many = many;
-            this.readOnly = readOnly;
-        }
-
-        public SDOPropertyVisitor visitDefault(Object defaultValue) {
-            return this;
-        }
-
-        public SDOPropertyVisitor visitAlias(String aliasName) {
-            throw new UnsupportedOperationException();
-        }
-
-        public SDOPropertyVisitor visitOpposite(Property opposite) {
-            return this;
-        }
-
-        public SDOPropertyVisitor visitGetter(Method getter) {
-            throw new UnsupportedOperationException();
-        }
-
-        public SDOPropertyVisitor visitSetter(Method setter) {
-            throw new UnsupportedOperationException();
-        }
-
-        public void visitEnd() {
-        }
-
-        public void writeTo(PrintWriter writer) {
-            String propertyName = Character.toUpperCase(name.charAt(0)) + name.substring(1);
-            String javaType = type.getInstanceClass().getCanonicalName();
-
-            if (!many) {
-                writer.print("    ");
-                writer.print(javaType);
-                writer.print("boolean".equals(javaType) ? " is" : " get");
+    public void visitProperty(Property property) {
+        String name = property.getName();
+        String propertyName = Character.toUpperCase(name.charAt(0)) + name.substring(1);
+        String javaType = property.getType().getInstanceClass().getCanonicalName();
+
+        if (!property.isMany()) {
+            writer.print("    ");
+            writer.print(javaType);
+            writer.print("boolean".equals(javaType) ? " is" : " get");
+            writer.print(propertyName);
+            writer.println("();");
+            if (!property.isReadOnly()) {
+                writer.print("    void set");
                 writer.print(propertyName);
-                writer.println("();");
-                if (!readOnly) {
-                    writer.print("    void set");
-                    writer.print(propertyName);
-                    writer.print('(');
-                    writer.print(javaType);
-                    writer.println(" value);");
-                }
-            } else {
-                writer.print("    java.util.List get");
-                writer.print(propertyName);
-                writer.println("();");
+                writer.print('(');
+                writer.print(javaType);
+                writer.println(" value);");
             }
+        } else {
+            writer.print("    java.util.List get");
+            writer.print(propertyName);
+            writer.println("();");
         }
     }
-}
+
+    public void visitEnd() {
+        writer.println('}');
+        writer.flush();
+    }
+}
\ No newline at end of file

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java?rev=374561&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java Thu Feb  2 17:57:42 2006
@@ -0,0 +1,164 @@
+/**
+ *
+ * Copyright 2005 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.sdo.codegen;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BytecodeInterfaceGeneratorTestCase extends TestCase {
+    private MockType foo;
+    private BytecodeInterfaceGenerator gen;
+    private TestClassLoader cl;
+
+    public void testHeaderNoBaseClass() {
+        gen.visitType(foo);
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals("Foo", c.getName());
+        assertTrue(c.isInterface());
+        assertEquals(0, c.getInterfaces().length);
+        assertEquals(0, c.getMethods().length);
+    }
+
+    public void testHeaderWithPackage() {
+        gen.visitType(new MockType("org.apache.Foo", null));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals("org.apache.Foo", c.getName());
+        assertEquals(0, c.getInterfaces().length);
+        assertEquals(0, c.getMethods().length);
+    }
+
+    public void testHeaderOneBaseClass() throws NoJavaImplementationException {
+        foo.addBaseType(new MockType("bar1", Bar1.class));
+        gen.visitType(foo);
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals("Foo", c.getName());
+        assertEquals(1, c.getInterfaces().length);
+        assertEquals(Bar1.class, c.getInterfaces()[0]);
+        assertEquals(0, c.getMethods().length);
+    }
+
+    public void testHeaderMultipleBaseClass() throws NoJavaImplementationException {
+        foo.addBaseType(new MockType("bar1", Bar1.class));
+        foo.addBaseType(new MockType("bar2", Bar2.class));
+        gen.visitType(foo);
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals("Foo", c.getName());
+        assertEquals(2, c.getInterfaces().length);
+        assertEquals(Bar1.class, c.getInterfaces()[0]);
+        assertEquals(Bar2.class, c.getInterfaces()[1]);
+        assertEquals(0, c.getMethods().length);
+    }
+
+    public void testBooleanProperty() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("true", Boolean.TYPE, false, false));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(2, c.getMethods().length);
+        Method getter = c.getMethod("isTrue");
+        assertEquals(boolean.class, getter.getReturnType());
+        Method setter = c.getMethod("setTrue", boolean.class);
+        assertEquals(void.class, setter.getReturnType());
+    }
+
+    public void testByteArrayProperty() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("bytes", byte[].class, false, false));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(2, c.getMethods().length);
+        Method getter = c.getMethod("getBytes");
+        assertEquals(byte[].class, getter.getReturnType());
+        Method setter = c.getMethod("setBytes", byte[].class);
+        assertEquals(void.class, setter.getReturnType());
+    }
+
+    public void testObjectProperty() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("bar", Bar1.class, false, false));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(2, c.getMethods().length);
+        Method getter = c.getMethod("getBar");
+        assertEquals(Bar1.class, getter.getReturnType());
+        Method setter = c.getMethod("setBar", Bar1.class);
+        assertEquals(void.class, setter.getReturnType());
+    }
+
+    public void testReadOnlyProperty() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("int", Integer.TYPE, false, true));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(1, c.getMethods().length);
+        Method getter = c.getMethod("getInt");
+        assertEquals(int.class, getter.getReturnType());
+    }
+
+    public void testManyProperty() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("list", Integer.TYPE, true, false));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(1, c.getMethods().length);
+        Method getter = c.getMethod("getList");
+        assertEquals(List.class, getter.getReturnType());
+    }
+
+    public void testTwoProperties() throws NoJavaImplementationException, NoSuchMethodException {
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("true", Boolean.TYPE, false, false));
+        gen.visitProperty(new MockProperty("int", Integer.TYPE, false, false));
+        gen.visitEnd();
+        Class<?> c = cl.addClass(gen.getClassData());
+        assertEquals(4, c.getMethods().length);
+        Method getter = c.getMethod("isTrue");
+        assertEquals(boolean.class, getter.getReturnType());
+        Method setter = c.getMethod("setTrue", boolean.class);
+        assertEquals(void.class, setter.getReturnType());
+        getter = c.getMethod("getInt");
+        assertEquals(int.class, getter.getReturnType());
+        setter = c.getMethod("setInt", int.class);
+        assertEquals(void.class, setter.getReturnType());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        foo = new MockType("foo", null);
+        gen = new BytecodeInterfaceGenerator();
+        cl = new TestClassLoader();
+    }
+
+    private class TestClassLoader extends ClassLoader {
+        public TestClassLoader() {
+            super(TestClassLoader.class.getClassLoader());
+        }
+
+        Class<?> addClass(byte[] bytes) {
+            return defineClass(null, bytes, 0, bytes.length);
+        }
+    }
+}

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/BytecodeInterfaceGeneratorTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java?rev=374561&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java Thu Feb  2 17:57:42 2006
@@ -0,0 +1,23 @@
+/**
+ *
+ * Copyright 2005 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.sdo.codegen;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface Foo {
+}

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/Foo.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGeneratorTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGeneratorTestCase.java?rev=374561&r1=374560&r2=374561&view=diff
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGeneratorTestCase.java (original)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/JavaInterfaceGeneratorTestCase.java Thu Feb  2 17:57:42 2006
@@ -16,11 +16,10 @@
  */
 package org.apache.tuscany.sdo.codegen;
 
-import java.util.List;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 
 import junit.framework.TestCase;
-import commonj.sdo.Type;
-import commonj.sdo.Property;
 
 /**
  * @version $Rev$ $Date$
@@ -29,87 +28,84 @@
     private static final String SEP = System.getProperty("line.separator");
 
     private JavaInterfaceGenerator gen;
+    private StringWriter writer;
+    private MockType foo;
 
     public void testHeaderNoBaseClass() {
-        gen.visitType(null, "Foo", false, false, false);
+        gen.visitType(foo);
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n}\n"), writer.toString());
     }
 
     public void testHeaderWithPackage() {
-        gen.visitType(null, "org.apache.Foo", false, false, false);
+        gen.visitType(new MockType("org.apache.Foo", null));
         gen.visitEnd();
-        assertEquals(localize("package org.apache;\n\npublic interface Foo {\n}\n"), gen.toString());
-    }
-
-    public void testJavaTypeOverridesSDO() {
-        gen.visitType(null, "org.apache.Foo", false, false, false);
-        gen.visitJavaType(Bar1.class);
-        gen.visitEnd();
-        assertEquals(localize("package org.apache.tuscany.sdo.codegen;\n\npublic interface Bar1 {\n}\n"), gen.toString());
+        assertEquals(localize("package org.apache;\n\npublic interface Foo {\n}\n"), writer.toString());
     }
 
     public void testHeaderOneBaseClass() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitBaseType(new MockType(Bar1.class));
+        foo.addBaseType(new MockType("bar1", Bar1.class));
+        gen.visitType(foo);
         gen.visitEnd();
-        assertEquals(localize("public interface Foo extends org.apache.tuscany.sdo.codegen.Bar1 {\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo extends org.apache.tuscany.sdo.codegen.Bar1 {\n}\n"), writer.toString());
     }
 
     public void testHeaderMultipleBaseClass() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitBaseType(new MockType(Bar1.class));
-        gen.visitBaseType(new MockType(Bar2.class));
+        foo.addBaseType(new MockType("bar1", Bar1.class));
+        foo.addBaseType(new MockType("bar2", Bar2.class));
+        gen.visitType(foo);
         gen.visitEnd();
-        assertEquals(localize("public interface Foo extends org.apache.tuscany.sdo.codegen.Bar1, org.apache.tuscany.sdo.codegen.Bar2 {\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo extends org.apache.tuscany.sdo.codegen.Bar1, org.apache.tuscany.sdo.codegen.Bar2 {\n}\n"), writer.toString());
     }
 
     public void testBooleanProperty() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("true", new MockType(Boolean.TYPE), false, false, false);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("true", Boolean.TYPE, false, false));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\tboolean isTrue();\n\tvoid setTrue(boolean value);\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\tboolean isTrue();\n\tvoid setTrue(boolean value);\n}\n"), writer.toString());
     }
 
     public void testByteArrayProperty() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("bytes", new MockType(byte[].class), false, false, false);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("bytes", byte[].class, false, false));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\tbyte[] getBytes();\n\tvoid setBytes(byte[] value);\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\tbyte[] getBytes();\n\tvoid setBytes(byte[] value);\n}\n"), writer.toString());
     }
 
     public void testObjectProperty() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("bar", new MockType(Bar1.class), false, false, false);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("bar", Bar1.class, false, false));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\torg.apache.tuscany.sdo.codegen.Bar1 getBar();\n\tvoid setBar(org.apache.tuscany.sdo.codegen.Bar1 value);\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\torg.apache.tuscany.sdo.codegen.Bar1 getBar();\n\tvoid setBar(org.apache.tuscany.sdo.codegen.Bar1 value);\n}\n"), writer.toString());
     }
 
     public void testReadOnlyProperty() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("int", new MockType(Integer.TYPE), false, false, true);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("int", Integer.TYPE, false, true));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\tint getInt();\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\tint getInt();\n}\n"), writer.toString());
     }
 
     public void testManyProperty() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("list", new MockType(Integer.TYPE), true, false, false);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("list", Integer.TYPE, true, false));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\tjava.util.List getList();\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\tjava.util.List getList();\n}\n"), writer.toString());
     }
 
     public void testTwoProperties() throws NoJavaImplementationException {
-        gen.visitType(null, "Foo", false, false, false);
-        gen.visitProperty("true", new MockType(Boolean.TYPE), false, false, false);
-        gen.visitProperty("int", new MockType(Integer.TYPE), false, false, false);
+        gen.visitType(foo);
+        gen.visitProperty(new MockProperty("true", Boolean.TYPE, false, false));
+        gen.visitProperty(new MockProperty("int", Integer.TYPE, false, false));
         gen.visitEnd();
-        assertEquals(localize("public interface Foo {\n\tboolean isTrue();\n\tvoid setTrue(boolean value);\n\tint getInt();\n\tvoid setInt(int value);\n}\n"), gen.toString());
+        assertEquals(localize("public interface Foo {\n\tboolean isTrue();\n\tvoid setTrue(boolean value);\n\tint getInt();\n\tvoid setInt(int value);\n}\n"), writer.toString());
     }
 
     protected void setUp() throws Exception {
         super.setUp();
-        gen = new JavaInterfaceGenerator();
+        writer = new StringWriter();
+        gen = new JavaInterfaceGenerator(new PrintWriter(writer));
+        foo = new MockType("foo", null);
     }
 
     private String localize(String s) {
@@ -127,63 +123,4 @@
         return b.toString();
     }
 
-    private static class MockType implements Type {
-        private final Class javaClass;
-
-        public MockType(Class javaClass) {
-            this.javaClass = javaClass;
-        }
-
-        public String getName() {
-            return javaClass.toString();
-        }
-
-        public String getURI() {
-            throw new UnsupportedOperationException();
-        }
-
-        public Class getInstanceClass() {
-            return javaClass;
-        }
-
-        public boolean isInstance(Object object) {
-            throw new UnsupportedOperationException();
-        }
-
-        public List /*Property*/ getProperties() {
-            throw new UnsupportedOperationException();
-        }
-
-        public Property getProperty(String propertyName) {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean isDataType() {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean isOpen() {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean isSequenced() {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean isAbstract() {
-            throw new UnsupportedOperationException();
-        }
-
-        public List /*Type*/ getBaseTypes() {
-            throw new UnsupportedOperationException();
-        }
-
-        public List /*Property*/ getDeclaredProperties() {
-            throw new UnsupportedOperationException();
-        }
-
-        public List /*String*/ getAliasNames() {
-            throw new UnsupportedOperationException();
-        }
-    }
 }

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java?rev=374561&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java Thu Feb  2 17:57:42 2006
@@ -0,0 +1,75 @@
+/**
+ *
+ * Copyright 2005 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.sdo.codegen;
+
+import java.util.List;
+
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class MockProperty implements Property {
+    private final String name;
+    private final Type type;
+    private final boolean many;
+    private final boolean readOnly;
+
+    public MockProperty(String name, Class type, boolean many, boolean readOnly) {
+        this.name = name;
+        this.type = new MockType(null, type);
+        this.many = many;
+        this.readOnly = readOnly;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public boolean isMany() {
+        return many;
+    }
+
+    public boolean isContainment() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Type getContainingType() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Object getDefault() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isReadOnly() {
+        return readOnly;
+    }
+
+    public Property getOpposite() {
+        throw new UnsupportedOperationException();
+    }
+
+    public List /*String*/ getAliasNames() {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockProperty.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java?rev=374561&view=auto
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java Thu Feb  2 17:57:42 2006
@@ -0,0 +1,93 @@
+/**
+ *
+ * Copyright 2005 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.sdo.codegen;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import commonj.sdo.Type;
+import commonj.sdo.Property;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class MockType implements Type {
+    private final String name;
+    private final Class javaClass;
+    private final List<Type> baseTypes = new ArrayList<Type>();
+
+    public MockType(String name, Class javaClass) {
+        this.javaClass = javaClass;
+        this.name = name;
+    }
+
+    public void addBaseType(Type baseType) {
+        baseTypes.add(baseType);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getURI() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Class getInstanceClass() {
+        return javaClass;
+    }
+
+    public boolean isInstance(Object object) {
+        throw new UnsupportedOperationException();
+    }
+
+    public List /*Property*/ getProperties() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Property getProperty(String propertyName) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isDataType() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isOpen() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isSequenced() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isAbstract() {
+        throw new UnsupportedOperationException();
+    }
+
+    public List /*Type*/ getBaseTypes() {
+        return baseTypes;
+    }
+
+    public List /*Property*/ getDeclaredProperties() {
+        throw new UnsupportedOperationException();
+    }
+
+    public List /*String*/ getAliasNames() {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/codegen/MockType.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date