/******************************************************************************* * 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 org.eclipse.persistence.tools.workbench.test.models.eis.employee.NormalHoursTransformer; import org.eclipse.persistence.eis.EISConnectionSpec; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWClassIndicatorFieldPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWClassIndicatorValue; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWDescriptorInterfaceAliasPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWCompositeEisDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWEisDescriptorInheritancePolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWXmlPrimaryKeyPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWEisTransactionalPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWRootEisDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.xml.MWXmlClassIndicatorFieldPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWMapContainerPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWObjectTypeConverter; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWObjectTypeConverter.ConversionValueException; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWCompositeCollectionMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWCompositeObjectMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWEisOneToManyMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWEisOneToOneMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWXmlDirectCollectionMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWXmlDirectMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWXmlTransformationMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWTypeDeclaration; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProject; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProjectDefaultsPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWTransactionalProjectDefaultsPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.xml.MWEisLoginSpec; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.xml.MWEisProject; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.xml.MWEisInteraction; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.xml.MWEisQueryManager; import org.eclipse.persistence.tools.workbench.mappingsmodel.schema.MWComplexTypeDefinition; import org.eclipse.persistence.tools.workbench.mappingsmodel.schema.MWElementDeclaration; import org.eclipse.persistence.tools.workbench.mappingsmodel.schema.MWXmlSchema; public class EmployeeEisProject extends XmlTestProject { // **************** static methods **************************************** public static void main(String[] arg) { new EmployeeEisProject(); } // **************** Constructors ****************************************** public EmployeeEisProject() { super(); } // **************** Initialization **************************************** @Override protected MWProject buildEmptyProject() { return emptyProject(); } public static MWEisProject emptyProject() { MWEisProject project = new MWEisProject("Employee-EIS", MWEisLoginSpec.JMS_ADAPTER_NAME, spiManager()); project.getEisLoginSpec().setConnectionFactoryURL("www.imguessingatthis.com"); project.getEisLoginSpec().setConnectionSpecClass(project.typeFor(EISConnectionSpec.class)); return project; } @Override protected void initializeSchemas() { super.initializeSchemas(); this.addSchema("eis-employee.xsd", "/schema/eis-employee.xsd"); this.addSchema("eis-project.xsd", "/schema/eis-project.xsd"); } @Override protected void initializeDescriptors() { super.initializeDescriptors(); //this is not exactly how it's done in the MultipleClassChooserDialog this.addDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.Address"); this.addDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.Dependent"); this.addDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.PhoneNumber"); this.addRootEisDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.Employee"); this.addRootEisDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.Project"); this.addRootEisDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.eis.employee.LargeProject"); initializeAddressDescriptor(); initializeDependentDescriptor(); initializePhoneNumberDescriptor(); initializeEmployeeDescriptor(); initializeProjectDescriptor(); initializeLargeProjectDescriptor(); initializeReferenceMappings(); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWProjectDefaultsPolicy.AFTER_LOAD_POLICY); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWProjectDefaultsPolicy.COPY_POLICY); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWProjectDefaultsPolicy.INSTANTIATION_POLICY); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWProjectDefaultsPolicy.INHERITANCE_POLICY); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWTransactionalProjectDefaultsPolicy.EVENTS_POLICY); getProject().getDefaultsPolicy().addAdvancedPolicyDefault(MWTransactionalProjectDefaultsPolicy.RETURNING_POLICY); } public void initializeLargeProjectDescriptor() { MWRootEisDescriptor largeProjectDescriptor = getLargeProjectDescriptor(); MWClass largeProjectClass = largeProjectDescriptor.getMWClass(); MWComplexTypeDefinition largeProjectDef = this.getProjectSchema().complexType("large-project-type"); MWElementDeclaration projectElement = this.getProjectSchema().element("project"); largeProjectDescriptor.setSchemaContext(largeProjectDef); largeProjectDescriptor.setDefaultRootElement(projectElement); largeProjectDescriptor.addInheritancePolicy(); MWEisDescriptorInheritancePolicy inheritancePolicy = (MWEisDescriptorInheritancePolicy)largeProjectDescriptor.getInheritancePolicy(); inheritancePolicy.setParentDescriptor(getProjectDescriptor()); MWClassIndicatorFieldPolicy classIndicatorPolicy = (MWClassIndicatorFieldPolicy) this.getProjectDescriptor().getInheritancePolicy().getClassIndicatorPolicy(); MWClassIndicatorValue classIndicatorValue = classIndicatorPolicy.getClassIndicatorValueForDescriptor(largeProjectDescriptor); classIndicatorValue.setInclude(true); classIndicatorValue.setIndicatorValue("large-project"); MWEisTransactionalPolicy transactionalPolicy = (MWEisTransactionalPolicy) largeProjectDescriptor.getTransactionalPolicy(); transactionalPolicy.setConformResultsInUnitOfWork(true); transactionalPolicy.getRefreshCachePolicy().setDisableCacheHits(true); transactionalPolicy.getRefreshCachePolicy().setAlwaysRefreshCache(true); MWXmlDirectMapping budgetMapping = (MWXmlDirectMapping)largeProjectDescriptor.addDirectMapping(largeProjectClass.attributeNamed("budget")); budgetMapping.getXmlField().setXpath("budget/text()"); MWXmlDirectMapping milestoneVersionMapping = (MWXmlDirectMapping)largeProjectDescriptor.addDirectMapping(largeProjectClass.attributeNamed("milestoneVersion")); milestoneVersionMapping.getXmlField().setXpath("milestone/text()"); } public void initializeAddressDescriptor() { MWCompositeEisDescriptor addressDescriptor = this.getAddressDescriptor(); MWClass addressClass = addressDescriptor.getMWClass(); MWElementDeclaration addressElement = this.getEmployeeSchema().element("address"); addressDescriptor.setSchemaContext(addressElement); MWXmlDirectMapping street1Mapping = (MWXmlDirectMapping) addressDescriptor.addDirectMapping(addressClass.attributeNamed("street1")); street1Mapping.getXmlField().setXpath("street[1]/text()"); MWXmlDirectMapping street2Mapping = (MWXmlDirectMapping) addressDescriptor.addDirectMapping(addressClass.attributeNamed("street2")); street2Mapping.getXmlField().setXpath("street[2]/text()"); MWXmlDirectMapping cityMapping = (MWXmlDirectMapping) addressDescriptor.addDirectMapping(addressClass.attributeNamed("city")); cityMapping.getXmlField().setXpath("city/text()"); MWXmlDirectMapping provinceMapping = (MWXmlDirectMapping) addressDescriptor.addDirectMapping(addressClass.attributeNamed("province")); provinceMapping.getXmlField().setXpath("province/text()"); MWXmlDirectMapping postalCodeMapping = (MWXmlDirectMapping) addressDescriptor.addDirectMapping(addressClass.attributeNamed("postalCode")); postalCodeMapping.getXmlField().setXpath("postal-code/text()"); } public void initializeDependentDescriptor() { MWCompositeEisDescriptor dependentDescriptor = getDependentDescriptor(); MWClass dependentClass = dependentDescriptor.getMWClass(); MWElementDeclaration dependentElement = this.getEmployeeSchema().element("employee").nestedElement("", "dependent-information").nestedElement("", "dependent"); dependentDescriptor.setSchemaContext(dependentElement); MWXmlDirectMapping firstNameMapping = (MWXmlDirectMapping) dependentDescriptor.addDirectMapping(dependentClass.attributeNamed("firstName")); firstNameMapping.getXmlField().setXpath("@first-name"); MWXmlDirectMapping lastNameMapping = (MWXmlDirectMapping) dependentDescriptor.addDirectMapping(dependentClass.attributeNamed("lastName")); lastNameMapping.getXmlField().setXpath("@last-name"); MWCompositeObjectMapping addressMapping = dependentDescriptor.addCompositeObjectMapping(dependentClass.attributeNamed("address")); addressMapping.getXmlField().setXpath("address"); addressMapping.setReferenceDescriptor(this.getAddressDescriptor()); MWCompositeObjectMapping phoneNumberMapping = dependentDescriptor.addCompositeObjectMapping(dependentClass.attributeNamed("phoneNumber")); phoneNumberMapping.getXmlField().setXpath("phone-no"); phoneNumberMapping.setReferenceDescriptor(this.getPhoneNumberDescriptor()); } public void initializeEmployeeDescriptor() { MWRootEisDescriptor employeeDescriptor = getEmployeeDescriptor(); employeeDescriptor.addInterfaceAliasPolicy(); MWClass interfaceAlias = typeNamed("org.eclipse.persistence.tools.workbench.test.models.contact.Person"); ((MWDescriptorInterfaceAliasPolicy) employeeDescriptor.getInterfaceAliasPolicy()).setInterfaceAlias(interfaceAlias); MWClass employeeClass = employeeDescriptor.getMWClass(); MWElementDeclaration employeeElement = this.getEmployeeSchema().element("employee"); employeeDescriptor.setSchemaContext(employeeElement); MWEisTransactionalPolicy transactionalPolicy = (MWEisTransactionalPolicy) employeeDescriptor.getTransactionalPolicy(); transactionalPolicy.setConformResultsInUnitOfWork(true); transactionalPolicy.getRefreshCachePolicy().setDisableCacheHits(true); transactionalPolicy.getRefreshCachePolicy().setAlwaysRefreshCache(true); MWXmlPrimaryKeyPolicy primaryKeyPolicy = transactionalPolicy.getPrimaryKeyPolicy(); primaryKeyPolicy.addPrimaryKey("@id"); MWEisQueryManager queryManager = (MWEisQueryManager) employeeDescriptor.getQueryManager(); MWEisInteraction readObjectInteraction = queryManager.getReadObjectInteraction(); readObjectInteraction.setFunctionName("readEmployeeById"); readObjectInteraction.addInputArgument("id", "@id"); MWXmlDirectMapping idMapping = (MWXmlDirectMapping) employeeDescriptor.addDirectMapping(employeeClass.attributeNamed("id")); idMapping.getXmlField().setXpath("@id"); MWXmlDirectMapping firstNameMapping = (MWXmlDirectMapping) employeeDescriptor.addDirectMapping(employeeClass.attributeNamed("firstName")); firstNameMapping.getXmlField().setXpath("personal-information/@first-name"); MWXmlDirectMapping lastNameMapping = (MWXmlDirectMapping) employeeDescriptor.addDirectMapping(employeeClass.attributeNamed("lastName")); lastNameMapping.getXmlField().setXpath("personal-information/@last-name"); MWXmlDirectMapping genderMapping = (MWXmlDirectMapping) employeeDescriptor.addDirectMapping(employeeClass.attributeNamed("gender")); genderMapping.getXmlField().setXpath("personal-information/@gender"); MWObjectTypeConverter genderConverter = genderMapping.setObjectTypeConverter(); genderConverter.setAttributeType(new MWTypeDeclaration(genderConverter, genderMapping.typeNamed("java.lang.String"))); try { genderConverter.addValuePair("F", "female"); genderConverter.addValuePair("M", "male"); } catch (ConversionValueException cve) {/* shouldn't happen here */} genderConverter.setDefaultAttributeValue("male"); MWXmlTransformationMapping normalHoursMapping = (MWXmlTransformationMapping) employeeDescriptor.addTransformationMapping(employeeClass.attributeNamed("normalHours")); normalHoursMapping.setAttributeTransformer(normalHoursMapping.typeFor(NormalHoursTransformer.class)); normalHoursMapping.addFieldTransformerAssociation("working-hours/start-time/text()", normalHoursMapping.typeFor(NormalHoursTransformer.class)); normalHoursMapping.addFieldTransformerAssociation("working-hours/end-time/text()", normalHoursMapping.typeFor(NormalHoursTransformer.class)); //TODO proxy indirection, when runtime supports it // normalHoursMapping.setUseProxyIndirection(); MWXmlDirectCollectionMapping responsibilitiesMapping = (MWXmlDirectCollectionMapping) employeeDescriptor.addDirectCollectionMapping(employeeClass.attributeNamed("responsibilities")); responsibilitiesMapping.getXmlField().setXpath("responsibility/text()"); MWCompositeObjectMapping addressMapping = employeeDescriptor.addCompositeObjectMapping(employeeClass.attributeNamed("address")); addressMapping.getXmlField().setXpath("contact-information/address"); addressMapping.setReferenceDescriptor(this.getAddressDescriptor()); MWCompositeCollectionMapping phoneNumbersMapping = employeeDescriptor.addCompositeCollectionMapping(employeeClass.attributeNamed("phoneNumbers")); phoneNumbersMapping.setReferenceDescriptor(this.getPhoneNumberDescriptor()); phoneNumbersMapping.getXmlField().setXpath("contact-information/phone"); ((MWMapContainerPolicy) phoneNumbersMapping.getContainerPolicy()).setKeyMethod(this.getPhoneNumberDescriptor().getMWClass().methodWithSignature("getType()")); MWCompositeCollectionMapping dependentsMapping = employeeDescriptor.addCompositeCollectionMapping(employeeClass.attributeNamed("dependents")); dependentsMapping.setReferenceDescriptor(this.getDependentDescriptor()); dependentsMapping.getXmlField().setXpath("dependent-information/dependent"); MWEisOneToOneMapping managerMapping = employeeDescriptor.addEisOneToOneMapping(employeeClass.attributeNamed("manager")); managerMapping.setReferenceDescriptor(this.getEmployeeDescriptor()); managerMapping.addFieldPair("manager/@first-name", "personal-information/@first-name"); managerMapping.addFieldPair("manager/@last-name", "personal-information/@last-name"); managerMapping.setUseValueHolderIndirection(); managerMapping.setUseDescriptorReadObjectInteraction(false); managerMapping.getSelectionInteraction().setFunctionName("selectManager"); //TODO proxy indirection, when runtime supports it // managerMapping.setUseProxyIndirection(); } public void initializePhoneNumberDescriptor() { MWCompositeEisDescriptor phoneNumberDescriptor = getPhoneNumberDescriptor(); MWClass phoneNumberClass = phoneNumberDescriptor.getMWClass(); MWComplexTypeDefinition phoneNumberType = this.getEmployeeSchema().complexType("phone-type"); phoneNumberDescriptor.setSchemaContext(phoneNumberType); MWXmlDirectMapping typeMapping = (MWXmlDirectMapping) phoneNumberDescriptor.addDirectMapping(phoneNumberClass.attributeNamed("type")); typeMapping.getXmlField().setXpath("@type"); MWXmlDirectMapping areaCodeMapping = (MWXmlDirectMapping) phoneNumberDescriptor.addDirectMapping(phoneNumberClass.attributeNamed("areaCode")); areaCodeMapping.getXmlField().setXpath("area-code/text()"); areaCodeMapping.getXmlField().setTyped(true); MWXmlDirectMapping numberMapping = (MWXmlDirectMapping) phoneNumberDescriptor.addDirectMapping(phoneNumberClass.attributeNamed("number")); numberMapping.getXmlField().setXpath("number/text()"); numberMapping.getXmlField().setTyped(true); } public void initializeProjectDescriptor() { MWRootEisDescriptor projectDescriptor = this.getProjectDescriptor(); MWClass projectClass = projectDescriptor.getMWClass(); MWComplexTypeDefinition projectComplexType = this.getProjectSchema().complexType("project-type"); MWElementDeclaration projectElement = this.getProjectSchema().element("project"); projectDescriptor.addInheritancePolicy(); MWEisDescriptorInheritancePolicy inheritancePolicy = (MWEisDescriptorInheritancePolicy) projectDescriptor.getInheritancePolicy(); inheritancePolicy.setIsRoot(true); MWXmlClassIndicatorFieldPolicy classIndicatorPolicy = (MWXmlClassIndicatorFieldPolicy) inheritancePolicy.getClassIndicatorPolicy(); classIndicatorPolicy.setUseXSIType(true); MWClassIndicatorValue classIndicatorValue = classIndicatorPolicy.getClassIndicatorValueForDescriptor(projectDescriptor); classIndicatorValue.setInclude(true); classIndicatorValue.setIndicatorValue("project"); projectDescriptor.setSchemaContext(projectComplexType); projectDescriptor.setDefaultRootElement(projectElement); MWEisTransactionalPolicy transactionalPolicy = (MWEisTransactionalPolicy) projectDescriptor.getTransactionalPolicy(); transactionalPolicy.setConformResultsInUnitOfWork(true); transactionalPolicy.getRefreshCachePolicy().setDisableCacheHits(true); transactionalPolicy.getRefreshCachePolicy().setAlwaysRefreshCache(true); MWXmlPrimaryKeyPolicy primaryKeyPolicy = transactionalPolicy.getPrimaryKeyPolicy(); primaryKeyPolicy.addPrimaryKey("id/text()"); MWXmlDirectMapping idMapping = (MWXmlDirectMapping) projectDescriptor.addDirectMapping(projectClass.attributeNamed("id")); idMapping.getXmlField().setXpath("id/text()"); MWXmlDirectMapping nameMapping = (MWXmlDirectMapping) projectDescriptor.addDirectMapping(projectClass.attributeNamed("name")); nameMapping.getXmlField().setXpath("name/text()"); MWXmlDirectMapping descriptionMapping = (MWXmlDirectMapping) projectDescriptor.addDirectMapping(projectClass.attributeNamed("description")); descriptionMapping.getXmlField().setXpath("description/text()"); MWXmlDirectMapping versionMapping = (MWXmlDirectMapping) projectDescriptor.addDirectMapping(projectClass.attributeNamed("version")); versionMapping.getXmlField().setXpath("version/text()"); MWXmlDirectMapping endDateMapping = (MWXmlDirectMapping) projectDescriptor.addDirectMapping(projectClass.attributeNamed("endDate")); endDateMapping.getXmlField().setXpath("end-date/text()"); } /** These must be done after descriptors are generally set up */ public void initializeReferenceMappings() { MWRootEisDescriptor employeeDescriptor = getEmployeeDescriptor(); MWClass employeeClass = employeeDescriptor.getMWClass(); MWRootEisDescriptor projectDescriptor = this.getProjectDescriptor(); MWClass projectClass = projectDescriptor.getMWClass(); MWEisOneToManyMapping projectsMapping = employeeDescriptor.addEisOneToManyMapping(employeeClass.attributeNamed("projects")); projectsMapping.setReferenceDescriptor(this.getProjectDescriptor()); projectsMapping.addFieldPair("projects/project-id/text()", "id/text()"); projectsMapping.setUseTransparentIndirection(); projectsMapping.getSelectionInteraction().setFunctionName("selectProjects"); projectsMapping.getDeleteAllInteraction().setFunctionName("deleteAllProjects"); projectsMapping.setPrivateOwned(true); MWEisOneToOneMapping teamLeaderMapping = projectDescriptor.addEisOneToOneMapping(projectClass.attributeNamed("teamLeader")); teamLeaderMapping.setReferenceDescriptor(this.getEmployeeDescriptor()); teamLeaderMapping.addFieldPair("team-leader/@employee-id", "@id"); teamLeaderMapping.setUseValueHolderIndirection(); teamLeaderMapping.setUseDescriptorReadObjectInteraction(true); MWEisOneToManyMapping teamMembersMapping = projectDescriptor.addEisOneToManyMapping(projectClass.attributeNamed("teamMembers")); teamMembersMapping.setReferenceDescriptor(this.getEmployeeDescriptor()); teamMembersMapping.setForeignKeysOnSource(); teamMembersMapping.getForeignKeyGroupingElement().setXpath("team-members"); teamMembersMapping.addFieldPair("team-members/employee-id/text()", "@id"); teamMembersMapping.setUseTransparentIndirection(); teamMembersMapping.getSelectionInteraction().setFunctionName("selectTeamMembers"); } public MWCompositeEisDescriptor getAddressDescriptor() { return (MWCompositeEisDescriptor) xmlDescriptorWithShortName("Address"); } public MWRootEisDescriptor getLargeProjectDescriptor() { return (MWRootEisDescriptor) xmlDescriptorWithShortName("LargeProject"); } public MWCompositeEisDescriptor getDependentDescriptor() { return (MWCompositeEisDescriptor) xmlDescriptorWithShortName("Dependent"); } public MWRootEisDescriptor getEmployeeDescriptor() { return (MWRootEisDescriptor) xmlDescriptorWithShortName("Employee"); } public MWCompositeEisDescriptor getPhoneNumberDescriptor() { return (MWCompositeEisDescriptor) xmlDescriptorWithShortName("PhoneNumber"); } public MWRootEisDescriptor getProjectDescriptor() { return (MWRootEisDescriptor) xmlDescriptorWithShortName("Project"); } public MWXmlSchema getEmployeeSchema() { return this.getProject().getSchemaRepository().getSchema("eis-employee.xsd"); } public MWXmlSchema getProjectSchema() { return this.getProject().getSchemaRepository().getSchema("eis-project.xsd"); } }