/*******************************************************************************
 * Copyright (c) 1998, 2012 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:
 *     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;
    }

}
