/*******************************************************************************
* 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.mappingsplugin;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWColumn;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWDatabase;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWReference;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor;
import org.eclipse.persistence.tools.workbench.mappingsmodel.generation.MWDescriptorGenerator;
import org.eclipse.persistence.tools.workbench.mappingsmodel.generation.MWRelationshipHolder;
import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProject;
import org.eclipse.persistence.tools.workbench.platformsmodel.DatabasePlatform;
import org.eclipse.persistence.tools.workbench.platformsmodel.DatabasePlatformRepository;
import org.eclipse.persistence.tools.workbench.test.mappingsmodel.MappingsModelTestTools;
import org.eclipse.persistence.tools.workbench.test.models.projects.TestDatabases;
import org.eclipse.persistence.tools.workbench.test.utility.TestTools;
import org.eclipse.persistence.tools.workbench.utility.ClassTools;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
public class DescriptorGenerationTests
extends TestCase
{
private MWRelationalProject project;
public static Test suite() {
return new TestSuite(DescriptorGenerationTests.class);
}
public DescriptorGenerationTests(String name)
{
super(name);
}
// **************** test set up, tear down stuff **************************
protected void setUp() throws Exception {
super.setUp();
buildProject();
}
protected void tearDown() throws Exception {
TestTools.clear(this);
super.tearDown();
}
/**
* builds a project with tables only
*/
private void buildProject()
{
DatabasePlatform oraclePlatform = DatabasePlatformRepository.getDefault().platformNamed("Oracle");
String projectName = ClassTools.shortClassNameForObject(this);
this.project = new MWRelationalProject(projectName, MappingsModelTestTools.buildSPIManager(), oraclePlatform);
// database
MWDatabase database = this.project.getDatabase();
database.setDeploymentLoginSpec(TestDatabases.oracleLoginSpec(database));
// customer table
MWTable customerTable = database.addTable("CUSTOMER");
MWColumn customerIdField = customerTable.addColumn("ID");
customerIdField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
customerIdField.setPrimaryKey(true);
MWColumn customerNameField = customerTable.addColumn("NAME");
customerNameField.setDatabaseType(oraclePlatform.databaseTypeNamed("VARCHAR2"));
// item table
MWTable itemTable = database.addTable("ITEM");
MWColumn itemIdField = itemTable.addColumn("ID");
itemIdField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
itemIdField.setPrimaryKey(true);
MWColumn itemDescriptionField = itemTable.addColumn("DESCRIPTION");
itemDescriptionField.setDatabaseType(oraclePlatform.databaseTypeNamed("VARCHAR2"));
MWColumn itemNameField = itemTable.addColumn("NAME");
itemNameField.setDatabaseType(oraclePlatform.databaseTypeNamed("VARCHAR2"));
// order table
MWTable orderTable = database.addTable("ORDER");
MWColumn orderIdField = orderTable.addColumn("ID");
orderIdField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
orderIdField.setPrimaryKey(true);
MWColumn orderQuantityField = orderTable.addColumn("QUANTITY");
orderQuantityField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
MWColumn orderShippingAddressField = orderTable.addColumn("SHIPPING_ADDRESS");
orderShippingAddressField.setDatabaseType(oraclePlatform.databaseTypeNamed("VARCHAR2"));
MWColumn orderCustomerIdField = orderTable.addColumn("CUSTOMER_ID");
orderCustomerIdField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
MWColumn orderItemIdField = orderTable.addColumn("ITEM_ID");
orderItemIdField.setDatabaseType(oraclePlatform.databaseTypeNamed("NUMBER"));
// order -> customer reference
MWReference orderCustomerReference = orderTable.addReference("ORDER_CUSTOMER", customerTable);
orderCustomerReference.addColumnPair(orderCustomerIdField, customerIdField);
// order -> item reference
MWReference orderItemReference = orderTable.addReference("ORDER_ITEM", itemTable);
orderItemReference.addColumnPair(orderItemIdField, itemIdField);
}
// **************** convenience *******************************************
private String getPackageName()
{
return "foo";
}
private MWTable getOrderTable()
{
return this.project.getDatabase().tableNamed("ORDER");
}
// **************** actual test methods ***********************************
public void testGenerateNormalDescriptorsAndClassDefs()
{
generateDescriptors();
commonTests();
}
// **************** guts of the tests *************************************
private void commonTests()
{
assertTrue("Descriptors were not generated.", this.project.descriptorsSize() == 3);
Collection relationshipMappings = new Vector();
for (Iterator it = this.project.mappingDescriptors(); it.hasNext(); )
CollectionTools.addAll(relationshipMappings, ((MWMappingDescriptor) it.next()).tableReferenceMappings());
assertTrue("Relationships were not generated.", relationshipMappings.size() == 3);
}
// **************** generating the descriptors ****************************
private void generateDescriptors()
{
MWDescriptorGenerator generator = new MWDescriptorGenerator();
generator.setGenerateBidirectionalRelationships(true);
generator.setGenerateMethodAccessors(true);
generator.setPackageName(getPackageName());
generator.setProject(this.project);
generator.setRelationshipsToCreate(relationshipsToCreate());
generator.setTables(CollectionTools.collection(this.project.getDatabase().tables()));
generator.generateClassesAndDescriptors();
}
private Collection relationshipsToCreate()
{
Collection relationships = new Vector();
// Customer - Order: 1-M
MWRelationshipHolder customerToOrder = new MWRelationshipHolder(getOrderTable().referenceNamed("ORDER_CUSTOMER"), true);
customerToOrder.setOneToMany();
relationships.add(customerToOrder);
// Order - Customer: 1-1
MWRelationshipHolder orderToCustomer = new MWRelationshipHolder(getOrderTable().referenceNamed("ORDER_CUSTOMER"), false);
orderToCustomer.setOneToOne();
relationships.add(orderToCustomer);
// Order - Item: 1-1
MWRelationshipHolder orderToItem = new MWRelationshipHolder(getOrderTable().referenceNamed("ORDER_ITEM"), false);
orderToItem.setOneToOne();
relationships.add(orderToItem);
return relationships;
}
}