| /* |
| * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // rbarkhouse - May 26 2008 - 1.0M8 - Initial implementation |
| // rbarkhouse - July 14 2008 - 1.1 - Modified to enable wrappers to have multiple associated QNames |
| |
| package org.eclipse.persistence.sdo.types; |
| |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.xml.namespace.QName; |
| |
| import org.eclipse.persistence.exceptions.SDOException; |
| import org.eclipse.persistence.oxm.NamespaceResolver; |
| import org.eclipse.persistence.oxm.XMLConstants; |
| import org.eclipse.persistence.oxm.XMLDescriptor; |
| import org.eclipse.persistence.oxm.XMLField; |
| import org.eclipse.persistence.oxm.mappings.XMLDirectMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLTransformationMapping; |
| import org.eclipse.persistence.oxm.schema.XMLSchemaURLReference; |
| import org.eclipse.persistence.sdo.SDOConstants; |
| import org.eclipse.persistence.sdo.SDODataObject; |
| import org.eclipse.persistence.sdo.SDOProperty; |
| import org.eclipse.persistence.sdo.SDOType; |
| import org.eclipse.persistence.sdo.helper.SDOClassLoader; |
| import org.eclipse.persistence.sdo.helper.SDOMethodAttributeAccessor; |
| import org.eclipse.persistence.sdo.helper.SDOTypeHelper; |
| import org.eclipse.persistence.sdo.helper.SDOXMLHelper; |
| import org.eclipse.persistence.sdo.helper.extension.SDOUtil; |
| import org.eclipse.persistence.sdo.helper.metadata.NamespaceURITransformer; |
| import org.eclipse.persistence.sdo.helper.metadata.QNameTransformer; |
| import org.eclipse.persistence.sessions.Project; |
| |
| import commonj.sdo.Type; |
| |
| /** |
| * Wrapper for XML datatypes. |
| * @author rbarkhou |
| */ |
| public class SDOWrapperType extends SDOType implements Type { |
| |
| private static final String PACKAGE_NAME = "org.eclipse.persistence.sdo.dataobjects."; |
| private static final String ATTRIBUTE_NAME = "value"; |
| private static final String XPATH = "text()"; |
| |
| private String typeName; |
| private Map<QName, XMLDescriptor> descriptorsMap; |
| |
| public SDOWrapperType(Type aPropertyType, String aTypeName, SDOTypeHelper aSDOTypeHelper) { |
| this(aPropertyType, aTypeName, aSDOTypeHelper, (QName) null, null); |
| } |
| |
| public SDOWrapperType(Type aPropertyType, String aTypeName, SDOTypeHelper aSDOTypeHelper, QName aSchemaType) { |
| this(aPropertyType, aTypeName, aSDOTypeHelper, new QName[] { aSchemaType }, null); |
| } |
| |
| public SDOWrapperType(Type aPropertyType, String aTypeName, SDOTypeHelper aSDOTypeHelper, QName aSchemaType, Class<? extends SDODataObject> implClass) { |
| this(aPropertyType, aTypeName, aSDOTypeHelper, new QName[] { aSchemaType }, new Class[] { implClass }); |
| } |
| |
| public SDOWrapperType(Type aPropertyType, String aTypeName, SDOTypeHelper aSDOTypeHelper, QName[] schemaTypes) { |
| this(aPropertyType, aTypeName, aSDOTypeHelper, schemaTypes, null); |
| } |
| |
| public SDOWrapperType(Type aPropertyType, String aTypeName, SDOTypeHelper aSDOTypeHelper, QName[] schemaTypes, Class<? extends SDODataObject>[] implClasses) { |
| super(SDOConstants.ORACLE_SDO_URL, aTypeName, aSDOTypeHelper); |
| typeName = aTypeName; |
| |
| SDOProperty valueProperty = new SDOProperty(aHelperContext); |
| valueProperty.setName("value"); |
| valueProperty.setType(aPropertyType); |
| valueProperty.setXsdType(schemaTypes[0]); |
| addDeclaredProperty(valueProperty); |
| |
| String normalizedTypeName = SDOUtil.className(aTypeName, true, true, false); |
| if(null == implClasses || null == implClasses[0]) { |
| // Remove any special characters from the type name to create the class name: |
| String implClassName = PACKAGE_NAME + normalizedTypeName + "WrapperImpl" ; |
| setImplClassName(implClassName); |
| getImplClass(); |
| } else { |
| this.javaImplClass = implClasses[0]; |
| this.xmlDescriptor.setJavaClass(javaImplClass); |
| } |
| |
| // Add a new map to typehelperdelegate |
| // interface --> sdotype |
| // add (this) into map during constructor i.e. here |
| // change getType(Class) on typehelperdelegate to check map first |
| |
| initializeDescriptor(xmlDescriptor, schemaTypes[0], aPropertyType, valueProperty); |
| |
| descriptorsMap = new HashMap<QName, XMLDescriptor>(); |
| descriptorsMap.put(schemaTypes[0], xmlDescriptor); |
| setSchemaContext(xmlDescriptor, schemaTypes[0]); |
| |
| if (schemaTypes.length > 1) { |
| for (int i = 1; i < schemaTypes.length; i++) { |
| XMLDescriptor d = new XMLDescriptor(); |
| QName schemaType = schemaTypes[i]; |
| String className = PACKAGE_NAME + normalizedTypeName + "_" + schemaType.getLocalPart() + "Wrapper"; |
| |
| // Now generate the class in memory |
| try { |
| if(null == implClasses || null == implClasses[i]) { |
| SDOClassLoader loader = ((SDOXMLHelper)aHelperContext.getXMLHelper()).getLoader(); |
| d.setJavaClass(loader.loadClass(className + "Impl", this)); |
| } else { |
| d.setJavaClass(implClasses[i]); |
| } |
| } catch (ClassNotFoundException e) { |
| throw SDOException.classNotFound(e, getURI(), getName()); |
| } catch (SecurityException e) { |
| throw SDOException.classNotFound(e, getURI(), getName()); |
| } |
| |
| initializeDescriptor(d, schemaType, aPropertyType, valueProperty); |
| descriptorsMap.put(schemaTypes[i], d); |
| setSchemaContext(d, schemaTypes[i]); |
| } |
| } |
| } |
| |
| /** |
| * Convenience method that sets a schema context (as QName) on a given descriptor. |
| * |
| * If either schemaType or desc is null, no action is performed. |
| * |
| * @param desc XML descriptor to which an XMLSchemaReference will be added |
| * @param schemaType QName that will be set as the schema context QName |
| */ |
| private void setSchemaContext(XMLDescriptor desc, QName schemaType) { |
| if (schemaType == null || desc == null) { |
| return; |
| } |
| XMLSchemaURLReference urlRef = new XMLSchemaURLReference(); |
| urlRef.setSchemaContextAsQName(schemaType); |
| desc.setSchemaReference(urlRef); |
| } |
| |
| private void initializeDescriptor(XMLDescriptor aDescriptor, QName aQName, Type aPropertyType, SDOProperty aValueProperty) { |
| aDescriptor.setNamespaceResolver(null); |
| |
| SDOMethodAttributeAccessor accessor = null; |
| accessor = new SDOMethodAttributeAccessor(aValueProperty); |
| |
| if (XMLConstants.QNAME_QNAME.equals(aQName)) { |
| XMLTransformationMapping mapping = new XMLTransformationMapping(); |
| mapping.setAttributeName(ATTRIBUTE_NAME); |
| |
| QNameTransformer transformer = new QNameTransformer("text()"); |
| mapping.setAttributeTransformer(transformer); |
| mapping.addFieldTransformer(XPATH, transformer); |
| |
| NamespaceResolver nsr = new NamespaceResolver(); |
| nsr.setDefaultNamespaceURI(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI); |
| XMLField field = new XMLField(); |
| field.setNamespaceResolver(nsr); |
| field.setXPath("@" + javax.xml.XMLConstants.XMLNS_ATTRIBUTE); |
| mapping.addFieldTransformer(field, new NamespaceURITransformer()); |
| |
| mapping.setAttributeAccessor(accessor); |
| aDescriptor.addMapping(mapping); |
| } else { |
| XMLDirectMapping mapping = new XMLDirectMapping(); |
| mapping.setAttributeName(ATTRIBUTE_NAME); |
| mapping.setXPath(XPATH); |
| |
| mapping.setAttributeClassification(aPropertyType.getInstanceClass()); |
| |
| ((XMLField) mapping.getField()).setSchemaType(aQName); |
| |
| mapping.setAttributeAccessor(accessor); |
| aDescriptor.addMapping(mapping); |
| } |
| |
| aDescriptor.setIsWrapper(true); |
| } |
| |
| public XMLDescriptor getXmlDescriptor(QName aQName) { |
| XMLDescriptor d = descriptorsMap.get(aQName); |
| |
| if (d == null) { |
| // Return the default |
| return xmlDescriptor; |
| } |
| |
| return d; |
| } |
| |
| public Map getDescriptorsMap() { |
| return descriptorsMap; |
| } |
| |
| public void addDescriptorToProject(Project project) { |
| Iterator<XMLDescriptor> it = descriptorsMap.values().iterator(); |
| while (it.hasNext()) { |
| project.addDescriptor(it.next()); |
| } |
| } |
| |
| @Override |
| public List getAliasNames() { |
| return Collections.EMPTY_LIST; |
| } |
| |
| @Override |
| public List getBaseTypes() { |
| return Collections.EMPTY_LIST; |
| } |
| |
| @Override |
| public String getName() { |
| return typeName; |
| } |
| |
| @Override |
| public String getURI() { |
| return SDOConstants.ORACLE_SDO_URL; |
| } |
| |
| @Override |
| public boolean isAbstract() { |
| return false; |
| } |
| |
| @Override |
| public boolean isDataType() { |
| return false; |
| } |
| |
| @Override |
| public boolean isOpen() { |
| return false; |
| } |
| |
| @Override |
| public boolean isSequenced() { |
| return false; |
| } |
| |
| @Override |
| public boolean isFinalized() { |
| return true; |
| } |
| |
| @Override |
| public boolean isWrapperType() { |
| return true; |
| } |
| |
| @Override |
| public String toString() { |
| StringBuffer str = new StringBuffer(); |
| str.append(getClass().getSimpleName() + "@" + Integer.toHexString(hashCode())); |
| str.append("{uri="); |
| str.append(getURI()); |
| str.append(" name="); |
| str.append(getName()); |
| str.append("}"); |
| |
| return str.toString(); |
| } |
| |
| /** |
| * Wrapper for Boolean Object datatype. |
| */ |
| public static class BooleanObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public BooleanObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Boolean datatype. |
| */ |
| public static class BooleanWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public BooleanWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Byte Object datatype. |
| */ |
| public static class ByteObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public ByteObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Bytes datatype. |
| */ |
| public static class BytesWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public BytesWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Byte datatype. |
| */ |
| public static class ByteWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public ByteWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for HEX Binary datatype. |
| */ |
| public static class Bytes_hexBunaryWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public Bytes_hexBunaryWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Character Object datatype. |
| */ |
| public static class CharacterObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public CharacterObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Character datatype. |
| */ |
| public static class CharacterWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public CharacterWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Date Time datatype. |
| */ |
| public static class DateTimeWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DateTimeWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Date datatype. |
| */ |
| public static class DateWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DateWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Day datatype. |
| */ |
| public static class DayWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DayWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Decimal datatype. |
| */ |
| public static class DecimalWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DecimalWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Double Object datatype. |
| */ |
| public static class DoubleObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DoubleObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Double datatype. |
| */ |
| public static class DoubleWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DoubleWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Duration datatype. |
| */ |
| public static class DurationWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public DurationWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Float Object datatype. |
| */ |
| public static class FloatObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public FloatObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for FLoat datatype. |
| */ |
| public static class FloatWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public FloatWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Integer datatype. |
| */ |
| public static class IntegerWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public IntegerWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Int Object datatype. |
| */ |
| public static class IntObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public IntObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Int datatype. |
| */ |
| public static class IntWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public IntWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Long Object datatype. |
| */ |
| public static class LongObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public LongObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Long datatype. |
| */ |
| public static class LongWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public LongWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Month Day datatype. |
| */ |
| public static class MonthDayWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public MonthDayWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Month datatype. |
| */ |
| public static class MonthWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public MonthWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Object datatype. |
| */ |
| public static class ObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public ObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Short object datatype. |
| */ |
| public static class ShortObjectWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public ShortObjectWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Short datatype. |
| */ |
| public static class ShortWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public ShortWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Strings datatype. |
| */ |
| public static class StringsWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public StringsWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for String datatype. |
| */ |
| public static class StringWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public StringWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Time datatype. |
| */ |
| public static class TimeWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public TimeWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for URI datatype. |
| */ |
| public static class URIWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public URIWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for URI QName datatype. |
| */ |
| public static class URI_QNameWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public URI_QNameWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for YearMonthDay datatype. |
| */ |
| public static class YearMonthDayWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public YearMonthDayWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for YearMonth datatype. |
| */ |
| public static class YearMonthWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public YearMonthWrapperImpl() { |
| super(); |
| } |
| } |
| |
| /** |
| * Wrapper for Year datatype. |
| */ |
| public static class YearWrapperImpl extends SDODataObject { |
| /** |
| * Default constructor. |
| */ |
| public YearWrapperImpl() { |
| super(); |
| } |
| } |
| |
| } |