blob: 1359e8acebba5ea6760f75464961832a28a798ef [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.jpql;
// Java imports
import java.util.*;
// TopLink imports
import org.eclipse.persistence.internal.sessions.AbstractSession;
// Domain imports
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.*;
/**
* <p>
* <b>Purpose</b>: Compare two objects
* <p>
* <b>Description</b>: This class compares the two objects passed. If they are
* collections it Iterates through them and compares the elements.
* <p>
* <b>Responsibilities</b>:
* <ul>
* <li> Compare two objects and return true/false
* </ul>
*/
public class JUnitDomainObjectComparer {
AbstractSession theSession;
public boolean compareObjects(Object obj1, Object obj2) {
if((obj1 == null) && (obj2 == null)) {
return true;
}
if((obj1 == null) || (obj2 == null)) {
return false;
}
if ((obj1 instanceof Collection) && !(obj2 instanceof Collection)) {
return compareObjects(obj2, (Collection)obj1);
} else if ( !(obj1 instanceof Collection) && (obj2 instanceof Collection)) {
return compareObjects(obj1, (Collection)obj2);
} else if ((obj1 instanceof Collection) && (obj2 instanceof Collection)) {
return compareObjects((Collection)obj1, (Collection)obj2);
} else {
if (getSession().compareObjects(obj1, obj2)) {
return true;
} else {
boolean areEqual = false;
if (JUnitTestCase.usesSOP()) {
// In SOP case the PhoneNumber may be read only from Employee's sopObject.
// That means that unless read-only attribute PhoneNumber.id is explicitly set (which never happens) it will stay null forever.
if ((obj1 instanceof PhoneNumber) && (obj2 instanceof PhoneNumber)) {
PhoneNumber phone1 = (PhoneNumber)obj1;
PhoneNumber phone2 = (PhoneNumber)obj2;
if (phone1.getId() == null && phone1.getOwner() != null && phone1.getOwner().getId() != null) {
// assign ownerId
phone1.setId(phone1.getOwner().getId());
areEqual = getSession().compareObjects(obj1, obj2);
// reset to the original state
phone1.setId(null);
} else if (phone2.getId() == null && phone2.getOwner() != null && phone2.getOwner().getId() != null) {
// assign ownerId
phone2.setId(phone2.getOwner().getId());
areEqual = getSession().compareObjects(obj1, obj2);
// reset to the original state
phone2.setId(null);
}
} else if ((obj1 instanceof Employee) && (obj2 instanceof Employee)) {
Employee emp1 = (Employee)obj1;
Employee emp2 = (Employee)obj2;
Collection<PhoneNumber> phoneNumbers1 = emp1.getPhoneNumbers();
Collection<PhoneNumber> phoneNumbers2 = emp2.getPhoneNumbers();
// compare PhoneNumbers so that PhoneNumber.id == null are worked around (see PhoneNumber case above)
if (compareObjects(phoneNumbers1, phoneNumbers2)) {
emp1.setPhoneNumbers(new ArrayList<PhoneNumber>());
emp2.setPhoneNumbers(new ArrayList<PhoneNumber>());
// now compare the rest
areEqual = getSession().compareObjects(obj1, obj2);
// reset to the original state
emp1.setPhoneNumbers(phoneNumbers1);
emp2.setPhoneNumbers(phoneNumbers2);
}
}
}
return areEqual;
}
}
}
public boolean compareObjects(Object domainObject1, Collection aCollection) {
Iterator itr = aCollection.iterator();
while (itr.hasNext()) {
Object domainObject2 = itr.next();
if (compareObjects(domainObject1, domainObject2)) {
return true;
}
}
return false;
}
public boolean compareObjects(Collection objects1, Collection objects2) {
boolean allMatched = true;
if (objects1.size() != objects2.size()) {
allMatched = false;
} /*else if (objects1.isEmpty() || objects2.isEmpty()) {
allMatched = false;
}*/
//Enumeration enum1 = objects1.elements();
Iterator itr1 = objects1.iterator();
while (itr1.hasNext()) {
Object obj1 = itr1.next();
if (obj1 == null) {
allMatched = allMatched & objects2.contains(null);
continue;
}
if(obj1.getClass().equals(Employee.class)){
Employee emp1 = (Employee)obj1;
Employee emp2 = findEmployeeByIdIn(emp1, objects2);
allMatched = allMatched && compareObjects(emp1, emp2);
}
if(obj1.getClass().equals(Project.class)){
Project proj1 = (Project)obj1;
Project proj2 = findProjectByIdIn(proj1, objects2);
allMatched = allMatched && compareObjects(proj1, proj2);
}
if(obj1.getClass().equals(LargeProject.class)){
Project proj1 = (Project)obj1;
Project proj2 = findProjectByIdIn(proj1, objects2);
allMatched = allMatched && compareObjects(proj1, proj2);
}
if(obj1.getClass().equals(PhoneNumber.class)){
PhoneNumber phone1 = (PhoneNumber)obj1;
PhoneNumber phone2 = findPhoneNumberIn(phone1, objects2);
allMatched = allMatched && compareObjects(phone1, phone2);
}
if(obj1.getClass().equals(String.class)){
allMatched = allMatched && objects2.contains(obj1);
}
}
return allMatched;
}
public PhoneNumber findPhoneNumberIn(PhoneNumber phone1, Collection phones){
Iterator itr = phones.iterator();
while (itr.hasNext()) {
PhoneNumber pTemp = (PhoneNumber)itr.next();
if ((pTemp != null) && pTemp.getNumber().equals(phone1.getNumber())) {
if(pTemp.getAreaCode().equals(phone1.getAreaCode())) {
if (pTemp.getOwner().getId().equals(phone1.getOwner().getId())) {
return pTemp;
}
}
}
}
return null;
}
public Project findProjectByIdIn(Project project, Collection projects){
Iterator itr = projects.iterator();
while (itr.hasNext()) {
Project pTemp = (Project)itr.next();
if ((pTemp != null) && pTemp.getId().equals(project.getId())) {
return pTemp;
}
}
return null;
}
public Employee findEmployeeByIdIn(Employee emp, Collection employees){
Iterator itr = employees.iterator();
while (itr.hasNext()) {
Employee eTemp = (Employee)itr.next();
if ((eTemp != null) && eTemp.getId().equals(emp.getId())) {
return eTemp;
}
}
return null;
}
public Address findAddressByIdIn(Address addr, Collection addresses){
Iterator itr = addresses.iterator();
while (itr.hasNext()) {
Address aTemp = (Address)itr.next();
if ((aTemp != null) && aTemp.getID() == addr.getID()) {
return aTemp;
}
}
return null;
}
public AbstractSession getSession() {
return theSession;
}
public void setSession(AbstractSession theSession) {
this.theSession = theSession;
}
}