| /* |
| * 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: |
| // rbarkhouse - 2009-11-16 14:08:13 - initial implementation |
| package org.eclipse.persistence.testing.oxm.dynamic; |
| |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.Method; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.persistence.dynamic.DynamicClassLoader; |
| import org.eclipse.persistence.dynamic.DynamicTypeBuilder; |
| import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl; |
| import org.eclipse.persistence.oxm.XMLRoot; |
| import org.eclipse.persistence.sessions.Project; |
| import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases; |
| |
| public class DynamicTestCases extends XMLMappingTestCases { |
| |
| private DynamicClassLoader dynamicClassLoader; |
| private Project dynamicTestProject; |
| |
| private ArrayList objectsAlreadyCheckedForEquality; |
| |
| private static final String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/dynamic/dynamic.xml"; |
| |
| private static final String EMPLOYEE_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XEmployee"; |
| private static final String ADDRESS_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XAddress"; |
| private static final String PHONE_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XPhoneNumber"; |
| private static final String EMAIL_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XEmail"; |
| private static final String SEC_CRED_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XSecurityCredential"; |
| private static final String ROOT_CLASS_NAME = "org.eclipse.persistence.testing.oxm.dynamic.XRoot"; |
| |
| public DynamicTestCases(String name) throws Exception { |
| super(name); |
| |
| ClassLoader sysClassLoader = Thread.currentThread().getContextClassLoader(); |
| dynamicClassLoader = new DynamicClassLoader(sysClassLoader); |
| |
| dynamicTestProject = DynamicTypeBuilder.loadDynamicProject(new DynamicTestProject(), null, dynamicClassLoader); |
| |
| setProject(dynamicTestProject); |
| setControlDocument(XML_RESOURCE); |
| } |
| |
| @Override |
| public Object getControlObject() { |
| try { |
| Object rootObj = newInstance(ROOT_CLASS_NAME); |
| |
| // ============= |
| |
| Object employeeObj = newInstance(EMPLOYEE_CLASS_NAME); |
| setValue(employeeObj, "name", "Jane Doe"); |
| |
| // ============= |
| |
| Object addressObj = newInstance(ADDRESS_CLASS_NAME); |
| setValue(addressObj, "street", "123 Fake Street"); |
| |
| setValue(addressObj, "owningEmployee", employeeObj); |
| |
| setValue(employeeObj, "address", addressObj); |
| |
| // ============= |
| |
| Object phoneObj1 = newInstance(PHONE_CLASS_NAME); |
| setValue(phoneObj1, "number", "123-4567"); |
| setValue(phoneObj1, "owningEmployee", employeeObj); |
| |
| Object phoneObj2 = newInstance(PHONE_CLASS_NAME); |
| setValue(phoneObj2, "number", "234-5678"); |
| setValue(phoneObj2, "owningEmployee", employeeObj); |
| |
| ArrayList phoneNumbers = new ArrayList(); |
| phoneNumbers.add(phoneObj1); |
| phoneNumbers.add(phoneObj2); |
| |
| setValue(employeeObj, "phoneNumbers", phoneNumbers); |
| |
| // ============= |
| |
| Object email1 = newInstance(EMAIL_CLASS_NAME); |
| setValue(email1, "id", "123"); |
| setValue(email1, "username", "jane.doe"); |
| setValue(email1, "domain", "eclipse.org"); |
| setValue(email1, "owningEmployee", employeeObj); |
| |
| Object email2 = newInstance(EMAIL_CLASS_NAME); |
| setValue(email2, "id", "456"); |
| setValue(email2, "username", "jdoe1972"); |
| setValue(email2, "domain", "rocketmail.com"); |
| setValue(email2, "owningEmployee", employeeObj); |
| |
| ArrayList emails = new ArrayList(); |
| emails.add(email1); |
| emails.add(email2); |
| |
| setValue(employeeObj, "emails", emails); |
| |
| // ============= |
| |
| Object secCred = newInstance(SEC_CRED_CLASS_NAME); |
| setValue(secCred, "id", "123"); |
| setValue(secCred, "zone", "17A"); |
| setValue(secCred, "keyNumber", "82347623847"); |
| |
| setValue(employeeObj, "securityCredential", secCred); |
| |
| setValue(secCred, "owningEmployee", employeeObj); |
| |
| // ============= |
| |
| setValue(rootObj, "employee", employeeObj); |
| setValue(rootObj, "emails", emails); |
| setValue(rootObj, "securityCredential", secCred); |
| |
| return rootObj; |
| } catch (Exception e) { |
| fail(e.getMessage()); |
| } |
| return null; |
| } |
| |
| private Object newInstance(String name) throws Exception { |
| Class<?> theClass = dynamicClassLoader.loadClass(name); |
| Constructor<?> constructor = theClass.getConstructors()[0]; |
| |
| return constructor.newInstance(); |
| } |
| |
| private void setValue(Object owner, String attributeName, Object value) throws Exception { |
| Method setMethod = owner.getClass().getMethod("set", String.class, Object.class); |
| setMethod.invoke(owner, attributeName, value); |
| } |
| |
| private Object getValue(Object owner, String attributeName) throws Exception { |
| Method getMethod = owner.getClass().getMethod("get", String.class); |
| Object value = getMethod.invoke(owner, attributeName); |
| return value; |
| } |
| |
| @Override |
| public void xmlToObjectTest(Object testObject) throws Exception { |
| log("\n**xmlToObjectTest**"); |
| log("Expected:"); |
| Object controlObject = getReadControlObject(); |
| if (null == controlObject) { |
| log((String) null); |
| } else { |
| log(controlObject.toString()); |
| } |
| log("Actual:"); |
| if (null == testObject) { |
| log((String) null); |
| } else { |
| log(testObject.toString()); |
| } |
| |
| if ((controlObject instanceof XMLRoot) && (testObject instanceof XMLRoot)) { |
| XMLRoot controlRoot = (XMLRoot) controlObject; |
| XMLRoot testRoot = (XMLRoot) testObject; |
| compareXMLRootObjects(controlRoot, testRoot); |
| } else { |
| objectsAlreadyCheckedForEquality = new ArrayList(); |
| compareDynamicObjects(controlObject, testObject); |
| } |
| } |
| |
| private void compareDynamicObjects(Object controlObject, Object testObject) throws Exception { |
| if (objectsAlreadyCheckedForEquality.contains(testObject)) { |
| // To handle cyclic relationships, only check each object once. |
| return; |
| } |
| |
| if (!(controlObject instanceof DynamicEntityImpl)) { |
| fail("controlObject [" + controlObject + "] was not an instance of DynamicEntityImpl."); |
| } |
| if (!(testObject instanceof DynamicEntityImpl)) { |
| fail("testObject [" + testObject + "] was not an instance of DynamicEntityImpl."); |
| } |
| |
| DynamicEntityImpl dynamicControl = (DynamicEntityImpl) controlObject; |
| DynamicEntityImpl dynamicTest = (DynamicEntityImpl) testObject; |
| |
| objectsAlreadyCheckedForEquality.add(testObject); |
| |
| if (dynamicControl.getType().getNumberOfProperties() != dynamicTest.getType().getNumberOfProperties()) { |
| fail("testObject and controlObject did not have the same number of properties."); |
| } |
| |
| List<String> propNames = dynamicControl.getType().getPropertiesNames(); |
| Iterator<String> it = propNames.iterator(); |
| while (it.hasNext()) { |
| String propName = it.next(); |
| |
| Object controlValue = getValue(dynamicControl, propName); |
| Object testValue = getValue(dynamicTest, propName); |
| |
| if ((testValue instanceof DynamicEntityImpl) && (controlValue instanceof DynamicEntityImpl)) { |
| compareDynamicObjects(controlValue, testValue); |
| } else if ((testValue instanceof List) && (controlValue instanceof List)) { |
| if ((((List) testValue).size()) != (((List) controlValue).size())) { |
| fail(dynamicControl.getType().getName() + " " + propName + ": testValue was " + testValue + " but controlValue was " + controlValue); |
| } |
| for (int i = 0; i < ((List) controlValue).size(); i++) { |
| compareDynamicObjects(((List) controlValue).get(i), ((List) testValue).get(i)); |
| } |
| } else { |
| if (testValue == null && controlValue == null) { |
| continue; |
| } |
| if (testValue == null && controlValue != null) { |
| fail(dynamicControl.getType().getName() + " " + propName + ": testValue was " + testValue + " but controlValue was " + controlValue); |
| } |
| if (testValue != null && controlValue == null) { |
| fail(dynamicTest.getType().getName() + " " + propName + ": testValue was " + testValue + " but controlValue was " + controlValue); |
| } |
| if (!testValue.equals(controlValue)) { |
| fail(propName + ": testValue was " + testValue + " but controlValue was " + controlValue); |
| } |
| } |
| } |
| } |
| |
| } |