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/01/25 20:03:28 UTC

svn commit: r499913 - in /incubator/tuscany/java/sca/kernel/spi/src: main/java/org/apache/tuscany/spi/databinding/ main/java/org/apache/tuscany/spi/databinding/extension/ test/java/org/apache/tuscany/spi/databinding/extension/

Author: svkrish
Date: Thu Jan 25 11:03:27 2007
New Revision: 499913

URL: http://svn.apache.org/viewvc?view=rev&rev=499913
Log:
Extended to support complex properties (https://issues.apache.org/jira/browse/TUSCANY-925)

Added:
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XML2JavaMapperException.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLType2JavaTransformer.java
      - copied, changed from r498932, incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtension.java
    incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtensionTestCase.java
Removed:
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java
Modified:
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/SimpleTypeMapper.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtension.java
    incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtensionTestCase.java

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/SimpleTypeMapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/SimpleTypeMapper.java?view=diff&rev=499913&r1=499912&r2=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/SimpleTypeMapper.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/SimpleTypeMapper.java Thu Jan 25 11:03:27 2007
@@ -24,7 +24,7 @@
 /**
  * Type Mapper between XML schema simple data types and java objects
  */
-public interface SimpleTypeMapper {
+public interface SimpleTypeMapper<T> {
     /**
      * Parse the XML lexical representation into a java object 
      * @param simpleType The XSD simple type
@@ -32,7 +32,7 @@
      * @param context The context of the transformation
      * @return A java object for the XML value
      */
-    Object toJavaObject(TypeInfo simpleType, String value, TransformationContext context);
+    Object toJavaObject(TypeInfo simpleType, T value, TransformationContext context);
     /**
      * Create the XML lexical representation for a java object
      * @param simpleType The XSD simple type

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtension.java?view=diff&rev=499913&r1=499912&r2=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtension.java Thu Jan 25 11:03:27 2007
@@ -33,8 +33,13 @@
 import org.apache.tuscany.spi.databinding.SimpleTypeMapper;
 import org.apache.tuscany.spi.databinding.TransformationContext;
 import org.apache.tuscany.spi.idl.TypeInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class SimpleTypeMapperExtension<T> extends XSDDataTypeConverter implements
+        SimpleTypeMapper<T> {
+    public static final String SET = "set";
 
-public class SimpleTypeMapperExtension extends XSDDataTypeConverter implements SimpleTypeMapper {
     public static final Map<Class, String> JAVA2XML = new HashMap<Class, String>();
 
     public static final String URI_2001_SCHEMA_XSD = "http://www.w3.org/2001/XMLSchema";
@@ -93,21 +98,26 @@
 
     public static final QName XSD_NCNAME = new QName(URI_2001_SCHEMA_XSD, "NCName");
 
-    public static final QName XSD_NEGATIVEINTEGER = new QName(URI_2001_SCHEMA_XSD, "negativeInteger");
+    public static final QName XSD_NEGATIVEINTEGER =
+            new QName(URI_2001_SCHEMA_XSD, "negativeInteger");
 
     public static final QName XSD_NMTOKEN = new QName(URI_2001_SCHEMA_XSD, "NMTOKEN");
 
     public static final QName XSD_NMTOKENS = new QName(URI_2001_SCHEMA_XSD, "NMTOKENS");
 
-    public static final QName XSD_NONNEGATIVEINTEGER = new QName(URI_2001_SCHEMA_XSD, "nonNegativeInteger");
+    public static final QName XSD_NONNEGATIVEINTEGER =
+            new QName(URI_2001_SCHEMA_XSD, "nonNegativeInteger");
 
-    public static final QName XSD_NONPOSITIVEINTEGER = new QName(URI_2001_SCHEMA_XSD, "nonPositiveInteger");
+    public static final QName XSD_NONPOSITIVEINTEGER =
+            new QName(URI_2001_SCHEMA_XSD, "nonPositiveInteger");
 
-    public static final QName XSD_NORMALIZEDSTRING = new QName(URI_2001_SCHEMA_XSD, "normalizedString");
+    public static final QName XSD_NORMALIZEDSTRING =
+            new QName(URI_2001_SCHEMA_XSD, "normalizedString");
 
     public static final QName XSD_NOTATION = new QName(URI_2001_SCHEMA_XSD, "NOTATION");
 
-    public static final QName XSD_POSITIVEINTEGER = new QName(URI_2001_SCHEMA_XSD, "positiveInteger");
+    public static final QName XSD_POSITIVEINTEGER =
+            new QName(URI_2001_SCHEMA_XSD, "positiveInteger");
 
     public static final QName XSD_QNAME = new QName(URI_2001_SCHEMA_XSD, "QName");
 
@@ -134,12 +144,14 @@
     public static final QName XSD_YEARMONTH = new QName(URI_2001_SCHEMA_XSD, "gYearMonth");
 
     private static final String[] XSD_TYPE_NAMES =
-    {"string", "boolean", "double", "float", "int", "integer", "long", "short", "byte", "decimal",
-        "base64Binary", "hexBinary", "anySimpleType", "anyType", "any", "QName", "dateTime", "date", "time",
-        "normalizedString", "token", "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte",
-        "positiveInteger", "negativeInteger", "nonNegativeInteger", "nonPositiveInteger", "gYearMonth",
-        "gMonthDay", "gYear", "gMonth", "gDay", "duration", "Name", "NCName", "NMTOKEN", "NMTOKENS",
-        "NOTATION", "ENTITY", "ENTITIES", "IDREF", "IDREFS", "anyURI", "language", "ID"};
+    {"string", "boolean", "double", "float", "int", "integer", "long", "short", "byte",
+        "decimal", "base64Binary", "hexBinary", "anySimpleType", "anyType", "any",
+        "QName", "dateTime", "date", "time", "normalizedString", "token",
+        "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte",
+        "positiveInteger", "negativeInteger", "nonNegativeInteger",
+        "nonPositiveInteger", "gYearMonth", "gMonthDay", "gYear", "gMonth", "gDay",
+        "duration", "Name", "NCName", "NMTOKEN", "NMTOKENS", "NOTATION", "ENTITY",
+        "ENTITIES", "IDREF", "IDREFS", "anyURI", "language", "ID"};
 
     static {
         for (String type : XSD_TYPE_NAMES) {
@@ -147,7 +159,7 @@
             XSD_SIMPLE_TYPES.put(type, simpleType);
         }
     }
-    
+
     static {
         JAVA2XML.put(boolean.class, "boolean");
         JAVA2XML.put(byte.class, "byte");
@@ -235,7 +247,9 @@
         return XSD_SIMPLE_TYPES.get(JAVA2XML.get(javaType));
     }
 
-    public Object toJavaObject(TypeInfo simpleType, String literal, TransformationContext context) {
+    public Object toSimpleJavaObject(TypeInfo simpleType,
+                                     String literal,
+                                     TransformationContext context) {
         /**
          * <ul>
          * <li>xsd:string --- java.lang.String
@@ -258,10 +272,8 @@
          * <li>xsd:time --- javax.xml.datatype.XMLGregorianCalendar
          * <li>xsd:date --- javax.xml.datatype.XMLGregorianCalendar
          * <li>xsd:g* --- javax.xml.datatype.XMLGregorianCalendar
-         * <li>xsd:anySimpleType (for xsd:element of this type)a
-         * java.lang.Object
-         * <li>xsd:anySimpleType (for xsd:attribute of this type)
-         * java.lang.String
+         * <li>xsd:anySimpleType (for xsd:element of this type)a java.lang.Object
+         * <li>xsd:anySimpleType (for xsd:attribute of this type) java.lang.String
          * <li>xsd:duration javax.xml.datatype.Duration
          * <li>xsd:NOTATION javax.xml.namespace.QName
          * </ul>
@@ -276,9 +288,9 @@
         }
         TypeInfo baseType = simpleType;
         while (baseType.getBaseType() != null) {
-            baseType = (TypeInfo)baseType.getBaseType();
+            baseType = (TypeInfo) baseType.getBaseType();
         }
-        
+
         QName type = baseType.getQName();
         if (type.equals(XSD_STRING)) {
             return parseString(value);
@@ -324,13 +336,15 @@
             return parseBase64Binary(value);
         } else if (type.equals(XSD_QNAME)) {
             NamespaceContext namespaceContext =
-                (NamespaceContext)((context != null) ? context.getMetadata().get(NamespaceContext.class)
-                    : null);
+                    (NamespaceContext) ((context != null) ? context.getMetadata()
+                                                                   .get(NamespaceContext.class)
+                            : null);
             return parseQName(value, namespaceContext);
         } else if (type.equals(XSD_NOTATION)) {
             NamespaceContext namespaceContext =
-                (NamespaceContext)((context != null) ? context.getMetadata().get(NamespaceContext.class)
-                    : null);
+                    (NamespaceContext) ((context != null) ? context.getMetadata()
+                                                                   .get(NamespaceContext.class)
+                            : null);
             return parseQName(value, namespaceContext);
         } else if (type.equals(XSD_YEAR)) {
             return factory.newXMLGregorianCalendar(value);
@@ -350,8 +364,12 @@
     @SuppressWarnings("deprecation")
     private XMLGregorianCalendar toXMLGregorianCalendar(Date date) {
         GregorianCalendar c =
-            new GregorianCalendar(date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date
-                .getMinutes(), date.getSeconds());
+                new GregorianCalendar(date.getYear(),
+                                      date.getMonth(),
+                                      date.getDate(),
+                                      date.getHours(),
+                                      date.getMinutes(),
+                                      date.getSeconds());
         return factory.newXMLGregorianCalendar(c);
     }
 
@@ -362,30 +380,54 @@
     public String toXMLLiteral(TypeInfo simpleType, Object obj, TransformationContext context) {
         if (obj instanceof Float || obj instanceof Double) {
             if (obj instanceof Float) {
-                return printDouble(((Float)obj).floatValue());
+                return printDouble(((Float) obj).floatValue());
             } else {
-                return printDouble(((Double)obj).doubleValue());
+                return printDouble(((Double) obj).doubleValue());
             }
         } else if (obj instanceof GregorianCalendar) {
-            GregorianCalendar calendar = (GregorianCalendar)obj;
+            GregorianCalendar calendar = (GregorianCalendar) obj;
             return toXMLGregorianCalendar(calendar).toXMLFormat();
         } else if (obj instanceof Date) {
-            return toXMLGregorianCalendar((Date)obj).toXMLFormat();
+            return toXMLGregorianCalendar((Date) obj).toXMLFormat();
         } else if (obj instanceof XMLGregorianCalendar) {
-            return ((XMLGregorianCalendar)obj).toXMLFormat();
+            return ((XMLGregorianCalendar) obj).toXMLFormat();
         } else if (obj instanceof byte[]) {
             if (simpleType.getQName().equals(XSD_BASE64)) {
-                return printBase64Binary((byte[])obj);
+                return printBase64Binary((byte[]) obj);
             } else if (simpleType.getQName().equals(XSD_HEXBIN)) {
-                return printHexBinary((byte[])obj);
+                return printHexBinary((byte[]) obj);
             }
         } else if (obj instanceof QName) {
             NamespaceContext namespaceContext =
-                (NamespaceContext)((context != null) ? context.getMetadata().get(NamespaceContext.class)
-                    : null);
-            return printQName((QName)obj, namespaceContext);
+                    (NamespaceContext) ((context != null) ? context.getMetadata()
+                                                                   .get(NamespaceContext.class)
+                            : null);
+            return printQName((QName) obj, namespaceContext);
         }
         return obj.toString();
+    }
+
+    public static boolean isSimpleXSDType(QName typeName) {
+        return typeName.getNamespaceURI().equals(URI_2001_SCHEMA_XSD)
+                && XSD_SIMPLE_TYPES.get(typeName.getLocalPart()) != null;
+    }
+
+    protected String getText(T source) {
+        Node sourceNode = (Node) source;
+        if (source instanceof Document) {
+            sourceNode = ((Document) sourceNode).getDocumentElement();
+        }
+        return sourceNode.getTextContent();
+    }
+
+    public Object toJavaObject(TypeInfo simpleType, T xmlNode, TransformationContext context) {
+        if (simpleType.isSimpleType()) {
+            return toSimpleJavaObject(simpleType, getText(xmlNode), context);
+        } else {
+            XML2JavaMapperException xml2JavaEx =
+                    new XML2JavaMapperException("Complex XML Types not supported by SimpleTypeMapperExtension");
+            throw xml2JavaEx;
+        }
     }
 
 }

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XML2JavaMapperException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XML2JavaMapperException.java?view=auto&rev=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XML2JavaMapperException.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XML2JavaMapperException.java Thu Jan 25 11:03:27 2007
@@ -0,0 +1,44 @@
+/*
+ * 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.spi.databinding.extension;
+
+import org.apache.tuscany.api.TuscanyRuntimeException;
+
+/**
+ * This exception is used to encapsulate and rethrow exceptions that arise out of converting
+ * XML Data to Java Objects.  
+ *
+ */
+public class XML2JavaMapperException extends TuscanyRuntimeException {
+    
+    public XML2JavaMapperException() {
+        
+    }
+    
+    public XML2JavaMapperException(String message) {
+        super(message);
+    }
+    
+    
+    public XML2JavaMapperException(Throwable cause) {
+        super(cause);
+    }
+
+}

Copied: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLType2JavaTransformer.java (from r498932, incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLType2JavaTransformer.java?view=diff&rev=499913&p1=incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java&r1=498932&p2=incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLType2JavaTransformer.java&r2=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLType2JavaTransformer.java Thu Jan 25 11:03:27 2007
@@ -23,22 +23,23 @@
 import org.apache.tuscany.spi.databinding.TransformationContext;
 import org.apache.tuscany.spi.idl.ElementInfo;
 import org.apache.tuscany.spi.idl.TypeInfo;
+import org.w3c.dom.Node;
 
 /**
  * Transformer to convert data from a databinding's representation of simple
  * types to Java Objects
  */
-public abstract class SimpleType2JavaTransformer<T> extends TransformerExtension<T, Object> implements
+public abstract class XMLType2JavaTransformer<T> extends TransformerExtension<T, Object> implements
     PullTransformer<T, Object> {
 
     protected SimpleTypeMapper mapper;
 
-    public SimpleType2JavaTransformer() {
-        this.mapper = new SimpleTypeMapperExtension();
+    public XMLType2JavaTransformer() {
+        this.mapper = new XMLTypeMapperExtension<Node>();
     }
 
-    public SimpleType2JavaTransformer(SimpleTypeMapper mapper) {
-        this.mapper = (mapper != null) ? mapper : new SimpleTypeMapperExtension();
+    public XMLType2JavaTransformer(SimpleTypeMapper mapper) {
+        this.mapper = (mapper != null) ? mapper : new XMLTypeMapperExtension<Node>();
     }
 
     public Object transform(T source, TransformationContext context) {
@@ -48,7 +49,8 @@
                 (ElementInfo)context.getSourceDataType().getMetadata(ElementInfo.class.getName());
             simpleType = (TypeInfo)element.getType();
         }
-        return mapper.toJavaObject(simpleType, getText(source), context);
+        
+        return mapper.toJavaObject(simpleType, source, context);
     }
 
     public Class getTargetType() {

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtension.java?view=auto&rev=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtension.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtension.java Thu Jan 25 11:03:27 2007
@@ -0,0 +1,270 @@
+/*
+ * 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.spi.databinding.extension;
+
+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.TransformationContext;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XMLTypeMapperExtension<T> extends SimpleTypeMapperExtension<T> {
+
+    protected Node getFragment(T source) {
+        return ((Document) source).getDocumentElement();
+    }
+
+    @Override
+    public Object toJavaObject(TypeInfo xmlType, T xmlNode, TransformationContext context) {
+        if (xmlType.isSimpleType()) {
+            return super.toJavaObject(xmlType, xmlNode, context);
+        } else {
+            Class<?> javaType = (Class<?>) context.getTargetDataType().getLogical();
+            return createJavaObject(getFragment(xmlNode), javaType, context);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private <L> L createJavaObject(Node valueFragment,
+                                   Class<L> javaType,
+                                   TransformationContext context) throws XML2JavaMapperException {
+        NodeList childNodes = valueFragment.getChildNodes();
+        if (childNodes.getLength() == 1 && childNodes.item(0).getNodeType() == 3) {
+
+            return (L) super.toJavaObject(getXMLType(javaType), (T) childNodes.item(0), context);
+        } else {
+            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 < childNodes.getLength(); ++count) {
+                    if (childNodes.item(count).getNodeType() != 3) {
+                        String fieldName = childNodes.item(count).getNodeName();
+                        try {
+                            Field javaField = javaType.getField(fieldName);
+                            setFieldValue(javaInstance,
+                                          javaField,
+                                          childNodes.item(count),
+                                          arrayFields,
+                                          context);
+
+                        } catch (NoSuchFieldException e1) {
+                            setFieldValueUsingSetter(javaType, 
+                                                     javaInstance, 
+                                                     fieldName, 
+                                                     childNodes.item(count),
+                                                     arraySetters, 
+                                                     context);
+                        }
+                    }
+                }
+
+                setArrayValues(javaInstance, arrayFields, arraySetters);
+                return javaInstance;
+            } catch (XML2JavaMapperException e3) {
+                throw e3;
+            } catch (Exception e2) {
+                XML2JavaMapperException xml2JavaEx = new XML2JavaMapperException(e2);
+                xml2JavaEx.addContextName("configuring " + javaType.getName());
+                throw xml2JavaEx;
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void setFieldValueUsingSetter(Class javaType,
+                                             Object javaInstance,
+                                             String fieldName,
+                                             Node 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 = null;
+                    if ((setterValueArray = arraySetters.get(aMethod)) == null) {
+                        setterValueArray = new ArrayList();
+                        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 property value <"
+                            + fieldName
+                            + "> in Java class <"
+                            + javaType.getName() + ">");
+            xml2JavaEx.addContextName("configuring " + javaType.getName());
+            throw xml2JavaEx;
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void setFieldValue(Object javaInstance,
+                               Field javaField,
+                               Node 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 = null;
+            if ((fldValueArray = arrayFields.get(javaField)) == null) {
+                fldValueArray = new ArrayList();
+                arrayFields.put(javaField, fldValueArray);
+            }
+            fldValueArray.add(createJavaObject(fieldValue, componentType, context));
+        } else {
+            javaField.setAccessible(true);
+            javaField.set(javaInstance, createJavaObject(fieldValue, javaFieldType, context));
+        }
+    }
+
+    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;
+    }
+
+}

Modified: incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtensionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtensionTestCase.java?view=diff&rev=499913&r1=499912&r2=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtensionTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/SimpleTypeMapperExtensionTestCase.java Thu Jan 25 11:03:27 2007
@@ -96,14 +96,14 @@
             Object value = SAMPLE_VALUES.get(name);
             if (value instanceof String[]) {
                 for (String s : (String[])value) {
-                    Object obj = extension.toJavaObject(simpleType, s, context);
+                    Object obj = extension.toSimpleJavaObject(simpleType, s, context);
                     String str = extension.toXMLLiteral(simpleType, obj, context);
                     assertNotNull(str);
                     // assertTrue("[" + name + "] " + s + " " + str,
                     // str.contains((String) s));
                 }
             } else if (value instanceof String) {
-                Object obj = extension.toJavaObject(simpleType, (String)value, context);
+                Object obj = extension.toSimpleJavaObject(simpleType, (String)value, context);
                 String str = extension.toXMLLiteral(simpleType, obj, context);
                 assertNotNull(str);
                 // assertTrue("[" + name + "] " + value + " " + str,

Added: incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtensionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtensionTestCase.java?view=auto&rev=499913
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtensionTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/XMLTypeMapperExtensionTestCase.java Thu Jan 25 11:03:27 2007
@@ -0,0 +1,148 @@
+/*
+ * 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.spi.databinding.extension;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.apache.tuscany.spi.model.DataType;
+import org.easymock.EasyMock;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+/**
+ * 
+ */
+public class XMLTypeMapperExtensionTestCase extends TestCase {
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testFieldSettings() throws Exception {
+        
+        XMLTypeMapperExtension extension = new XMLTypeMapperExtension();
+        
+        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> dataType = new DataType<Class>(null, SamplePropertyBean.class);
+        EasyMock.expect(context.getTargetDataType()).andReturn(dataType).anyTimes();
+        EasyMock.replay(context);
+        
+        Object javaObject = extension.toJavaObject(typeInfo, samplePropertyNode, 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);
+    }
+    
+    
+    public static class SamplePropertyBean  {
+        
+        public float floatNumber = 50;
+        public double doubleNumber = 75;
+        public boolean[] boolArray = null;
+        protected int integerNumber = 25;
+        private String[] stringArray;
+        
+        SamplePropertyBean innerProperty;
+        
+        public SamplePropertyBean() {
+            
+        }
+
+        public 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