| /* |
| * 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: |
| // dmccann - Mar 2/2009 - 2.0 - Initial implementation |
| package org.eclipse.persistence.testing.oxm.schemamodelgenerator; |
| |
| import java.math.BigDecimal; |
| import java.util.ArrayList; |
| |
| import org.eclipse.persistence.internal.queries.ContainerPolicy; |
| import org.eclipse.persistence.mappings.converters.EnumTypeConverter; |
| import org.eclipse.persistence.mappings.converters.TypeConversionConverter; |
| 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.FixedMimeTypePolicy; |
| import org.eclipse.persistence.oxm.mappings.XMLAnyAttributeMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLAnyObjectMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLBinaryDataCollectionMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLBinaryDataMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLChoiceObjectMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLCollectionReferenceMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLCompositeDirectCollectionMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLDirectMapping; |
| import org.eclipse.persistence.oxm.mappings.XMLObjectReferenceMapping; |
| import org.eclipse.persistence.oxm.schema.XMLSchemaReference; |
| import org.eclipse.persistence.oxm.schema.XMLSchemaURLReference; |
| import org.eclipse.persistence.sessions.Project; |
| |
| public class TestProject extends Project { |
| NamespaceResolver nsr; |
| boolean setSchemaContext, setDefaultRootElement; |
| |
| public TestProject() { |
| nsr = new NamespaceResolver(); |
| setSchemaContext = true; |
| setDefaultRootElement = true; |
| addDescriptors(); |
| } |
| |
| public TestProject(boolean setSchemaContext, boolean setDefaultRootElement) { |
| nsr = new NamespaceResolver(); |
| this.setSchemaContext = setSchemaContext; |
| this.setDefaultRootElement = setDefaultRootElement; |
| addDescriptors(); |
| } |
| |
| public TestProject(boolean setSchemaContext, boolean setDefaultRootElement, String defaultUri) { |
| nsr = new NamespaceResolver(); |
| nsr.setDefaultNamespaceURI(defaultUri); |
| this.setSchemaContext = setSchemaContext; |
| this.setDefaultRootElement = setDefaultRootElement; |
| addDescriptors(); |
| } |
| |
| public TestProject(NamespaceResolver resolver, boolean setSchemaContext, boolean setDefaultRootElement) { |
| nsr = resolver; |
| this.setSchemaContext = setSchemaContext; |
| this.setDefaultRootElement = setDefaultRootElement; |
| addDescriptors(); |
| } |
| |
| private void addDescriptors() { |
| addDescriptor(getEmployeeDescriptor()); |
| addDescriptor(getAddressDescriptor()); |
| addDescriptor(getPhoneNumberDescriptor()); |
| } |
| |
| private XMLDescriptor getEmployeeDescriptor() { |
| XMLDescriptor descriptor = new XMLDescriptor(); |
| descriptor.setJavaClass(Employee.class); |
| descriptor.setAlias("Employee"); |
| descriptor.addPrimaryKeyFieldName("name/text()"); |
| descriptor.setNamespaceResolver(nsr); |
| if (setSchemaContext) { |
| XMLSchemaReference sRef = new XMLSchemaURLReference(); |
| sRef.setSchemaContext("/employee-type"); |
| sRef.setType(XMLSchemaReference.COMPLEX_TYPE); |
| descriptor.setSchemaReference(sRef); |
| } |
| if (setDefaultRootElement) { |
| descriptor.setDefaultRootElement("employee"); |
| } |
| // create name mapping |
| XMLDirectMapping nameMapping = new XMLDirectMapping(); |
| nameMapping.setAttributeName("name"); |
| nameMapping.setXPath("name/text()"); |
| descriptor.addMapping(nameMapping); |
| // create address mapping |
| XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping(); |
| addressMapping.setAttributeName("address"); |
| addressMapping.setXPath("address"); |
| addressMapping.setReferenceClass(Address.class); |
| descriptor.addMapping(addressMapping); |
| // create phoneNumbers mapping |
| XMLCompositeCollectionMapping phonesMapping = new XMLCompositeCollectionMapping(); |
| phonesMapping.setAttributeName("phoneNumbers"); |
| phonesMapping.useCollectionClass(ArrayList.class); |
| phonesMapping.setXPath("phone-numbers"); |
| phonesMapping.setReferenceClass(PhoneNumber.class); |
| descriptor.addMapping(phonesMapping); |
| // create projectIDs mapping |
| XMLCompositeDirectCollectionMapping projectIdsMapping = new XMLCompositeDirectCollectionMapping(); |
| projectIdsMapping.setAttributeName("projectIDs"); |
| projectIdsMapping.useCollectionClass(ArrayList.class); |
| projectIdsMapping.setXPath("project-id"); |
| TypeConversionConverter tcc = new TypeConversionConverter(projectIdsMapping); |
| tcc.setObjectClass(BigDecimal.class); |
| projectIdsMapping.setValueConverter(tcc); |
| descriptor.addMapping(projectIdsMapping); |
| // create stuff mapping |
| XMLAnyCollectionMapping acMapping = new XMLAnyCollectionMapping(); |
| acMapping.setAttributeName("stuff"); |
| descriptor.addMapping(acMapping); |
| |
| // Enable Choice testing when Bug 269880 has been fixed |
| // create choice mapping - choice |
| XMLChoiceObjectMapping choiceMapping = new XMLChoiceObjectMapping(); |
| choiceMapping.setAttributeName("choice"); |
| choiceMapping.addChoiceElement("nickname/text()", String.class); |
| choiceMapping.addChoiceElement("secondAddress", Address.class); |
| choiceMapping.addChoiceElement("age/text()", Integer.class); |
| //descriptor.addMapping(choiceMapping); |
| |
| // Enable ChoiceCollection testing when Bug 269880 has been fixed |
| // create choices mapping |
| XMLChoiceCollectionMapping choiceCMapping = new XMLChoiceCollectionMapping(); |
| choiceCMapping.setAttributeName("choices"); |
| choiceCMapping.addChoiceElement("badgeId/text()", Integer.class); |
| choiceCMapping.addChoiceElement("alternateAddress", Address.class); |
| choiceCMapping.addChoiceElement("codename/text()", String.class); |
| //descriptor.addMapping(choiceCMapping); |
| |
| // create billingAddress mapping |
| XMLObjectReferenceMapping orMapping = new XMLObjectReferenceMapping(); |
| orMapping.setAttributeName("billingAddress"); |
| orMapping.setReferenceClass(Address.class); |
| orMapping.addSourceToTargetKeyFieldAssociation("@bill-address-id", "@aid"); |
| orMapping.addSourceToTargetKeyFieldAssociation("bill-address-city/text()", "city/text()"); |
| descriptor.addMapping(orMapping); |
| |
| // create data mapping |
| XMLBinaryDataMapping dataMapping = new XMLBinaryDataMapping(); |
| dataMapping.setAttributeName("data"); |
| XMLField field = new XMLField("data"); |
| field.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME); |
| dataMapping.setField(field); |
| dataMapping.setShouldInlineBinaryData(false); |
| dataMapping.setSwaRef(true); |
| dataMapping.setMimeType("application/binary"); |
| descriptor.addMapping(dataMapping); |
| |
| // create bytes mapping |
| XMLBinaryDataCollectionMapping bytesMapping = new XMLBinaryDataCollectionMapping(); |
| bytesMapping.setAttributeName("bytes"); |
| XMLField theField = new XMLField("bytes"); |
| theField.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME); |
| bytesMapping.setField(theField); |
| bytesMapping.setShouldInlineBinaryData(false); |
| bytesMapping.setSwaRef(false); |
| bytesMapping.setMimeType("text/plain"); |
| descriptor.addMapping(bytesMapping); |
| |
| // create URL mapping |
| XMLDirectMapping urlMapping = new XMLDirectMapping(); |
| urlMapping.setAttributeName("aUrl"); |
| urlMapping.setXPath("aUrl/text()"); |
| descriptor.addMapping(urlMapping); |
| |
| return descriptor; |
| } |
| |
| private XMLDescriptor getAddressDescriptor() { |
| XMLDescriptor descriptor = new XMLDescriptor(); |
| descriptor.setJavaClass(Address.class); |
| descriptor.addPrimaryKeyFieldName("@aid"); |
| descriptor.addPrimaryKeyFieldName("city/text()"); |
| descriptor.setAlias("Address"); |
| descriptor.setNamespaceResolver(nsr); |
| if (setSchemaContext) { |
| XMLSchemaReference sRef = new XMLSchemaURLReference(); |
| sRef.setSchemaContext("/address-type"); |
| sRef.setType(XMLSchemaReference.COMPLEX_TYPE); |
| descriptor.setSchemaReference(sRef); |
| } |
| if (setDefaultRootElement) { |
| descriptor.setDefaultRootElement("address"); |
| } |
| // create id mapping |
| XMLDirectMapping idMapping = new XMLDirectMapping(); |
| idMapping.setAttributeName("id"); |
| idMapping.setXPath("@aid"); |
| idMapping.setAttributeClassification(Integer.class); |
| descriptor.addMapping(idMapping); |
| // create street mapping |
| XMLDirectMapping streetMapping = new XMLDirectMapping(); |
| streetMapping.setAttributeName("street"); |
| streetMapping.setXPath("street/text()"); |
| descriptor.addMapping(streetMapping); |
| // create city mapping |
| XMLDirectMapping cityMapping = new XMLDirectMapping(); |
| cityMapping.setAttributeName("city"); |
| cityMapping.setXPath("city/text()"); |
| descriptor.addMapping(cityMapping); |
| // create country mapping |
| XMLDirectMapping countryMapping = new XMLDirectMapping(); |
| countryMapping.setAttributeName("country"); |
| countryMapping.setXPath("country/text()"); |
| descriptor.addMapping(countryMapping); |
| // create postalCode mapping |
| XMLDirectMapping postalMapping = new XMLDirectMapping(); |
| postalMapping.setAttributeName("postalCode"); |
| postalMapping.setXPath("@postal-code"); |
| descriptor.addMapping(postalMapping); |
| // create thingy mapping |
| XMLAnyObjectMapping anyMapping = new XMLAnyObjectMapping(); |
| anyMapping.setAttributeName("thingy"); |
| descriptor.addMapping(anyMapping); |
| // create occupants mapping |
| XMLCollectionReferenceMapping occupantsMapping = new XMLCollectionReferenceMapping(); |
| occupantsMapping.useCollectionClass(ArrayList.class); |
| occupantsMapping.setAttributeName("occupants"); |
| occupantsMapping.setReferenceClass(Employee.class); |
| occupantsMapping.addSourceToTargetKeyFieldAssociation("occupant/text()", "name/text()"); |
| descriptor.addMapping(occupantsMapping); |
| return descriptor; |
| } |
| |
| private XMLDescriptor getPhoneNumberDescriptor() { |
| XMLDescriptor descriptor = new XMLDescriptor(); |
| descriptor.setJavaClass(PhoneNumber.class); |
| descriptor.setAlias("PhoneNumber"); |
| descriptor.setNamespaceResolver(nsr); |
| if (setSchemaContext) { |
| XMLSchemaReference sRef = new XMLSchemaURLReference(); |
| sRef.setSchemaContext("/phone-number-type"); |
| sRef.setType(XMLSchemaReference.COMPLEX_TYPE); |
| descriptor.setSchemaReference(sRef); |
| } |
| if (setDefaultRootElement) { |
| descriptor.setDefaultRootElement("phone-number"); |
| } |
| // create number mapping |
| XMLDirectMapping numberMapping = new XMLDirectMapping(); |
| numberMapping.setAttributeName("number"); |
| numberMapping.setXPath("number/text()"); |
| descriptor.addMapping(numberMapping); |
| // create thing mapping |
| XMLAnyAttributeMapping anyMapping = new XMLAnyAttributeMapping(); |
| anyMapping.setAttributeName("thing"); |
| descriptor.addMapping(anyMapping); |
| // Uncomment the following when enumeration support is added |
| /* |
| // create type mapping |
| XMLDirectMapping typeMapping = new XMLDirectMapping(); |
| typeMapping.setAttributeName("type"); |
| typeMapping.setXPath("@type"); |
| EnumTypeConverter converter = new EnumTypeConverter(typeMapping, PhoneNumberType.class, false); |
| typeMapping.setConverter(converter); |
| descriptor.addMapping(typeMapping); |
| */ |
| return descriptor; |
| } |
| } |