You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sv...@apache.org on 2007/02/06 18:17:44 UTC

svn commit: r504204 - in /incubator/tuscany/java/sca/kernel/core/src: main/java/org/apache/tuscany/core/databinding/impl/ main/java/org/apache/tuscany/core/databinding/javabeans/ main/resources/org/apache/tuscany/core/ test/java/org/apache/tuscany/core...

Author: svkrish
Date: Tue Feb  6 09:17:42 2007
New Revision: 504204

URL: http://svn.apache.org/viewvc?view=rev&rev=504204
Log:
Refactored JavaBeansDB transformers to enable other XML bindings to extend for e.g. AxiomOMElement2JavaBean etc.

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLTransformer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaBeanTransformer.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformerTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformerTestCase.java
Removed:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBean.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNode.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XMLTypeMapperExtension.java
Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/Java2XMLMapperException.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaMapperException.java
    incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/databinding.scdl
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java Tue Feb  6 09:17:42 2007
@@ -24,6 +24,7 @@
 
 import org.osoa.sca.annotations.EagerInit;
 
+import org.apache.tuscany.core.databinding.javabeans.JavaBeansDataBinding;
 import org.apache.tuscany.spi.databinding.DataBinding;
 import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 import org.apache.tuscany.spi.model.DataType;
@@ -56,25 +57,34 @@
     }
 
     public DataType introspectType(Class<?> javaType) {
-        DataType dataType;
+        DataType dataType = null;
         for (DataBinding binding : bindings.values()) {
-            dataType = binding.introspect(javaType);
+            //don't introspect for JavaBeansDatabinding as all javatypes will anyways match to its basetype 
+            //which is java.lang.Object.  Default to this only if no databinding results
+            if (!binding.getName().equals(JavaBeansDataBinding.NAME)) {
+                dataType = binding.introspect(javaType);
+            }
+            
             if (dataType != null) {
                 return dataType;
             }
         }
-        return null;
+        return new DataType<Class>(JavaBeansDataBinding.NAME, Object.class, javaType);
     }
 
     public DataType introspectType(Object value) {
-        DataType dataType;
+        DataType dataType = null;
         for (DataBinding binding : bindings.values()) {
-            dataType = binding.introspect(value);
+            //don't introspect for JavaBeansDatabinding as all javatypes will anyways match to its basetype 
+            //which is java.lang.Object.  Default to this only if no databinding results
+            if (!binding.getName().equals(JavaBeansDataBinding.NAME)) {
+                dataType = binding.introspect(value);
+            }
             if (dataType != null) {
                 return dataType;
             }
         }
-        return null;
+        return new DataType<Class>(JavaBeansDataBinding.NAME, Object.class, value.getClass());
     }
 
 }

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformer.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformer.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformer.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.spi.databinding.PullTransformer;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.Transformer;
+import org.apache.tuscany.spi.databinding.extension.TransformerExtension;
+import org.apache.tuscany.spi.idl.ElementInfo;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Transformer to convert data from DOM Node to JavaBean
+ */
+@Service(Transformer.class)
+public class DOMNode2JavaBeanTransformer extends XML2JavaBeanTransformer<Node> {
+    
+    @Override
+    public List<Node> getChildElements(Node parent) throws XML2JavaMapperException {
+        NodeList nodeList = parent.getChildNodes();
+        ArrayList<Node> nodeArrayList = new ArrayList<Node>(nodeList.getLength());
+        for (int count = 0 ; count < nodeList.getLength() ; ++count) {
+            nodeArrayList.add(nodeList.item(count));
+        }
+        
+        return nodeArrayList;
+    }
+
+    @Override
+    public String getElementName(Node element) throws XML2JavaMapperException {
+        return element.getNodeName();
+    }
+
+    @Override
+    public String getText(Node element) throws XML2JavaMapperException {
+        if (element instanceof Document) {
+            element = ((Document) element).getDocumentElement();
+        }
+        return element.getTextContent();
+    }
+
+    @Override
+    public boolean isTextElement(Node element) throws XML2JavaMapperException {
+        if (element.getNodeType() == 3) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public Class getSourceType() {
+        return Node.class;
+    }
+}

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/Java2XMLMapperException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/Java2XMLMapperException.java?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/Java2XMLMapperException.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/Java2XMLMapperException.java Tue Feb  6 09:17:42 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.core.databinding.javabeans;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.api.TuscanyRuntimeException;
 
 /**
@@ -28,12 +30,40 @@
 public class Java2XMLMapperException extends TuscanyRuntimeException {
     private static final long serialVersionUID = 6811924384399578686L;
 
+    private QName xmlElementName;
+    private String javaFieldName;
+    private Class javaType;
+    
     public Java2XMLMapperException(String message) {
         super(message);
     }
 
     public Java2XMLMapperException(Throwable cause) {
         super(cause);
+    }
+
+    public String getJavaFieldName() {
+        return javaFieldName;
+    }
+
+    public void setJavaFieldName(String javaFieldName) {
+        this.javaFieldName = javaFieldName;
+    }
+
+    public Class getJavaType() {
+        return javaType;
+    }
+
+    public void setJavaType(Class javaType) {
+        this.javaType = javaType;
+    }
+
+    public QName getXmlElementName() {
+        return xmlElementName;
+    }
+
+    public void setXmlElementName(QName xmlElementName) {
+        this.xmlElementName = xmlElementName;
     }
 
 }

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformer.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformer.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformer.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.tuscany.spi.databinding.PullTransformer;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.Transformer;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
+import org.apache.tuscany.spi.databinding.extension.TransformerExtension;
+import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * Transformer to convert data from a JavaBean object to DOM Node
+ */
+@Service(Transformer.class)
+public class JavaBean2DOMNodeTransformer extends JavaBean2XMLTransformer<Node> {
+
+    public static final String COLON = ":";
+    private Document factory;
+    
+    public JavaBean2DOMNodeTransformer() {
+        super();
+        try {
+            factory = DOMHelper.newDocument(); 
+        } catch (ParserConfigurationException e) {
+            throw new Java2XMLMapperException(e);
+        }
+    }
+    
+    @Override
+    public void appendChild(Node parentElement, Node childElement) throws Java2XMLMapperException {
+        parentElement.appendChild(childElement);
+    }
+
+    @Override
+    public Node createElement(QName qName) throws Java2XMLMapperException {
+        String qualifedName = 
+                (qName.getPrefix() == null ||  qName.getPrefix().length() <= 0) ? qName.getLocalPart() : 
+                    qName.getPrefix() + COLON + qName.getLocalPart();
+        return factory.createElementNS(qName.getNamespaceURI(), qualifedName);
+    }
+
+    @Override
+    public Node createText(String textData) throws Java2XMLMapperException {
+        return factory.createTextNode(textData);
+    }
+
+    public Class getTargetType() {
+        return Node.class;
+    }
+
+}

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLTransformer.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLTransformer.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLTransformer.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.spi.databinding.PullTransformer;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.Transformer;
+import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.spi.databinding.extension.TransformerExtension;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Transformer to convert data from a JavaBean object to xml
+ */
+@Service(Transformer.class)
+public abstract class JavaBean2XMLTransformer<T> extends TransformerExtension<Object, T> implements
+        PullTransformer<Object, T> {
+
+    public static final String GET = "get";
+    public static final String PREFIX = "n";
+    public static final String PERIOD = ".";
+    public static final String FWD_SLASH = "/";
+    public static final String HTTP = "http://";
+    public static int prefix_count = 1;
+    
+    protected SimpleTypeMapperExtension<T> mapper;
+
+    public JavaBean2XMLTransformer() {
+        this.mapper = new SimpleTypeMapperExtension<T>();
+    }
+
+    public T transform(Object source, TransformationContext context) {
+        QName rootElementName = (QName)context.getTargetDataType().getMetadata("RootElementName");
+        if (rootElementName == null) {
+            rootElementName = new QName(resolveRootElementName(source.getClass()));
+        }
+        T root = createElement(rootElementName);
+        appendChildElements(root,
+                            resolveElementName(source.getClass()),
+                            source.getClass(),
+                            source,
+                            context);
+        return root;
+    }
+    
+    private void appendChildElements(T parent,
+                                     QName elementName,
+                                     Class javaType,
+                                     Object javaObject,
+                                     TransformationContext context) {
+        T element = null;
+        if (javaObject != null) {
+            if (javaType.isPrimitive() || isSimpleJavaType(javaObject)) {
+                appendChild(parent, createText(mapper.toXMLLiteral(null, javaObject, context)));
+            } else if (javaType.isArray()) {
+                boolean arrayDone = false;
+                Object arrayObject = null;
+                for (int count = 0; !arrayDone; ++count) {
+                    try {
+                        arrayObject = Array.get(javaObject, count);
+                        element = createElement(elementName);
+                        appendChild(parent, element);
+                        appendChildElements(element, 
+                                            elementName, 
+                                            javaType.getComponentType(), 
+                                            arrayObject, 
+                                            context);
+                    } catch (ArrayIndexOutOfBoundsException e1) {
+                        arrayDone = true;
+                    }
+                }
+            } else {
+                Field[] javaFields = javaType.getFields();
+                for (Field aField : javaFields) {
+                    try {
+                        QName fieldElementName = new QName(aField.getName());
+                        if (!aField.getType().isArray()) {
+                            element = createElement(fieldElementName);
+                            appendChild(parent, element);
+                            appendChildElements(element,
+                                                fieldElementName,
+                                                aField.getType(),
+                                                aField.get(javaObject),
+                                                context);
+                        } else {
+                            appendChildElements(parent,
+                                                fieldElementName,
+                                                aField.getType(),
+                                                aField.get(javaObject),
+                                                context);
+                        }
+                    } catch (IllegalAccessException e) {
+                        Java2XMLMapperException java2xmlEx = new Java2XMLMapperException(e);
+                        java2xmlEx.setJavaFieldName(aField.getName());
+                        java2xmlEx.setJavaType(javaType);
+                        throw java2xmlEx;
+                    }
+                }
+
+                Method[] methods = javaType.getDeclaredMethods();
+                String fieldName = null;
+                for (Method aMethod : methods) {
+                    try {
+                        if (Modifier.isPublic(aMethod.getModifiers()) && aMethod.getName().startsWith(GET)
+                            && aMethod.getParameterTypes().length == 0) {
+                            fieldName = resolveFieldFromMethod(aMethod.getName());
+                            try {
+                                javaType.getField(fieldName);
+                            } catch (NoSuchFieldException e) {
+                                QName fieldElementName = new QName(fieldName);
+                                if (aMethod.getReturnType().isArray()) {
+                                    appendChildElements(parent, fieldElementName, aMethod.getReturnType(), aMethod
+                                        .invoke(javaObject, new Object[0]), context);
+                                } else {
+                                    element = createElement(fieldElementName);
+                                    appendChild(parent, element);
+                                    appendChildElements(element, fieldElementName, aMethod.getReturnType(), aMethod
+                                        .invoke(javaObject, new Object[0]), context);
+                                }
+                            }
+                        }
+                    } catch (IllegalAccessException e) {
+                        Java2XMLMapperException java2xmlEx = new Java2XMLMapperException(e);
+                        java2xmlEx.setJavaFieldName(fieldName);
+                        java2xmlEx.setJavaType(javaType);
+                        throw java2xmlEx;
+                    } catch (InvocationTargetException e) {
+                        Java2XMLMapperException java2xmlEx = new Java2XMLMapperException(e);
+                        java2xmlEx.setJavaFieldName(fieldName);
+                        java2xmlEx.setJavaType(javaType);
+                        throw java2xmlEx;
+                    }
+                }
+            }
+        }
+    }
+
+    public Class getSourceType() {
+        return Object.class;
+    }
+    
+    private boolean isSimpleJavaType(Object javaObject) {
+        if (javaObject instanceof String) {
+            return true;
+        }
+        if (javaObject instanceof Byte || javaObject instanceof Character
+            || javaObject instanceof Short
+            || javaObject instanceof Integer
+            || javaObject instanceof Long
+            || javaObject instanceof Float
+            || javaObject instanceof Double) {
+            return true;
+        }
+        if (javaObject instanceof GregorianCalendar || javaObject instanceof Date
+            || javaObject instanceof XMLGregorianCalendar
+            || javaObject instanceof byte[]
+            || javaObject instanceof QName) {
+            return true;
+        }
+        return false;
+    }
+    
+    private String resolveRootElementName(Class javaType) {
+        if (javaType.isArray()) {
+            return javaType.getComponentType().getSimpleName() + "_collection";
+        } else {
+            return javaType.getSimpleName() + "_instance";
+        }
+    }
+    
+    
+    private QName resolveElementName(Class javaType) {
+        if (javaType.isArray()) {
+            return new QName(javaType.getComponentType().getSimpleName());
+        } else {
+            return new QName(javaType.getSimpleName());
+        }
+    }
+    
+    private QName resolveQualifiedElementName(Class javaType) {
+        if (javaType.isArray()) {
+            return new QName(HTTP + javaType.getComponentType().getPackage().getName().replace(PERIOD, FWD_SLASH),
+                             javaType.getComponentType().getSimpleName(), getNexPrefix());
+        } else {
+            return new QName(HTTP + javaType.getPackage().getName().replace(PERIOD, FWD_SLASH),
+                             javaType.getSimpleName(), getNexPrefix());
+        }
+    }
+    
+    private String resolveFieldFromMethod(String methodName) {
+        StringBuffer fieldName = new StringBuffer();
+        fieldName.append(Character.toLowerCase(methodName.charAt(GET.length())));
+        fieldName.append(methodName.substring(GET.length() + 1));
+        return fieldName.toString();
+    }
+    
+    public String getNexPrefix() {
+        return PREFIX + prefix_count++;
+    }
+    
+    public abstract T createElement(QName qName) throws Java2XMLMapperException;
+    public abstract T createText(String textData) throws Java2XMLMapperException;
+    public abstract void appendChild(T parentElement, T childElement) throws Java2XMLMapperException;
+}

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaBeanTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaBeanTransformer.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaBeanTransformer.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaBeanTransformer.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,298 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.spi.databinding.PullTransformer;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.Transformer;
+import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.spi.databinding.extension.TransformerExtension;
+import org.apache.tuscany.spi.idl.ElementInfo;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Transformer to convert data from XML to JavaBean
+ */
+@Service(Transformer.class)
+public abstract class XML2JavaBeanTransformer<T> extends TransformerExtension<T, Object> implements
+        PullTransformer<T, Object> {
+
+    public static final String SET = "set";
+
+    protected SimpleTypeMapperExtension<T> mapper;
+
+    public XML2JavaBeanTransformer() {
+        this.mapper = new SimpleTypeMapperExtension<T>();
+    }
+
+    public Object transform(T source, TransformationContext context) {
+        TypeInfo xmlType =
+                (TypeInfo) context.getSourceDataType().getMetadata(TypeInfo.class.getName());
+        if (xmlType == null) {
+            ElementInfo element =
+                    (ElementInfo) context.getSourceDataType()
+                                         .getMetadata(ElementInfo.class.getName());
+            xmlType = (TypeInfo) element.getType();
+        }
+
+        return toJavaObject(xmlType, source, context);
+    }
+
+    public Object toJavaObject(TypeInfo xmlType, T xmlElement, TransformationContext context) {
+        if (xmlType.isSimpleType()) {
+            return mapper.toSimpleJavaObject(xmlType, getText(xmlElement), context);
+        } else {
+            Class<?> javaType = (Class<?>) context.getTargetDataType().getLogical();
+            return createJavaObject(xmlElement, javaType, context);
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private <L> L createJavaObject(T element, Class<L> javaType, TransformationContext context) 
+        throws XML2JavaMapperException {
+        List<T> childElements = getChildElements(element);
+        if (childElements.size() == 1 && isTextElement(childElements.get(0))) {
+            return (L) mapper.toSimpleJavaObject(mapper.getXMLType(javaType),
+                                                 getText(childElements.get(0)),
+                                                 context);
+        } else {
+            String fieldName = null;
+            try {
+                L javaInstance = javaType.newInstance();
+                Map<Field, List<Object>> arrayFields = new Hashtable<Field, List<Object>>();
+                Map<Method, List<Object>> arraySetters = new Hashtable<Method, List<Object>>();
+                for (int count = 0; count < childElements.size(); ++count) {
+                    if (!isTextElement(childElements.get(count))) {
+                        fieldName = getElementName(childElements.get(count));
+                        try {
+                            Field javaField = javaType.getField(fieldName);
+                            setFieldValue(javaInstance,
+                                          javaField,
+                                          childElements.get(count),
+                                          arrayFields,
+                                          context);
+
+                        } catch (NoSuchFieldException e1) {
+                            setFieldValueUsingSetter(javaType,
+                                                     javaInstance,
+                                                     fieldName,
+                                                     childElements.get(count),
+                                                     arraySetters,
+                                                     context);
+                        }
+                    }
+                }
+
+                setArrayValues(javaInstance, arrayFields, arraySetters);
+                return javaInstance;
+            } catch (Exception e2) {
+                XML2JavaMapperException xml2JavaEx = new XML2JavaMapperException(e2);
+                xml2JavaEx.setJavaType(javaType);
+                xml2JavaEx.setJavaFieldName(fieldName);
+                throw xml2JavaEx;
+            }
+        }
+    }
+
+    private void setFieldValue(Object javaInstance,
+                               Field javaField,
+                               T fieldValue,
+                               Map<Field, List<Object>> arrayFields,
+                               TransformationContext context) throws IllegalAccessException {
+        Class<?> javaFieldType = (Class<?>) javaField.getType();
+
+        if (javaFieldType.isArray()) {
+            Class<?> componentType = javaFieldType.getComponentType();
+            List<Object> fldValueArray = arrayFields.get(javaField);
+            if (fldValueArray == null) {
+                fldValueArray = new ArrayList<Object>();
+                arrayFields.put(javaField, fldValueArray);
+            }
+            fldValueArray.add(createJavaObject(fieldValue, componentType, context));
+        } else {
+            javaField.setAccessible(true);
+            javaField.set(javaInstance, createJavaObject(fieldValue, javaFieldType, context));
+        }
+    }
+
+    private void setFieldValueUsingSetter(Class javaType,
+                                          Object javaInstance,
+                                          String fieldName,
+                                          T fieldValue,
+                                          Map<Method, List<Object>> arraySetters,
+                                          TransformationContext context) throws IllegalAccessException,
+                                                                        InvocationTargetException {
+        char firstChar = Character.toUpperCase(fieldName.charAt(0));
+        StringBuilder methodName = new StringBuilder(SET + fieldName);
+        methodName.setCharAt(SET.length(), firstChar);
+        boolean methodNotFound = true;
+
+        for (int methodCount = 0; methodNotFound && methodCount < javaType.getMethods().length; ++methodCount) {
+            Method aMethod = javaType.getMethods()[methodCount];
+            if (aMethod.getName().equals(methodName.toString())
+                    && aMethod.getParameterTypes().length == 1) {
+                Class<?> paramType = aMethod.getParameterTypes()[0];
+
+                if (paramType.isArray()) {
+                    Class<?> componentType = paramType.getComponentType();
+                    List<Object> setterValueArray = arraySetters.get(aMethod);
+                    if (setterValueArray == null) {
+                        setterValueArray = new ArrayList<Object>();
+                        arraySetters.put(aMethod, setterValueArray);
+                    }
+                    setterValueArray.add(createJavaObject(fieldValue, componentType, context));
+                } else {
+                    aMethod.invoke(javaInstance, new Object[] {createJavaObject(fieldValue,
+                                                                                 paramType,
+                                                                                 context)});
+                }
+                methodNotFound = false;
+            }
+        }
+
+        if (methodNotFound) {
+            XML2JavaMapperException xml2JavaEx =
+                    new XML2JavaMapperException("No field or setter method to configure xml data");
+            xml2JavaEx.setJavaFieldName(fieldName);
+            xml2JavaEx.setJavaType(javaType);
+            throw xml2JavaEx;
+        }
+    }
+
+    private void setArrayValues(Object javaInstance,
+                                Map<Field, List<Object>> arrayFields,
+                                Map<Method, List<Object>> arraySetters) throws IllegalAccessException,
+                                                                       InvocationTargetException {
+        if (arrayFields.size() > 0) {
+            for (Field javaField : arrayFields.keySet()) {
+                javaField.setAccessible(true);
+
+                if (javaField.getType().getComponentType().isPrimitive()) {
+                    javaField.set(javaInstance, createPrimitiveArray(javaField.getType()
+                                                                              .getComponentType(),
+                                                                     arrayFields.get(javaField)));
+                } else {
+                    javaField.set(javaInstance,
+                                  createNonPrimitiveArray(javaField.getType().getComponentType(),
+                                                          arrayFields.get(javaField)));
+                }
+            }
+        }
+
+        if (arraySetters.size() > 0) {
+            for (Method aMethod : arraySetters.keySet()) {
+                Class paramType = aMethod.getParameterTypes()[0];
+                if (paramType.getComponentType().isPrimitive()) {
+                    aMethod.invoke(javaInstance,
+                                   new Object[] {createPrimitiveArray(paramType.getComponentType(),
+                                                                       arraySetters.get(aMethod))});
+                } else {
+                    aMethod.invoke(javaInstance,
+                                   new Object[] {createNonPrimitiveArray(paramType.getComponentType(),
+                                                                          arraySetters.get(aMethod))});
+                }
+            }
+        }
+    }
+
+    private Object createNonPrimitiveArray(Class fieldType, List values) {
+        Object objectArray = Array.newInstance(fieldType, values.size());
+        for (int count = 0; count < values.size(); ++count) {
+            Array.set(objectArray, count, values.get(count));
+        }
+        return objectArray;
+    }
+
+    private Object createPrimitiveArray(Class fieldType, List values) {
+        if (fieldType.isPrimitive()) {
+            if (fieldType.getName().equals("int")) {
+                int[] primitiveValues = new int[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Integer) values.get(count)).intValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("float")) {
+                float[] primitiveValues = new float[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Float) values.get(count)).floatValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("boolean")) {
+                boolean[] primitiveValues = new boolean[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Boolean) values.get(count)).booleanValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("char")) {
+                char[] primitiveValues = new char[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Character) values.get(count)).charValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("byte")) {
+                byte[] primitiveValues = new byte[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Byte) values.get(count)).byteValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("short")) {
+                short[] primitiveValues = new short[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Short) values.get(count)).shortValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("long")) {
+                long[] primitiveValues = new long[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Long) values.get(count)).longValue();
+                }
+                return primitiveValues;
+            } else if (fieldType.getName().equals("double")) {
+                double[] primitiveValues = new double[values.size()];
+                for (int count = 0; count < values.size(); ++count) {
+                    primitiveValues[count] = ((Double) values.get(count)).doubleValue();
+                }
+                return primitiveValues;
+            }
+        }
+        return values;
+    }
+
+    public abstract String getText(T source) throws XML2JavaMapperException;
+
+    public abstract List<T> getChildElements(T parent) throws XML2JavaMapperException;
+
+    public abstract String getElementName(T element) throws XML2JavaMapperException;
+
+    public abstract boolean isTextElement(T element) throws XML2JavaMapperException;
+
+    public Class getTargetType() {
+        return Object.class;
+    }
+}

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaMapperException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaMapperException.java?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaMapperException.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/XML2JavaMapperException.java Tue Feb  6 09:17:42 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.core.databinding.javabeans;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.api.TuscanyRuntimeException;
 
 /**
@@ -27,6 +29,10 @@
  */
 public class XML2JavaMapperException extends TuscanyRuntimeException {
     private static final long serialVersionUID = 6596530102591630642L;
+    
+    private QName xmlElementName;
+    private String javaFieldName;
+    private Class javaType;
 
     public XML2JavaMapperException(String message) {
         super(message);
@@ -34,6 +40,30 @@
 
     public XML2JavaMapperException(Throwable cause) {
         super(cause);
+    }
+
+    public QName getXmlElementName() {
+        return xmlElementName;
+    }
+
+    public void setXmlElementName(QName xmlElementName) {
+        this.xmlElementName = xmlElementName;
+    }
+
+    public String getJavaFieldName() {
+        return javaFieldName;
+    }
+
+    public void setJavaFieldName(String javaFieldName) {
+        this.javaFieldName = javaFieldName;
+    }
+
+    public Class getJavaType() {
+        return javaType;
+    }
+
+    public void setJavaType(Class javaType) {
+        this.javaType = javaType;
     }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/databinding.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/databinding.scdl?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/databinding.scdl (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/databinding.scdl Tue Feb  6 09:17:42 2007
@@ -88,7 +88,7 @@
     </component>
 
     <component name="transformer.DOMNode2JavaBean">
-        <system:implementation.system class="org.apache.tuscany.core.databinding.javabeans.DOMNode2JavaBean" />
+        <system:implementation.system class="org.apache.tuscany.core.databinding.javabeans.DOMNode2JavaBeanTransformer" />
     </component>
 
     <component name="transformer.Node2OutputStream">
@@ -108,7 +108,7 @@
     </component>
 
     <component name="transformer.JavaBean2DOMNode">
-        <system:implementation.system class="org.apache.tuscany.core.databinding.javabeans.JavaBean2DOMNode" />
+        <system:implementation.system class="org.apache.tuscany.core.databinding.javabeans.JavaBean2DOMNodeTransformer" />
     </component>
 
     <component name="transformer.Reader2Node">

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java Tue Feb  6 09:17:42 2007
@@ -77,10 +77,11 @@
         registry.unregister(name);
         DataBinding db4 = registry.getDataBinding(name);
         Assert.assertNull(db4);
-
+        
+       
         dt = registry.introspectType(ContentHandler.class);
-        Assert.assertNull(dt);
-
+        Assert.assertNotNull(dt);
+        Assert.assertEquals("java.lang.Object", dt.getDataBinding());
     }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java?view=diff&rev=504204&r1=504203&r2=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java Tue Feb  6 09:17:42 2007
@@ -25,10 +25,10 @@
 
 import junit.framework.TestCase;
 
+import org.apache.tuscany.core.databinding.javabeans.DOMNode2JavaBeanTransformer;
+import org.apache.tuscany.core.databinding.javabeans.JavaBean2DOMNodeTransformer;
 import org.apache.tuscany.core.databinding.xml.DOMDataBinding;
-import org.apache.tuscany.core.databinding.javabeans.DOMNode2JavaBean;
 import org.apache.tuscany.core.databinding.xml.Node2String;
-import org.apache.tuscany.core.databinding.javabeans.JavaBean2DOMNode;
 import org.apache.tuscany.core.databinding.xml.String2Node;
 import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 import org.apache.tuscany.spi.databinding.TransformationContext;
@@ -36,8 +36,8 @@
 import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
 import org.apache.tuscany.spi.idl.ElementInfo;
 import org.apache.tuscany.spi.idl.TypeInfo;
-import org.apache.tuscany.spi.model.WrapperInfo;
 import org.apache.tuscany.spi.model.DataType;
+import org.apache.tuscany.spi.model.WrapperInfo;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -163,8 +163,8 @@
         TransformerRegistryImpl tr = new TransformerRegistryImpl();
         tr.registerTransformer(new String2Node());
         tr.registerTransformer(new Node2String());
-        tr.registerTransformer(new DOMNode2JavaBean());
-        tr.registerTransformer(new JavaBean2DOMNode());
+        tr.registerTransformer(new DOMNode2JavaBeanTransformer());
+        tr.registerTransformer(new JavaBean2DOMNodeTransformer());
         m.setTransformerRegistry(tr);
         DataBindingRegistry dataBindingRegistry = new DataBindingRegistryImpl();
         dataBindingRegistry.register(new DOMDataBinding());

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformerTestCase.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformerTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/DOMNode2JavaBeanTransformerTestCase.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
+import org.apache.tuscany.spi.idl.ElementInfo;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.apache.tuscany.spi.model.DataType;
+import org.easymock.EasyMock;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+/**
+ * Testcase to test the XMLTypeMapperExtension which is the back bone for all transformations 
+ * supported by the JavaBeans Databinding.
+ */
+public class DOMNode2JavaBeanTransformerTestCase extends TestCase {
+
+    DOMNode2JavaBeanTransformer dom2JavaTransformer = new DOMNode2JavaBeanTransformer();
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testFieldSettings() throws Exception {
+        String samplePropertyXML =
+                "<property name=\"prop2\" >" + "<integerNumber>27</integerNumber>"
+                        + "<floatNumber>79.34</floatNumber>"
+                        + "<doubleNumber>184.52</doubleNumber>" + "<innerProperty>"
+                        + "<integerNumber>54</integerNumber>" + "<floatNumber>158.68</floatNumber>"
+                        + "<doubleNumber>369.04</doubleNumber>" + "</innerProperty>"
+                        + "<stringArray>TestString_1</stringArray>"
+                        + "<stringArray>TestString_2</stringArray>" + "<boolArray>true</boolArray>"
+                        + "<boolArray>false</boolArray>" + "</property>";
+
+        DocumentBuilder builder = DOMHelper.newDocumentBuilder();
+        InputSource inputSource = new InputSource(new StringReader(samplePropertyXML));
+        Node samplePropertyNode = builder.parse(inputSource);
+        TypeInfo typeInfo = new TypeInfo(null, false, null);
+
+        TransformationContext context = EasyMock.createMock(TransformationContext.class);
+        DataType<Class> targetDataType = new DataType<Class>(null, SamplePropertyBean.class);
+        EasyMock.expect(context.getTargetDataType()).andReturn(targetDataType).anyTimes();
+        
+        DataType<Class> sourceDataType = new DataType<Class>(null, null);
+        ElementInfo eleInfo = new ElementInfo(null, typeInfo);
+        sourceDataType.setMetadata(ElementInfo.class.getName(), eleInfo);
+        EasyMock.expect(context.getSourceDataType()).andReturn(sourceDataType).anyTimes();
+        EasyMock.replay(context);
+
+        Object javaObject = dom2JavaTransformer.transform(((Document)samplePropertyNode).getDocumentElement(), context);
+
+        assertTrue(javaObject instanceof SamplePropertyBean);
+        SamplePropertyBean samplePropBean = (SamplePropertyBean) javaObject;
+        assertEquals(samplePropBean.getIntegerNumber(), 27);
+        assertEquals((float) 79.34, (float) samplePropBean.getFloatNumber());
+        assertEquals((double) samplePropBean.getInnerProperty().getDoubleNumber(), (double) 369.04);
+
+        assertEquals(samplePropBean.getStringArray()[0], "TestString_1");
+        assertEquals(samplePropBean.boolArray[0], true);
+
+        /** testing for object to node * */
+       javax.xml.transform.Transformer transformer =
+                TransformerFactory.newInstance().newTransformer();
+        JavaBean2DOMNodeTransformer java2DomTransformer = new JavaBean2DOMNodeTransformer();
+        Node aNode = java2DomTransformer.transform(javaObject, context);
+        StringWriter sw = new StringWriter();
+        transformer.transform(new DOMSource(aNode), new StreamResult(sw));
+        String nodeString = sw.toString();
+        //System.out.println(nodeString);
+
+        // testing the case when field and getter method do not have public access
+        assertTrue(nodeString.indexOf("<doubleNumber>184.52</doubleNumber>") == -1);
+        // test the case for fields that are of array type
+        assertTrue(nodeString.indexOf("<stringArray>TestString_1</stringArray>"
+                + "<stringArray>TestString_2</stringArray>") != -1);
+        // testing the case for non-public field with public getter method
+        assertTrue(nodeString.indexOf("<integerNumber>27</integerNumber>") != -1);
+        // test the case for public field that is a another java bean .i.e. embeded javabean
+        int startIndex = nodeString.indexOf("<innerProperty>");
+        int endIndex = nodeString.indexOf("</innerProperty>");
+        String fragment = nodeString.substring(startIndex, endIndex);
+        assertTrue(fragment.indexOf("<integerNumber>54</integerNumber>") != -1);
+
+        // System.out.println(sw.toString());
+
+    }
+
+    
+
+    public static class SamplePropertyBean {
+
+        public float floatNumber = 50;
+        public SamplePropertyBean innerProperty;
+        public boolean[] boolArray;
+        private double doubleNumber = 75;
+        private int integerNumber = 25;
+        private String[] stringArray;
+
+        public SamplePropertyBean() {
+
+        }
+
+        double getDoubleNumber() {
+            return doubleNumber;
+        }
+
+        public void setDoubleNumber(double doubleNumber) {
+            this.doubleNumber = doubleNumber;
+        }
+
+        public float getFloatNumber() {
+            return floatNumber;
+        }
+
+        public void setFloatNumber(float floatNumber) {
+            this.floatNumber = floatNumber;
+        }
+
+        public int getIntegerNumber() {
+            return integerNumber;
+        }
+
+        public void setIntegerNumber(int integerNumber) {
+            this.integerNumber = integerNumber;
+        }
+
+        public SamplePropertyBean getInnerProperty() {
+            return innerProperty;
+        }
+
+        public void setInnerProperty(SamplePropertyBean prop) {
+            this.innerProperty = prop;
+        }
+
+        public String toString() {
+            return Double.toString(integerNumber + floatNumber + doubleNumber) + " & "
+                    + ((innerProperty == null) ? "" : innerProperty.toString());
+        }
+
+        public String[] getStringArray() {
+            return stringArray;
+        }
+
+        public void setStringArray(String[] stringArray) {
+            this.stringArray = stringArray;
+        }
+
+    }
+}

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformerTestCase.java?view=auto&rev=504204
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformerTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2DOMNodeTransformerTestCase.java Tue Feb  6 09:17:42 2007
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.core.databinding.javabeans;
+
+import java.io.StringWriter;
+
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.model.DataType;
+import org.easymock.EasyMock;
+import org.w3c.dom.Node;
+
+/**
+ * Testcase to test the XMLTypeMapperExtension which is the back bone for all transformations 
+ * supported by the JavaBeans Databinding.
+ */
+public class JavaBean2DOMNodeTransformerTestCase extends TestCase {
+
+    JavaBean2DOMNodeTransformer aTransformer = new JavaBean2DOMNodeTransformer();
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testTranformation() throws Exception {
+        TransformationContext context = EasyMock.createMock(TransformationContext.class);
+        DataType<Class> dataType = new DataType<Class>(null, SamplePropertyBean.class);
+        EasyMock.expect(context.getTargetDataType()).andReturn(dataType).anyTimes();
+        EasyMock.replay(context);
+
+        javax.xml.transform.Transformer transformer =
+                TransformerFactory.newInstance().newTransformer();
+        Object data = new int[] {10, 20, 30, 40};
+        Node aNode = aTransformer.transform(data, context);
+        StringWriter sw = new StringWriter();
+        transformer.transform(new DOMSource(aNode), new StreamResult(sw));
+
+        System.out.println(sw.toString());
+        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><int_collection><int>10</int><int>20</int>"
+                     + "<int>30</int><int>40</int></int_collection>",
+                     sw.toString());
+    }
+
+    public static class SamplePropertyBean {
+
+        public float floatNumber = 50;
+        public SamplePropertyBean innerProperty;
+        public boolean[] boolArray;
+        private double doubleNumber = 75;
+        private int integerNumber = 25;
+        private String[] stringArray;
+
+        public SamplePropertyBean() {
+
+        }
+
+        double getDoubleNumber() {
+            return doubleNumber;
+        }
+
+        public void setDoubleNumber(double doubleNumber) {
+            this.doubleNumber = doubleNumber;
+        }
+
+        public float getFloatNumber() {
+            return floatNumber;
+        }
+
+        public void setFloatNumber(float floatNumber) {
+            this.floatNumber = floatNumber;
+        }
+
+        public int getIntegerNumber() {
+            return integerNumber;
+        }
+
+        public void setIntegerNumber(int integerNumber) {
+            this.integerNumber = integerNumber;
+        }
+
+        public SamplePropertyBean getInnerProperty() {
+            return innerProperty;
+        }
+
+        public void setInnerProperty(SamplePropertyBean prop) {
+            this.innerProperty = prop;
+        }
+
+        public String toString() {
+            return Double.toString(integerNumber + floatNumber + doubleNumber) + " & "
+                    + ((innerProperty == null) ? "" : innerProperty.toString());
+        }
+
+        public String[] getStringArray() {
+            return stringArray;
+        }
+
+        public void setStringArray(String[] stringArray) {
+            this.stringArray = stringArray;
+        }
+
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org