<xsd:element name="value" type="xsd:anyType" minOccurs="0"/>The SDO specs specifies that an XSD element with type "anyType" is map to a DataObject SDO type. This means that you cannot assign simple types like String, Integer, Long, and Boolean among others into this element, because if you do so, you will receive a java.lang.ClassCastException in runtime.
To be able to do that therefore, you need to wrap those simple types into SDO DataObjects. Luckily the current org.eclipse.persistense_1.0.0.0_2-0.jar that ships with JDeveloper already contains simple type wrappers with type "org.eclipse.persistence.sdo.types.SDOWrapperType" as follows:
- String - org.eclipse.persistence.sdo.StringWrapperImpl
- Integer - org.eclipse.persistence.sdo.IntObjectWrapperImpl
- Long - org.eclipse.persistence.sdo.LongObjectWrapperImpl
- Double - org.eclipse.persistence.sdo.DoubleObjectWrapperImpl
- BigDecimal - org.eclipse.persistence.sdo.DecimalWrapperImpl
- Boolean - org.eclipse.persistence.sdo.BooleanObjectWrapperImpl
How do we wrap our simple types into SDO DataObjects?
Below is a utility class that I have devised to handle wrapping and unwrapping of simple types.
package soadev.sdo.utils; import commonj.sdo.DataObject; import commonj.sdo.Type; import commonj.sdo.helper.DataFactory; import java.math.BigDecimal; import oracle.jbo.common.sdo.SDOTypeHandler; import org.eclipse.persistence.sdo.types.SDOWrapperType; /**@author Rommel Pino http://soadev.blogspot.com */ public class SimpleTypeWrapperUtils { public static DataObject wrap(String value) { return wrap(value, "java.lang.String"); } public static DataObject wrap(Long value) { return wrap(value, "java.lang.Long"); } public static DataObject wrap(Integer value) { return wrap(value, "java.lang.Integer"); } public static DataObject wrap(BigDecimal value) { return wrap(value, "java.math.BigDecimal"); } public static DataObject wrap(Short value) { return wrap(value, "java.lang.Short"); } public static DataObject wrap(Boolean value) { return wrap(value, "java.lang.Boolean"); } public static DataObject wrap(Byte value) { return wrap(value, "java.lang.Byte"); } public static DataObject wrap(Double value) { return wrap(value, "java.lang.Double"); } public static DataObject wrap(Float value) { return wrap(value, "java.lang.Float"); } private static DataObject wrap(Object value, String fullyQualifiedSimleTypeClassName) { Type type = SDOTypeHandler.getSDOType(fullyQualifiedSimleTypeClassName); DataObject wrapper = DataFactory.INSTANCE.create(type); wrapper.set("value", value); return wrapper; } public static Object unwrap(DataObject wrapper) { if (wrapper.getType() instanceof SDOWrapperType) { return wrapper.get("value"); } //if not wrapper return the same object return wrapper; } }
In subsequent post, I will describe how to implement some sort of SDO HashMap.
No comments:
Post a Comment