/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.test.models.projects; import java.net.URISyntaxException; import java.util.HashMap; import javax.xml.namespace.QName; import org.eclipse.persistence.tools.workbench.test.models.jaxb.employee.Address; import org.eclipse.persistence.tools.workbench.test.models.jaxb.employee.Dependent; import org.eclipse.persistence.tools.workbench.test.models.jaxb.employee.Employee; import org.eclipse.persistence.tools.workbench.test.models.jaxb.employee.NormalHoursTransformer; import org.eclipse.persistence.tools.workbench.test.models.jaxb.employee.PhoneNumber; import org.eclipse.persistence.internal.queries.CollectionContainerPolicy; import org.eclipse.persistence.internal.queries.ListContainerPolicy; import org.eclipse.persistence.internal.queries.MapContainerPolicy; import org.eclipse.persistence.mappings.converters.ObjectTypeConverter; 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.XMLLogin; import org.eclipse.persistence.oxm.mappings.XMLAnyAttributeMapping; 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.XMLFragmentCollectionMapping; import org.eclipse.persistence.oxm.mappings.XMLFragmentMapping; import org.eclipse.persistence.oxm.mappings.XMLObjectReferenceMapping; import org.eclipse.persistence.oxm.mappings.XMLTransformationMapping; import org.eclipse.persistence.oxm.schema.XMLSchemaFileReference; import org.eclipse.persistence.platform.xml.XMLSchemaReference; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.mapping.xml.AnyAttributeMappingNode; import org.eclipse.persistence.tools.workbench.utility.io.FileTools; public class EmployeeJAXBRuntimeProject { private Project runtimeProject; public EmployeeJAXBRuntimeProject() { super(); this.initialize(); } private void initialize() { this.runtimeProject = new Project(); this.runtimeProject.setName("Employee-OX"); this.runtimeProject.setLogin(new XMLLogin()); this.initializeDescriptors(); } private void initializeDescriptors() { this.runtimeProject.addDescriptor(this.buildAddressDescriptor()); this.runtimeProject.addDescriptor(this.buildDependentDescriptor()); this.runtimeProject.addDescriptor(this.buildEmployeeDescriptor()); this.runtimeProject.addDescriptor(this.buildPhoneNumberDescriptor()); } private String buildSchemaFile() { try { return FileTools.buildFile(this.getClass().getResource("/schema/employee.xsd")).getPath(); } catch (URISyntaxException e) { throw new RuntimeException(e); } } private XMLDescriptor buildAddressDescriptor() { XMLDescriptor addressDescriptor = new XMLDescriptor(); addressDescriptor.setJavaClassName(Address.class.getName()); addressDescriptor.setSchemaReference(new XMLSchemaFileReference(buildSchemaFile())); addressDescriptor.setNamespaceResolver(new NamespaceResolver()); ((XMLSchemaFileReference) addressDescriptor.getSchemaReference()).setSchemaContext("/address"); ((XMLSchemaFileReference) addressDescriptor.getSchemaReference()).setType(XMLSchemaReference.ELEMENT); addressDescriptor.descriptorIsAggregate(); XMLDirectMapping street1Mapping = new XMLDirectMapping(); street1Mapping.setAttributeName("street1"); street1Mapping.setXPath("street[1]/text()"); addressDescriptor.addMapping(street1Mapping); XMLDirectMapping street2Mapping = new XMLDirectMapping(); street2Mapping.setAttributeName("street2"); street2Mapping.setXPath("street[2]/text()"); addressDescriptor.addMapping(street2Mapping); XMLDirectMapping cityMapping = new XMLDirectMapping(); cityMapping.setAttributeName("city"); cityMapping.setXPath("city/text()"); addressDescriptor.addMapping(cityMapping); XMLDirectMapping provinceMapping = new XMLDirectMapping(); provinceMapping.setAttributeName("province"); provinceMapping.setXPath("province/text()"); addressDescriptor.addMapping(provinceMapping); XMLDirectMapping postalCodeMapping = new XMLDirectMapping(); postalCodeMapping.setAttributeName("postalCode"); postalCodeMapping.setXPath("postal-code/text()"); addressDescriptor.addMapping(postalCodeMapping); return addressDescriptor; } private XMLDescriptor buildDependentDescriptor() { XMLDescriptor dependentDescriptor = new XMLDescriptor(); dependentDescriptor.setJavaClassName(Dependent.class.getName()); dependentDescriptor.setSchemaReference(new XMLSchemaFileReference(buildSchemaFile())); dependentDescriptor.setNamespaceResolver(new NamespaceResolver()); ((XMLSchemaFileReference) dependentDescriptor.getSchemaReference()).setSchemaContext("/employee/dependent-information/dependent"); ((XMLSchemaFileReference) dependentDescriptor.getSchemaReference()).setType(XMLSchemaReference.ELEMENT); dependentDescriptor.descriptorIsAggregate(); XMLDirectMapping firstNameMapping = new XMLDirectMapping(); firstNameMapping.setAttributeName("firstName"); firstNameMapping.setXPath("@first-name"); dependentDescriptor.addMapping(firstNameMapping); XMLDirectMapping lastNameMapping = new XMLDirectMapping(); lastNameMapping.setAttributeName("lastName"); lastNameMapping.setXPath("@last-name"); dependentDescriptor.addMapping(lastNameMapping); XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping(); addressMapping.setAttributeName("address"); addressMapping.setXPath("address"); addressMapping.setReferenceClassName(Address.class.getName()); dependentDescriptor.addMapping(addressMapping); XMLCompositeObjectMapping phoneNumberMapping = new XMLCompositeObjectMapping(); phoneNumberMapping.setAttributeName("phoneNumber"); phoneNumberMapping.setXPath("phone-no"); phoneNumberMapping.setReferenceClassName(PhoneNumber.class.getName()); dependentDescriptor.addMapping(phoneNumberMapping); return dependentDescriptor; } private XMLDescriptor buildEmployeeDescriptor() { XMLDescriptor employeeDescriptor = new XMLDescriptor(); employeeDescriptor.setJavaClassName(Employee.class.getName()); employeeDescriptor.setSchemaReference(new XMLSchemaFileReference(buildSchemaFile())); employeeDescriptor.setNamespaceResolver(new NamespaceResolver()); ((XMLSchemaFileReference) employeeDescriptor.getSchemaReference()).setSchemaContext("/employee"); ((XMLSchemaFileReference) employeeDescriptor.getSchemaReference()).setType(XMLSchemaReference.ELEMENT); employeeDescriptor.setDefaultRootElement("employee"); XMLFragmentMapping firstNameMapping = new XMLFragmentMapping(); firstNameMapping.setAttributeName("firstName"); firstNameMapping.setXPath("personal-information/@first-name"); employeeDescriptor.addMapping(firstNameMapping); XMLFragmentCollectionMapping lastNameMapping = new XMLFragmentCollectionMapping(); lastNameMapping.setAttributeName("lastName"); lastNameMapping.setXPath("personal-information/@last-name"); lastNameMapping.getContainerPolicy().getContainerClassName(); employeeDescriptor.addMapping(lastNameMapping); XMLDirectMapping genderMapping = new XMLDirectMapping(); genderMapping.setAttributeName("gender"); genderMapping.setXPath("personal-information/@gender"); ObjectTypeConverter genderConverter = new ObjectTypeConverter(genderMapping); genderConverter.addConversionValue("F", "female"); genderConverter.addConversionValue("M", "male"); genderConverter.setDefaultAttributeValue("male"); genderMapping.setConverter(genderConverter); employeeDescriptor.addMapping(genderMapping); XMLTransformationMapping normalHoursMapping = new XMLTransformationMapping(); normalHoursMapping.setAttributeName("normalHours"); normalHoursMapping.setAttributeTransformerClassName(NormalHoursTransformer.class.getName()); //TODO proxy indirection, when runtime supports it // normalHoursMapping.setIndirectionPolicy(new ProxyIndirectionPolicy()); XMLField startTimeField = new XMLField("working-hours/start-time/text()"); startTimeField.setSchemaType(new QName(XMLConstants.SCHEMA_URL, XMLConstants.DATE_TIME)); normalHoursMapping.addFieldTransformerClassName(startTimeField, NormalHoursTransformer.class.getName()); XMLField endTimeField = new XMLField("working-hours/end-time/text()"); endTimeField.setSchemaType(new QName(XMLConstants.SCHEMA_URL, XMLConstants.DATE_TIME)); normalHoursMapping.addFieldTransformerClassName(endTimeField, NormalHoursTransformer.class.getName()); employeeDescriptor.addMapping(normalHoursMapping); XMLObjectReferenceMapping addressMapping = new XMLObjectReferenceMapping(); addressMapping.setAttributeName("address"); addressMapping.addSourceToTargetKeyFieldAssociation("contact-information/address/@employee-id", "@employee-id"); addressMapping.setReferenceClassName(Address.class.getName()); employeeDescriptor.addMapping(addressMapping); XMLCollectionReferenceMapping phoneNumbersMapping = new XMLCollectionReferenceMapping(); phoneNumbersMapping.setAttributeName("phoneNumbers"); phoneNumbersMapping.addSourceToTargetKeyFieldAssociation("contact-information/phone/@type", "@type"); phoneNumbersMapping.setReferenceClassName(PhoneNumber.class.getName()); phoneNumbersMapping.setContainerPolicy(new ListContainerPolicy("java.util.Vector")); employeeDescriptor.addMapping(phoneNumbersMapping); XMLCompositeCollectionMapping dependentsMapping = new XMLCompositeCollectionMapping(); dependentsMapping.setAttributeName("dependents"); dependentsMapping.setXPath("dependent-information/dependent"); dependentsMapping.setReferenceClassName(Dependent.class.getName()); dependentsMapping.useCollectionClassName("java.util.Vector"); employeeDescriptor.addMapping(dependentsMapping); XMLAnyAttributeMapping responsibilitiesMapping = new XMLAnyAttributeMapping(); responsibilitiesMapping.setAttributeName("responsibilities"); responsibilitiesMapping.setXPath("responsibility/text()"); responsibilitiesMapping.useMapClassName("java.util.HashMap"); employeeDescriptor.addMapping(responsibilitiesMapping); return employeeDescriptor; } private XMLDescriptor buildPhoneNumberDescriptor() { XMLDescriptor phoneNumberDescriptor = new XMLDescriptor(); phoneNumberDescriptor.setJavaClassName(PhoneNumber.class.getName()); phoneNumberDescriptor.setSchemaReference(new XMLSchemaFileReference(buildSchemaFile())); phoneNumberDescriptor.setNamespaceResolver(new NamespaceResolver()); ((XMLSchemaFileReference) phoneNumberDescriptor.getSchemaReference()).setSchemaContext("/phone-type"); phoneNumberDescriptor.descriptorIsAggregate(); XMLDirectMapping typeMapping = new XMLDirectMapping(); typeMapping.setAttributeName("type"); typeMapping.setXPath("@type"); phoneNumberDescriptor.addMapping(typeMapping); XMLDirectMapping areaCodeMapping = new XMLDirectMapping(); areaCodeMapping.setAttributeName("areaCode"); XMLField areaCodeField = new XMLField("area-code/text()"); areaCodeField.setIsTypedTextField(true); areaCodeMapping.setField(areaCodeField); phoneNumberDescriptor.addMapping(areaCodeMapping); XMLDirectMapping numberMapping = new XMLDirectMapping(); numberMapping.setAttributeName("number"); XMLField numberField = new XMLField("number/text()"); numberField.setIsTypedTextField(true); numberMapping.setField(numberField); phoneNumberDescriptor.addMapping(numberMapping); return phoneNumberDescriptor; } public Project getRuntimeProject() { return this.runtimeProject; } }