/*******************************************************************************
 * Copyright (c) 1998, 2013 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.testing.tests.queries;

import java.util.Vector;

import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.queries.*;

/**
 * Bug 5501751: USING GETALLOWINGNULL() WITH ADDPARTIALATTRIBUTE() BROKEN IN 10.1.3
 */
@SuppressWarnings("deprecation")
public class FourPartialAttributeTestsWithJoinAttribute extends TestCase {

    static String lastName = "PartialAttributeTest";
    Vector[] results = new Vector[4];
    
    public FourPartialAttributeTestsWithJoinAttribute() {
        setDescription("A partial attribute query where the partial attribute is also joined - 4 tests: all combinations of (inner join vs outer join) and (get(address) vs get(address).get(city)).");
    }

    public void setup() {
        // remove Employees with the lastName in case they exist.
        cleanup();
        
        // create two Employees with the lastName: one with an address another without.
        Employee empA = new Employee();
        empA.setLastName(lastName);
        empA.setFirstName("A");
        
        Address address = new Address();
        address.setCountry("Canada");
        address.setCity("Ottawa");
        address.setStreet("O'Connor");
        // Employee A has Address
        empA.setAddress(address);
        
        // Employee B doesn't have an Address
        Employee empB = new Employee();
        empB.setLastName(lastName);
        empB.setFirstName("B");
        
        // save the created objects
        UnitOfWork uow = getSession().acquireUnitOfWork();
        uow.registerNewObject(empA);
        uow.registerNewObject(empB);
        uow.commit();
        
        // clear the cache
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }

    public void test() {
        ReadAllQuery[] queries = {createQuery(), createQuery(), createQuery(), createQuery()};

        // The same as PartialAttributeTestWithJoinAttribute, but without changing any settings on the mapping.
        // Inner join: should return 
        // empA's first and last names and it's address.
        queries[0].addPartialAttribute("address");

        // Inner join: should return 
        // empA's first and last names and it's address's city.
        queries[1].addPartialAttribute(queries[1].getExpressionBuilder().get("address").get("city"));

        // Outer join: should return 
        // empA's first and last names and it's address;
        // empB's first and last names and null address.
        queries[2].addPartialAttribute(queries[2].getExpressionBuilder().getAllowingNull("address"));

        // Outer join: should return 
        // empA's first and last names and it's address's city;
        // empB's first and last names and address containing all nulls.
        queries[3].addPartialAttribute(queries[3].getExpressionBuilder().getAllowingNull("address").get("city"));

        for(int i=0; i<4; i++) {
            results[i] = (Vector)getSession().executeQuery(queries[i]);
        }

    }

    protected void verify() {
        String errorMsg = "";
        for(int i=0; i<4; i++) {
            Employee empA = null;
            if(results[i].size() >= 1) {
                empA = (Employee)results[i].elementAt(0);
            }
            Employee empB = null;
            if(results[i].size() >= 2) {
                empB = (Employee)results[i].elementAt(1);
            }
            if(empA == null) {
                errorMsg = errorMsg + "query"+i+" hasn't returned Employee A; ";
            } else {
                if(empA.getAddress() == null) {
                    errorMsg = errorMsg + "query"+i+" returned Employee A with null Address; ";
                }
            }
            if(i==0 || i==1) {
                // i==0 || i==1 - Inner join
                if(empB != null) {
                    errorMsg = errorMsg + "query"+i+" has returned Employee B; ";
                }
            } else {
                // i==2 || i==3 - Outer join
                if(empB == null) {
                    errorMsg = errorMsg + "query"+i+" has not returned Employee B; ";
                } else {
                    if(i==2) {
                        // builder.getAllowingNull("address")
                        if(empB.getAddress() != null) {
                            errorMsg = errorMsg + "query"+i+" has returned Employee B's address; ";
                        }
                    } else {
                        // builder.getAllowingNull("address").get("city")
                        if(empB.getAddress() == null) {
                            errorMsg = errorMsg + "query"+i+" has not returned Employee B's address; ";
                        } else {
                            if(empB.getAddress().getCity() != null) {
                                errorMsg = errorMsg + "query"+i+" has returned Employee B's address with city != null; ";
                            }
                        }
                    }
                }
            }
        }
        
        if(errorMsg.length() > 0) {
            throw new TestErrorException(errorMsg);
        }
    }

    public void reset() {
        cleanup();
        getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }

    protected ReadAllQuery createQuery() {
        ReadAllQuery query = new ReadAllQuery(Employee.class);
        query.dontMaintainCache();
        query.setSelectionCriteria(query.getExpressionBuilder().get("lastName").equal(lastName));
        query.addPartialAttribute("firstName");
        query.addPartialAttribute("lastName");
        query.addOrdering(query.getExpressionBuilder().get("firstName").ascending());
        return query;
    }
    
    protected void cleanup() {
        ReadAllQuery query = new ReadAllQuery(Employee.class);
        query.setSelectionCriteria(query.getExpressionBuilder().get("lastName").equal(lastName));
        Vector result = (Vector)getSession().executeQuery(query);
        if(!result.isEmpty()) {
            UnitOfWork uow = getSession().acquireUnitOfWork();
            for(int i=0; i<result.size(); i++) {
                uow.deleteObject(result.elementAt(i));
            }
            uow.commit();
        }
    }
}
