/******************************************************************************* * 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.mappingsmodel; import java.io.File; import java.util.Iterator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.eis.EISLogin; import org.eclipse.persistence.internal.helper.ConversionManager; import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl; import org.eclipse.persistence.mappings.DatabaseMapping; import org.eclipse.persistence.mappings.DirectCollectionMapping; import org.eclipse.persistence.oxm.XMLLogin; import org.eclipse.persistence.queries.DataModifyQuery; import org.eclipse.persistence.queries.DatabaseQuery; import org.eclipse.persistence.sessions.DatabaseSession; import org.eclipse.persistence.sessions.DatasourceLogin; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.sessions.factories.XMLProjectReader; import org.eclipse.persistence.sessions.factories.XMLProjectWriter; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProject; import org.eclipse.persistence.tools.workbench.test.models.projects.MultipleTableProject; import org.eclipse.persistence.tools.workbench.test.utility.TestTools; import org.eclipse.persistence.tools.workbench.utility.ClassTools; import org.eclipse.persistence.tools.workbench.utility.diff.Diff; import org.eclipse.persistence.tools.workbench.utility.diff.DiffEngine; import org.eclipse.persistence.tools.workbench.utility.io.FileTools; public class DeploymentXMLTests extends TestCase { protected DiffEngine diffEngine; public static Test suite() { TestTools.setUpJUnitThreadContextClassLoader(); return new TestSuite(DeploymentXMLTests.class); } public DeploymentXMLTests(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); this.diffEngine = MappingsModelTestTools.buildRuntimeDeploymentXmlDiffEngine(); } protected void tearDown() throws Exception { TestTools.clear(this); super.tearDown(); } private void verifyDeploymentXML(MWProject mwProject) throws Exception { Project originalProject = mwProject.buildRuntimeProject(); for (Iterator stream = originalProject.getOrderedDescriptors().iterator(); stream.hasNext(); ) { ClassDescriptor descriptor = (ClassDescriptor) stream.next(); if (descriptor.getAmendmentClassName() != null) { descriptor.setAmendmentClass(ConversionManager.loadClass(descriptor.getAmendmentClassName())); descriptor.applyAmendmentMethod(); } } File deploymentXmlFile = tempFile(originalProject); // Write the XML XMLProjectWriter.write(deploymentXmlFile.getAbsolutePath(), originalProject); // Read the XML Project project = XMLProjectReader.read(deploymentXmlFile.getAbsolutePath(), this.getClass().getClassLoader()); forceLazyIntialization(project); Diff diff = this.diffEngine.diff(project, originalProject); assertTrue(diff.getDescription(), diff.identical()); DatasourceLogin login = (DatasourceLogin) project.getDatasourceLogin(); if (login instanceof EISLogin) { DatabaseSessionImpl session = (DatabaseSessionImpl) project.createDatabaseSession(); session.dontLogMessages(); //hard to login since I don't know how to define a url for eis connections //This will do, initialization is what we want to test anyway. session.initializeDescriptors(); } else { if ( ! (login instanceof XMLLogin)) { // don't munge an XML project - it doesn't use a Connector login.setConnector(mwProject.getDatabase().getDeploymentLoginSpec().buildConnector()); } loginWithDeploymentXml(project); project.getDescriptors(); } } private void forceLazyIntialization(Project project) { project.getDescriptors(); for (Iterator stream = project.getDescriptors().keySet().iterator(); stream.hasNext(); ) { ClassDescriptor descriptor = ((ClassDescriptor) project.getDescriptors().get(stream.next())); for (Iterator mappings = descriptor.getMappings().iterator(); mappings.hasNext(); ) { DatabaseMapping mapping = (DatabaseMapping) mappings.next(); if (mapping.isManyToManyMapping()) { DataModifyQuery query = ((DataModifyQuery) ClassTools.getFieldValue(mapping, "insertQuery")); query.getSelectionCriteria(); query = ((DataModifyQuery) ClassTools.getFieldValue(mapping, "deleteQuery")); query.getSelectionCriteria(); query = ((DataModifyQuery) ClassTools.invokeMethod(mapping, "getDeleteAllQuery")); query.getSelectionCriteria(); } else if (mapping.isDirectCollectionMapping()) { //runtime likes to lazy initialize this one so it gets lazy initialized //when writing out the deployment xml, then it purposefully //doesn't get set when reading the deployment xml. //see ObjectPersistenceXmlProject.buildDatabaseQueryDescriptor selectionCriteria mapping ((DirectCollectionMapping) mapping).getSelectionQuery().getSelectionCriteria(); } } for (Iterator queries = descriptor.getQueryManager().getAllQueries().iterator(); queries.hasNext(); ) { DatabaseQuery query = (DatabaseQuery) queries.next(); query.getSelectionCriteria(); } } } private void loginWithDeploymentXml(Project runtimeProject) throws Exception { DatabaseSession session = runtimeProject.createDatabaseSession(); session.dontLogMessages(); // session.logMessages(); session.login(); // this will verify the mappings session.logout(); } private File tempFile(Project project) { return this.tempFile(project.getName()); } private File tempFile(String projectName) { return new File(FileTools.emptyTemporaryDirectory(ClassTools.shortClassNameForObject(this) + "." + this.getName()), projectName + ".xml"); } /* public void testComplexInheritanceSystem() throws Exception { MWProject bldrProject = new ComplexInheritanceProject().getProject(); verifyDeploymentXML(bldrProject); } public void testContactProject() throws Exception { MWProject bldrProject = new SimpleContactProject().getProject(); verifyDeploymentXML(bldrProject); } public void testCrimeSceneProject() throws Exception { MWProject bldrProject = new CrimeSceneProject().getProject(); verifyDeploymentXML(bldrProject); } public void testEmployeeDemo() throws Exception { MWProject bldrProject = new EmployeeProject().getProject(); verifyDeploymentXML(bldrProject); } //this fails because of runtime bug #3684981 public void testEmployeeEisDemo() throws Exception { MWProject mwProject = new EmployeeEisProject().getProject(); verifyDeploymentXML(mwProject); } public void testEmployeeOXDemo() throws Exception { MWProject mwProject = new EmployeeOXProject().getProject(); verifyDeploymentXML(mwProject); } public void testEmployeeJaxbProject() throws Exception { MWProject bldrProject = new EmployeeJAXBProject().getProject(); verifyDeploymentXML(bldrProject); } public void testInsuranceDemo() throws Exception { MWProject bldrProject = new InsuranceProject().getProject(); verifyDeploymentXML(bldrProject); } public void testLockingPolicyProject() throws Exception { MWProject bldrProject = new LockingPolicyProject().getProject(); verifyDeploymentXML(bldrProject); } public void testQueryProject() throws Exception { MWProject mwProject = new QueryProject().getProject(); verifyDeploymentXML(mwProject); } public void testPhoneCompanyUsesSharedAggregatesProject() throws Exception { MWProject mwProject = new PhoneCompanyProject(true).getProject(); verifyDeploymentXML(mwProject); } public void testPhoneCompanyProject() throws Exception { MWProject mwProject = new PhoneCompanyProject(false).getProject(); verifyDeploymentXML(mwProject); } public void testComplexAggregateProject() throws Exception { MWProject mwProject = new ComplexAggregateProject().getProject(); verifyDeploymentXML(mwProject); } public void testReturningPolicyEisProject() throws Exception { MWProject mwProject = new ReturningPolicyEisProject().getProject(); verifyDeploymentXML(mwProject); } public void testReturningPolicyProject() throws Exception { MWProject mwProject = new ReturningPolicyProject().getProject(); verifyDeploymentXML(mwProject); } */ public void testMultipleTableProject() throws Exception { MWProject mwProject = new MultipleTableProject().getProject(); verifyDeploymentXML(mwProject); } }