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