/*******************************************************************************
 * 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:
 *     Denise Smith  June 05, 2009 - Initial implementation
 ******************************************************************************/
package org.eclipse.persistence.testing.jaxb.listofobjects;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import javax.xml.bind.annotation.XmlElement;

public class ListofObjects {
	public List<Employee> empList;
	public TreeSet<Employee> empTreeSet;
	public ArrayList<Employee> empArrayList;
	public List<Integer> integerList;
	public Employee[] empArray;
	public Integer[] integerArray;
	public Float[] floatArray;
	public int[] intArray;
	
	@XmlElement(required=false)
    public int[] intArrayOptional;	

    public boolean[] booleanArray;
	public Map<String, Integer> stringIntegerHashMap;
	public LinkedList<Integer> integerLinkedList;
	public Hashtable<String, Employee> stringEmployeeHashtable;	
	public Stack<BigDecimal> bigDecimalStack;
	public MyList<String> stringMyList;
	public ConcurrentMap<String, Integer> stringIntegerConcurrentMap;
	public Set<Integer> integerSet;
	public Queue<String> stringQueue;
	
	public ListofObjects() {
		empList = new ArrayList<Employee>();
		empArrayList = new ArrayList<Employee>();
		empTreeSet = new TreeSet();
		integerLinkedList = new LinkedList<Integer>();
		stringEmployeeHashtable = new Hashtable();
		bigDecimalStack = new Stack();
		stringMyList = new MyList();	
		stringIntegerConcurrentMap = new ConcurrentHashMap<String, Integer>();
		integerSet = new TreeSet();
		stringQueue = new LinkedList<String>();
	}

	public List<Employee> getEmpList() {
		return empList;
	}

	public void setEmpList(List<Employee> empList) {
		this.empList = empList;
	}

	public List<Integer> getIntegerList() {
		return integerList;
	}

	public void setIntegerList(List<Integer> integerList) {
		this.integerList = integerList;
	}

	public Employee[] getEmpArray() {
		return empArray;
	}

	public void setEmpArray(Employee[] empArray) {
		this.empArray = empArray;
	}

	public Integer[] getIntegerArray() {
		return integerArray;
	}

	public void setIntegerArray(Integer[] integerArray) {
		this.integerArray = integerArray;
	}

	public boolean[] getBooleanArray() {
		return booleanArray;
	}

	public void setBooleanArray(boolean[] booleanArray) {
		this.booleanArray = booleanArray;
	}

	public ArrayList<Employee> getEmpArrayList() {
		return empArrayList;
	}

	public void setEmpArrayList(ArrayList<Employee> empArrayList) {
		this.empArrayList = empArrayList;
	}

	public boolean equals(Object compareObject) {
		if (!(compareObject instanceof ListofObjects)) {
			return false;
		}
		ListofObjects compareListofObjects = (ListofObjects) compareObject;

		if (empList == null && compareListofObjects.getEmpList() != null) {
			return false;
		}
		if (empList.size() == compareListofObjects.getEmpList().size()) {
			if (!empList.containsAll(compareListofObjects.getEmpList())) {
				return false;
			}
		} else {
			return false;
		}
		
		if (integerLinkedList == null && compareListofObjects.getIntegerLinkedList() != null) {
			return false;
		}
		if (integerLinkedList.size() == compareListofObjects.getIntegerLinkedList().size()) {
			if (!integerLinkedList.containsAll(compareListofObjects.getIntegerLinkedList())) {
				return false;
			}
		} else {
			return false;
		}
		
		if (stringQueue == null && compareListofObjects.getStringQueue() != null) {
			return false;
		}
		if (stringQueue.size() == compareListofObjects.getStringQueue().size()) {
			if (!stringQueue.containsAll(compareListofObjects.getStringQueue())) {
				return false;
			}
		} else {
			return false;
		}

		if (empTreeSet == null && compareListofObjects.getEmpTreeSet() != null) {
			return false;
		}
		if (empTreeSet.size() == compareListofObjects.getEmpTreeSet().size()) {
			if (!empTreeSet.containsAll(compareListofObjects.getEmpTreeSet())) {
				return false;
			}
		} else {
			return false;
		}
		
		
		if (integerSet == null && compareListofObjects.getIntegerSet() != null) {
			return false;
		}
		if (integerSet.size() == compareListofObjects.getIntegerSet().size()) {
			if (!integerSet.containsAll(compareListofObjects.getIntegerSet())) {
				return false;
			}
		} else {
			return false;
		}
		
		if (empArrayList == null
				&& compareListofObjects.getEmpArrayList() != null) {
			return false;
		}
		if (empArrayList.size() == compareListofObjects.getEmpArrayList()
				.size()) {
			if (!empArrayList.containsAll(compareListofObjects
					.getEmpArrayList())) {
				return false;
			}
		} else {
			return false;
		}

		if (empArray == null && compareListofObjects.getEmpArray() != null) {
			return false;
		}
		if (empArray.length == compareListofObjects.getEmpArray().length) {
			for (int i = 0; i < empArray.length; i++) {
				if (!empArray[i].equals(compareListofObjects.getEmpArray()[i])) {
					return false;
				}
			}
		} else {
			return false;
		}
		
		if(booleanArray == null && compareListofObjects.booleanArray !=null){
			return false;
		}
		if (booleanArray.length == compareListofObjects.booleanArray.length) {
			for (int i = 0; i < booleanArray.length; i++) {
				if (booleanArray[i] != compareListofObjects.booleanArray[i]) {
					return false;
				}
			}
		} else {
			return false;
		}
		
		if(intArray == null && compareListofObjects.intArray !=null){
			return false;
		}
		if (intArray.length == compareListofObjects.intArray.length) {
			for (int i = 0; i < intArray.length; i++) {
				if (intArray[i] != compareListofObjects.intArray[i]) {
					return false;
				}
			}
		} else {
			return false;
		}
		
		if(integerArray == null && compareListofObjects.integerArray !=null){
			return false;
		}
		if (integerArray.length == compareListofObjects.integerArray.length) {
			for (int i = 0; i < integerArray.length; i++) {
				if (!integerArray[i].equals(compareListofObjects.integerArray[i])) {
					return false;
				}
			}
		} else {
			return false;
		}

		if(floatArray == null ){
		    if(compareListofObjects.floatArray !=null) {
		        return false;
		    }
		}else if (floatArray.length == compareListofObjects.floatArray.length) {
			for (int i = 0; i < floatArray.length; i++) {
				if (!floatArray[i].equals(compareListofObjects.floatArray[i])) {
					return false;
				}
			}
		} else {
			return false;
		}
		
		if(stringIntegerHashMap.size() == compareListofObjects.stringIntegerHashMap.size()){
			if(!stringIntegerHashMap.entrySet().containsAll(compareListofObjects.stringIntegerHashMap.entrySet())){
				return false;
			}		
		}else{
			return false;
		}
		
		if(stringIntegerConcurrentMap.size() == compareListofObjects.stringIntegerConcurrentMap.size()){
			if(!stringIntegerConcurrentMap.entrySet().containsAll(compareListofObjects.stringIntegerConcurrentMap.entrySet())){
				return false;
			}		
		}else{
			return false;
		}
		
		if(stringEmployeeHashtable.size() == compareListofObjects.stringEmployeeHashtable.size()){
			if(!stringEmployeeHashtable.entrySet().containsAll(compareListofObjects.stringEmployeeHashtable.entrySet())){
				return false;
			}		
		}else{
			return false;
		}
		
		if (bigDecimalStack == null && compareListofObjects.getBigDecimalStack() != null) {
			return false;
		}
		if (bigDecimalStack.size() == compareListofObjects.getBigDecimalStack().size()) {
			if (!bigDecimalStack.containsAll(compareListofObjects.getBigDecimalStack())) {
				return false;
			}
		} else {
			return false;
		}
		
		if (stringMyList == null
				&& compareListofObjects.getStringMyList() != null) {			
			return false;
		}
		if (stringMyList.size() == compareListofObjects.getStringMyList()
				.size()) {
			if (!stringMyList.containsAll(compareListofObjects
					.getStringMyList())) {
				return false;
			}
		} else {
			return false;
		}
		
		return true;
	}

	public Set<Employee> getEmpTreeSet() {
		return empTreeSet;
	}

	public void setEmpTreeSet(TreeSet<Employee> empSet) {
		this.empTreeSet = empSet;
	}

	public Map<String, Integer> getStringIntegerHashMap() {
		return stringIntegerHashMap;
	}

	public void setStringIntegerHashMap(
			Map<String, Integer> stringIntegerHashMap) {
		this.stringIntegerHashMap = stringIntegerHashMap;
	}

	public LinkedList<Integer> getIntegerLinkedList() {
		return integerLinkedList;
	}

	public void setIntegerLinkedList(LinkedList<Integer> integerLinkedList) {
		this.integerLinkedList = integerLinkedList;
	}

	public Hashtable<String, Employee> getStringEmployeeHashtable() {
		return stringEmployeeHashtable;
	}

	public void setStringEmployeeHashtable(Hashtable<String, Employee> stringEmployeeHashtable) {
		this.stringEmployeeHashtable = stringEmployeeHashtable;
	}

	public Stack<BigDecimal> getBigDecimalStack() {
		return bigDecimalStack;
	}

	public void setBigDecimalStack(Stack<BigDecimal> bigDecimalStack) {
		this.bigDecimalStack = bigDecimalStack;
	}

	public MyList<String> getStringMyList() {
		return stringMyList;
	}

	public void setStringMyList(MyList<String> stringMyList) {
		this.stringMyList = stringMyList;
	}

	public ConcurrentMap<String, Integer> getStringIntegerConcurrentMap() {
		return stringIntegerConcurrentMap;
	}

	public void setStringIntegerConcurrentMap(
			ConcurrentMap<String, Integer> stringIntegerConcurrentMap) {
		this.stringIntegerConcurrentMap = stringIntegerConcurrentMap;
	}

	public Set<Integer> getIntegerSet() {
		return integerSet;
	}

	public void setIntegerSet(Set<Integer> integerSet) {
		this.integerSet = integerSet;
	}

	public Queue<String> getStringQueue() {
		return stringQueue;
	}

	public void setStringQueue(Queue<String> stringQueue) {
		this.stringQueue = stringQueue;
	}
}
