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/01/23 22:54:06 UTC

svn commit: r371679 - in /incubator/tuscany/sandbox/jboynes/sdoproxy/src: main/java/org/apache/tuscany/sdo/helper/ main/java/org/apache/tuscany/sdo/impl/ main/java/org/osoa/sdo/ test/java/org/apache/tuscany/sdo/proxy/

Author: jboynes
Date: Mon Jan 23 13:53:57 2006
New Revision: 371679

URL: http://svn.apache.org/viewcvs?rev=371679&view=rev
Log:
Make generated class extend AbstractDataObject
Associate a Type with each instance
Support getString(int)
Simple DataObject->DOM converter and DOM printer


Added:
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java   (with props)
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java   (with props)
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java   (with props)
Modified:
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOGenerator.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOInstanceFactory.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/TypeImpl.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/DataObject.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/Type.java
    incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/PrimitivesTestCase.java

Added: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java?rev=371679&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java (added)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java Mon Jan 23 13:53:57 2006
@@ -0,0 +1,81 @@
+/**
+ *
+ * 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.helper;
+
+import java.io.OutputStream;
+import java.io.Writer;
+import java.io.PrintWriter;
+import java.io.IOException;
+
+import org.osoa.sdo.DataObject;
+import org.osoa.sdo.Property;
+import org.osoa.sdo.Type;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DOMHelperImpl {
+    public void save(DataObject<?> dataObject, Document doc) {
+        Type<?> t = dataObject.getType();
+        Element element = doc.createElementNS(t.getName().getNamespaceURI(), t.getName().getLocalPart());
+        int i = 0;
+        for (Property<?> property : dataObject.getType().getProperties()) {
+            String value = dataObject.getString(i++);
+            if (value != null) {
+                Element propElement = doc.createElementNS(null, property.getName());
+                if (property.getType().isDataType()) {
+                    propElement.appendChild(doc.createTextNode(value.toString()));
+                }
+                element.appendChild(propElement);
+            }
+        }
+        doc.appendChild(element);
+    }
+
+    public void writeTo(OutputStream os, Document doc) throws IOException {
+        PrintWriter writer = new PrintWriter(os);
+        writeTo(writer, doc.getDocumentElement());
+        writer.flush();
+    }
+
+    private void writeTo(PrintWriter writer, Element e) throws IOException {
+        writer.append('<');
+        writer.append(e.getLocalName());
+        if (e.hasChildNodes()) {
+            writer.append('>');
+            for (Node node = e.getFirstChild(); node != null; node = node.getNextSibling()) {
+                switch (node.getNodeType()) {
+                case Node.TEXT_NODE:
+                    writer.append(node.getTextContent());
+                    break;
+                case Node.ELEMENT_NODE:
+                    writeTo(writer, (Element) node);
+                    break;
+                }
+            }
+            writer.append('<');
+            writer.append('/');
+            writer.append(e.getLocalName());
+            writer.append('>');
+        } else {
+            writer.append("/>");
+        }
+    }
+}

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Added: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java?rev=371679&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java (added)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java Mon Jan 23 13:53:57 2006
@@ -0,0 +1,67 @@
+/**
+ *
+ * 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.impl;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import org.osoa.sdo.DataObject;
+import org.osoa.sdo.Type;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public abstract class AbstractDataObject<T> implements DataObject<T> {
+    private final TypeImpl<T> type;
+
+    protected AbstractDataObject(TypeImpl<T> type) {
+        this.type = type;
+    }
+
+    public Type<T> getType() {
+        return type;
+    }
+
+    public String getString(int index) {
+        Object value = get(index);
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof String) {
+            return (String) value;
+        }
+        if (value instanceof Date) {
+            DateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.'SSSz");
+            f.setTimeZone(TimeZone.getTimeZone("GMT"));
+            return f.format(value);
+        }
+        if (value instanceof byte[]) {
+            byte[] bytes = (byte[]) value;
+            StringBuilder buf = new StringBuilder(bytes.length<<1);
+            for (byte b : bytes) {
+                buf.append(HEX[b >>> 4]);
+                buf.append(HEX[b & 0xf]);
+            }
+            return buf.toString();
+        }
+        return value.toString();
+    }
+
+    private static final char[] HEX = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+}

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/AbstractDataObject.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java Mon Jan 23 13:53:57 2006
@@ -25,6 +25,10 @@
  */
 class DataTypeImpl<T> extends TypeImpl<T> {
     public DataTypeImpl(QName name, Class<T> instanceClass) {
-        super(name, instanceClass, Collections.EMPTY_LIST, new POJOInstanceFactory(instanceClass));
+        super(name, instanceClass, Collections.EMPTY_LIST, new POJOInstanceFactory<T>(instanceClass));
+    }
+
+    public boolean isDataType() {
+        return true;
     }
 }

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOGenerator.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOGenerator.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOGenerator.java Mon Jan 23 13:53:57 2006
@@ -56,14 +56,14 @@
     private static final Type[] NO_ARGS = {};
 
     private final String name;
-    private final List<Property> props;
+    private final List<Property<?>> props;
     private ClassWriter cw;
     private String internalInterfaceName;
 
     public SDOGenerator(Class<?> interfaceClass) {
         internalInterfaceName = getInternalName(interfaceClass.getName());
         name = internalInterfaceName + SDO_MARKER;
-        props = new ArrayList();
+        props = new ArrayList<Property<?>>();
     }
 
     public void addProperty(Property<?> property) {
@@ -72,7 +72,7 @@
 
     public byte[] toByteArray() {
         cw = new ClassWriter(false);
-        cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name, null, "java/lang/Object", new String[]{internalInterfaceName, "org/osoa/sdo/DataObject"});
+        cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name, null, "org/apache/tuscany/sdo/impl/AbstractDataObject", new String[]{internalInterfaceName});
 
         for (Property<?> property : props) {
             generateProperty(property);
@@ -150,12 +150,13 @@
     }
 
     private void generateConstructor() {
-        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/apache/tuscany/sdo/impl/TypeImpl;)V", null, null);
         mv.visitCode();
         mv.visitInsn(ALOAD_0);
-        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
+        mv.visitInsn(ALOAD_1);
+        mv.visitMethodInsn(INVOKESPECIAL, "org/apache/tuscany/sdo/impl/AbstractDataObject", "<init>", "(Lorg/apache/tuscany/sdo/impl/TypeImpl;)V");
         mv.visitInsn(RETURN);
-        mv.visitMaxs(1, 1);
+        mv.visitMaxs(2, 2);
         mv.visitEnd();
     }
 

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOInstanceFactory.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOInstanceFactory.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOInstanceFactory.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/SDOInstanceFactory.java Mon Jan 23 13:53:57 2006
@@ -17,6 +17,9 @@
  */
 package org.apache.tuscany.sdo.impl;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
 import org.osoa.sdo.Type;
 
 /**
@@ -24,18 +27,33 @@
  */
 public class SDOInstanceFactory<T> implements InstanceFactory<T> {
     private Class<T> implementationClass;
+    private Constructor<T> ctr;
 
     public void setImplementationClass(Class<T> implementationClass) {
         this.implementationClass = implementationClass;
+        try {
+            ctr = implementationClass.getConstructor(TypeImpl.class);
+        } catch (NoSuchMethodException e) {
+            throw new AssertionError();
+        }
     }
 
     public T newInstance(Type<T> type) {
         try {
-            return implementationClass.newInstance();
+            return ctr.newInstance(type);
         } catch (InstantiationException e) {
             throw (AssertionError) new AssertionError("Unable to instantiate " + implementationClass.getName()).initCause(e);
         } catch (IllegalAccessException e) {
             throw (AssertionError) new AssertionError("Unable to instantiate " + implementationClass.getName()).initCause(e);
+        } catch (InvocationTargetException e) {
+            Throwable t = e.getCause();
+            if (t instanceof RuntimeException) {
+                throw (RuntimeException) t;
+            } else if (t instanceof Error) {
+                throw (Error) t;
+            } else {
+                throw new AssertionError("SDO Implementation threw checked exception");
+            }
         }
     }
 }

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/TypeImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/TypeImpl.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/TypeImpl.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/impl/TypeImpl.java Mon Jan 23 13:53:57 2006
@@ -57,4 +57,8 @@
     public List<Property> getProperties() {
         return propList;
     }
+
+    public boolean isDataType() {
+        return false;
+}
 }

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/DataObject.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/DataObject.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/DataObject.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/DataObject.java Mon Jan 23 13:53:57 2006
@@ -20,7 +20,11 @@
 /**
  * @version $Rev$ $Date$
  */
-public interface DataObject {
+public interface DataObject<T> {
     Object get(int index);
     void set(int index, Object value);
+
+    Type<T> getType();
+
+    String getString(int index);
 }

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/Type.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/Type.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/Type.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/main/java/org/osoa/sdo/Type.java Mon Jan 23 13:53:57 2006
@@ -46,4 +46,6 @@
     T newInstance();
 
     List<Property> getProperties();
+
+    boolean isDataType();
 }

Added: incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java?rev=371679&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java (added)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java Mon Jan 23 13:53:57 2006
@@ -0,0 +1,79 @@
+/**
+ *
+ * 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.proxy;
+
+import java.io.IOException;
+import java.util.Date;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import junit.framework.TestCase;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.osoa.sdo.helper.TypeHelper;
+import org.osoa.sdo.Type;
+import org.osoa.sdo.DataObject;
+
+import org.apache.tuscany.sdo.impl.TypeHelperImpl;
+import org.apache.tuscany.sdo.proxy.interfaces.Primitives;
+import org.apache.tuscany.sdo.proxy.interfaces.DataTypes;
+import org.apache.tuscany.sdo.helper.DOMHelperImpl;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DOMHelperTestCase extends TestCase {
+    private Primitives primitives;
+    private DataTypes dataTypes;
+    private DOMHelperImpl domHelper;
+    private Document doc;
+
+    public void testPrimitives() throws IOException {
+        domHelper.save((DataObject<Primitives>) primitives, doc);
+        Element e = doc.getDocumentElement();
+        assertEquals(Type.JAVA_NAMESPACE, e.getNamespaceURI());
+        assertEquals(Primitives.class.getName(), e.getLocalName());
+        assertEquals(8, e.getChildNodes().getLength());
+//        domHelper.writeTo(System.out, doc);
+    }
+
+    public void testDataTypes() throws IOException {
+        dataTypes.setString("Hello World");
+        dataTypes.setBytes(new byte[]{ 0 , 1, 2, 3});
+        dataTypes.setDate(new Date());
+        domHelper.save((DataObject<DataTypes>) dataTypes, doc);
+        Element e = doc.getDocumentElement();
+        assertEquals(Type.JAVA_NAMESPACE, e.getNamespaceURI());
+        assertEquals(DataTypes.class.getName(), e.getLocalName());
+        assertEquals(3, e.getChildNodes().getLength());
+//        domHelper.writeTo(System.out, doc);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        doc = builder.newDocument();
+
+        domHelper = new DOMHelperImpl();
+
+        TypeHelper typeHelper = new TypeHelperImpl(getClass().getClassLoader());
+        primitives = typeHelper.define(Primitives.class).newInstance();
+        dataTypes = typeHelper.define(DataTypes.class).newInstance();
+    }
+}

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/DOMHelperTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/PrimitivesTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/PrimitivesTestCase.java?rev=371679&r1=371678&r2=371679&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/PrimitivesTestCase.java (original)
+++ incubator/tuscany/sandbox/jboynes/sdoproxy/src/test/java/org/apache/tuscany/sdo/proxy/PrimitivesTestCase.java Mon Jan 23 13:53:57 2006
@@ -36,6 +36,11 @@
 
     public void testIsDataObject() {
         assertTrue(primitives instanceof DataObject);
+        DataObject<Primitives> o = (DataObject<Primitives>) primitives;
+        Type<Primitives> type = o.getType();
+        assertNotNull(type);
+        assertEquals(this.type, type);
+        assertEquals(Primitives.class, type.getInstanceClass());
     }
 
     public void testBoolean() {