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() {