/******************************************************************************* * 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.util.Iterator; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWCachingPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWAggregateDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWRelationalClassIndicatorFieldPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWRelationalDescriptorInheritancePolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWObjectTypeConverter; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWAggregateMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWAggregatePathToColumn; import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWDirectToFieldMapping; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProject; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProject; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; public class SimpleAggregateProject extends RelationalTestProject { public static MWRelationalProject emptyProject() { MWRelationalProject project = new MWRelationalProject("SimpleAggregate", spiManager(), mySqlPlatform()); // defaults policy project.getDefaultsPolicy().getCachingPolicy().setExistenceChecking(MWCachingPolicy.EXISTENCE_CHECKING_CHECK_CACHE); project.getDefaultsPolicy().getCachingPolicy().setCacheType(MWCachingPolicy.CACHE_TYPE_WEAK_WITH_SOFT_SUBCACHE); return project; } @Override protected MWProject buildEmptyProject() { return emptyProject(); } public MWAggregateDescriptor getAddressDescriptor() { return (MWAggregateDescriptor) getProject().descriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.Address"); } public MWAggregateDescriptor getAddressSubClassDescriptor() { return (MWAggregateDescriptor) getProject().descriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.AddressSubClass"); } public MWTableDescriptor getPersonDescriptor() { return (MWTableDescriptor) getProject().descriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.Person"); } public void initializeAddressDescriptor() { MWAggregateDescriptor descriptor = getAddressDescriptor(); descriptor.addInheritancePolicy(); MWRelationalDescriptorInheritancePolicy inheritancePolicy = (MWRelationalDescriptorInheritancePolicy) descriptor.getInheritancePolicy(); ((MWRelationalClassIndicatorFieldPolicy) inheritancePolicy.getClassIndicatorPolicy()).setClassNameIsIndicator(true); //direct to field mappings MWDirectToFieldMapping cityMapping = addDirectMapping(descriptor, "city"); cityMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping stateMapping = addDirectMapping(descriptor, "state"); stateMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping streetMapping = addDirectMapping(descriptor, "street"); streetMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping zipMapping = addDirectMapping(descriptor, "zip"); zipMapping.setUsesMethodAccessing(true); } public void initializeAddressSubClassDescriptor() { MWAggregateDescriptor descriptor = getAddressSubClassDescriptor(); //direct to field mappings MWDirectToFieldMapping countryMapping = addDirectMapping(descriptor, "country"); countryMapping.setUsesMethodAccessing(true); descriptor.addInheritancePolicy(); MWRelationalDescriptorInheritancePolicy inheritancePolicy = (MWRelationalDescriptorInheritancePolicy) descriptor.getInheritancePolicy(); inheritancePolicy.setParentDescriptor(getAddressDescriptor()); inheritancePolicy.setReadSubclassesOnQuery(false); } public void initializeAddressTable() { MWTable table = database().addTable("ADDRESS"); addField(table, "CITY", "varchar", 20); addField(table, "COUNTRY", "varchar", 20); addPrimaryKeyField(table, "ID", "decimal", 20); addField(table, "P_CODE", "varchar", 20); addField(table, "STATE", "varchar", 20); addField(table, "STREET", "varchar", 20); addField(table, "TYPE", "varchar", 20); } @Override protected void initializeDatabase() { super.initializeDatabase(); this.initializeSequenceTable(); this.initializeAddressTable(); this.initializePersonTable(); } @Override protected void initializeDescriptors() { super.initializeDescriptors(); this.addAggregateDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.Address"); this.addAggregateDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.AddressSubClass"); this.addDescriptorForTypeNamed("org.eclipse.persistence.tools.workbench.test.models.simpleaggregate.Person"); this.initializeAddressDescriptor(); this.initializeAddressSubClassDescriptor(); this.initializePersonDescriptor(); } public void initializePersonDescriptor(){ MWTableDescriptor descriptor = getPersonDescriptor(); MWTable table = database().tableNamed("PERSON"); descriptor.setPrimaryTable(table); descriptor.getCachingPolicy().setCacheType(MWCachingPolicy.CACHE_TYPE_FULL); descriptor.getCachingPolicy().setCacheSize(100); //multi-table policy descriptor.addMultiTableInfoPolicy(); MWTable addressTable = tableNamed("ADDRESS"); descriptor.addAssociatedTable(addressTable); // Mappings //Direct to Field descriptor.addQueryKey("email", table.columnNamed("ADDRESS")); MWDirectToFieldMapping ageMapping = addDirectMapping(descriptor, "age", table, "AGE"); ageMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping firstNameMapping = addDirectMapping(descriptor, "firstName", table, "F_NAME"); firstNameMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping idMapping = addDirectMapping(descriptor, "id", table, "ID"); idMapping.setUsesMethodAccessing(true); MWDirectToFieldMapping lastNameMapping = addDirectMapping(descriptor, "lastName", table, "L_NAME"); lastNameMapping.setUsesMethodAccessing(true); //object type mappings MWDirectToFieldMapping genderMapping = addDirectMapping(descriptor, "gender", table, "GENDER"); MWObjectTypeConverter converter = genderMapping.setObjectTypeConverter(); genderMapping.setUsesMethodAccessing(true); //TODO need to test with attribute and data types of something other than String try { converter.addValuePair("F", "Female"); converter.addValuePair("M", "Male"); } catch (MWObjectTypeConverter.ConversionValueException cve) { /*** shouldn't happen ***/ } //aggregate mappings MWAggregateMapping addressMapping = descriptor.addAggregateMapping(descriptor.getMWClass().attributeNamed("address")); addressMapping.setUsesMethodAccessing(true); addressMapping.setReferenceDescriptor(getAddressSubClassDescriptor()); Iterator fieldAssociations = CollectionTools.sort(addressMapping.pathsToFields()).iterator(); String[] fieldNames = new String[] {"CITY", "STATE", "STREET", "P_CODE", "TYPE", "COUNTRY"}; for(int i=0; i<fieldNames.length; i++) { MWAggregatePathToColumn association = (MWAggregatePathToColumn) fieldAssociations.next(); association.setColumn(addressTable.columnNamed(fieldNames[i])); } } public void initializePersonTable() { MWTable table = database().addTable("PERSON"); addField(table, "ADDRESS", "varchar", 50); addField(table, "AGE", "decimal", 10); addField(table, "F_NAME", "varchar", 20); addField(table, "GENDER", "varchar", 20); addPrimaryKeyField(table, "ID", "decimal", 15); addField(table, "L_NAME", "varchar", 20); } }