/*
 * Copyright (c) 1998, 2018 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:
//     08/15/2008-1.0.1 Chris Delahunt
//       - 237545: List attribute types on OneToMany using @OrderBy does not work with attribute change tracking
package org.eclipse.persistence.testing.tests.distributedcache;

import org.eclipse.persistence.descriptors.changetracking.AttributeChangeTrackingPolicy;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.models.employee.domain.Child;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeProject;
import java.util.Collection;
import java.util.Iterator;

//Bugs 4458089 & 4454532
//adds one to the collection
public class OrderedListMergeTest extends DistributedCacheMergeTest {
    public OrderedListMergeTest(){
        super();
    }

    protected void modifyCollection(UnitOfWork uow, Object objectToModify) {
        Child newChildWC = (Child)uow.registerNewObject(newItemForCollection());
        ((Employee)objectToModify).children.add(newChildWC);
        newChildWC.parent = (Employee)objectToModify;
    }

    protected int getCollectionSize(Object rootObject) {
        return ((Employee)rootObject).children.size();
    }

    protected Object buildOriginalObject() {
        Employee emp = new Employee();
        emp.setFirstName("Sally");
        emp.setLastName("Hamilton");
        emp.setFemale();
        java.util.Vector children = new java.util.Vector();
        java.util.Calendar cal =java.util.Calendar.getInstance();

        Child child = new Child();
        child.setFirstName("Sarah");
        child.setLastName("Hamilton");
        cal.set(2005,8,8);
        child.setBirthday( new java.util.Date(cal.getTimeInMillis()) );
        child.setGender("Female");
        child.setParent(emp);
        children.add(child);


        child = new Child();
        child.setFirstName("Billy");
        child.setLastName("Hamilton");
        cal.set(2006,8,8);
        child.setBirthday( new java.util.Date(cal.getTimeInMillis()) );
        child.setGender("Male");
        child.setParent( emp );
        children.add(child);

        child = new Child();
        child.setFirstName("Samantha");
        child.setLastName("Hamilton");
        cal.set(2007,8,8);
        child.setBirthday(new java.util.Date(cal.getTimeInMillis()) );
        child.setGender("Female");
        child.setParent(emp);
        children.add(child);

        emp.children = children;
        return emp;
    }

    protected Object newItemForCollection() {
        Child child = new Child();
        child.firstName = "Susy";
        child.lastName = "Hamilton";
        child.birthday = new java.util.Date(System.currentTimeMillis());
        child.gender = "Female";
        return child;
    }

    protected Project getNewProject() {
        Project empProject = new EmployeeProject();
        empProject.getDescriptor(Employee.class).setObjectChangePolicy(new AttributeChangeTrackingPolicy());
        return empProject;
    }

    protected boolean compareObjectsCollections(Object object1, Object object2){
        if ( getCollectionSize(object1)!=getCollectionSize(object2) ){
            return false;
        }
        return compareCollections( ((Employee)object1).children, ((Employee)object2).children );
    }

    protected boolean compareCollections(Collection col1, Collection col2){
        boolean comparison=true;
        Iterator i1 = col1.iterator();
        Iterator i2 = col2.iterator();
        while (comparison && i1.hasNext()){
            Object o = i1.next();
            comparison = o.equals(i2.next());
        }
        return comparison;
    }

}
