package com.farata.java_test.data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import com.farata.java_test.dto.AssociateDTO;
import com.farata.java_test.dto.CompanyDTO;
public class DataEngine {
private DataEngine() {
initializeCompanies();
initializeCompanyAssociates();
}
private static DataEngine _instance;
public static DataEngine getInstance(){
if (_instance==null) {
_instance = new DataEngine();
}
return _instance;
}
/*
* companyList is rudimentary entity: only single thread is supposed to access it,
* it serves only for illustration of the ChangeObject mechanics
*/
private ArrayList<CompanyDTO> companyList;
@SuppressWarnings("serial")
private void initializeCompanies() {
companyList = new ArrayList<CompanyDTO>() {
public boolean add(CompanyDTO dto) {
if ((dto==null) || (dto.getId()==null)) return false;
ArrayList<AssociateDTO> associateList = new ArrayList<AssociateDTO>();
if (companyAssociateMap == null) {
companyAssociateMap = new HashMap<Long, ArrayList<AssociateDTO>>();
}
companyAssociateMap.put(dto.getId(), associateList);
return super.add(dto);
}
public CompanyDTO remove(int index) {
CompanyDTO dto = super.remove(index);
if (dto.getId()!=null) {
companyAssociateMap.remove(dto.getId());
}
return dto;
}
};
CompanyDTO dto = new CompanyDTO();
dto.setCompany("FarataSystems");
dto.setId(new Long(1));
companyList.add(dto);
dto = new CompanyDTO();
dto.setCompany("Adobe");
dto.setId(new Long(2));
companyList.add(dto);
}
public List<CompanyDTO> getCompanyList() {
return companyList;
}
public CompanyDTO findCompany(CompanyDTO dto) {
CompanyDTO companyDTO = null;
for (int i=0; i< companyList.size(); i++) {
CompanyDTO listDTO = companyList.get(i) ;
if (listDTO.getId().compareTo(dto.getId())==0) {
companyDTO = listDTO;
break;
}
}
return companyDTO;
}
public CompanyDTO removeCompany(CompanyDTO dto) {
CompanyDTO removed = null;
for (int i=0; i< companyList.size(); i++) {
CompanyDTO listDTO = companyList.get(i) ;
if (listDTO.getId().compareTo(dto.getId())==0) {
removed = companyList.remove(i);
break;
}
}
return removed;
}
public long getMaxCompanyId() {
long maxId=0;
try {
CompanyDTO max = (CompanyDTO)Collections.max(companyList, new CompanyIdComparator());
maxId = max.getId();
} catch (NoSuchElementException nsee) {
// default to 0
}
return maxId;
}
class CompanyIdComparator implements Comparator<CompanyDTO> {
@Override
public int compare(CompanyDTO o1, CompanyDTO o2) {
return o1.getId().compareTo(o2.getId());
}
}
/*
* companyAssociateMap is rudimentary support of one to many company-associate
* relationship, only single thread is supposed to access it,
* it serves only for illustration of the ChangeObject mechanics
*/
private Map<Long, ArrayList<AssociateDTO>> companyAssociateMap;
private void initializeCompanyAssociates() {
//Farata Associates
ArrayList<AssociateDTO> associateList = companyAssociateMap.get(new Long(1));
Long companyId = new Long(1);
AssociateDTO dto = new AssociateDTO();
dto.setAssociate("Yakov Fain");
dto.setCompanyId(companyId);
dto.setId(new Long(1));
associateList.add(dto);
dto = new AssociateDTO();
dto.setAssociate("Anatole Tartakovsky");
dto.setCompanyId(companyId);
associateList.add(dto);
dto.setId(new Long(2));
dto = new AssociateDTO();
dto.setAssociate("Victor Rasputnis");
dto.setCompanyId(companyId);
dto.setId(new Long(3));
associateList.add(dto);
//Flex Team Associates
associateList = companyAssociateMap.get(new Long(2));
companyId = new Long(2);
dto = new AssociateDTO();
dto.setAssociate("Ely Greenfield");
dto.setCompanyId(companyId);
dto.setId(new Long(4));
associateList.add(dto);
dto = new AssociateDTO();
dto.setAssociate("Alex Harui");
dto.setCompanyId(companyId);
dto.setId(new Long(5));
associateList.add(dto);
dto = new AssociateDTO();
dto.setAssociate("Matt Chotin");
dto.setCompanyId(companyId);
dto.setId(new Long(6));
associateList.add(dto);
}
public List<AssociateDTO> getAssociateList(Long companyId) {
if (companyId==null) throw new RuntimeException("companyId can not be null");
List<AssociateDTO> associateList = companyAssociateMap.get(companyId);
if (associateList==null) associateList = new ArrayList<AssociateDTO>();
return associateList;
}
public AssociateDTO findAssociate(AssociateDTO dto) {
AssociateDTO targetDTO=null;
Long companyId = dto.getCompanyId();
if (companyId == null) throw new RuntimeException("companyId can not be null");
List<AssociateDTO> associateList = companyAssociateMap.get(companyId);
if (associateList != null) {
for (AssociateDTO listDTO: associateList) {
if (listDTO.getId().compareTo(dto.getId())==0) {
targetDTO = listDTO;
break;
}
}
}
return targetDTO;
}
public AssociateDTO removeAssociate(AssociateDTO dto) {
AssociateDTO removedDTO=null;
Long companyId = dto.getCompanyId();
if (companyId == null) throw new RuntimeException("companyId can not be null");
List<AssociateDTO> associateList = companyAssociateMap.get(companyId);
if (associateList!=null) {
for (AssociateDTO listDTO: associateList) {
if (listDTO.getId().compareTo(dto.getId())==0) {
associateList.remove(listDTO);
removedDTO = listDTO;
break;
}
}
}
return removedDTO;
}
@SuppressWarnings("unchecked")
public long getMaxAssociateId () {
long maxId=0;
Iterator it = companyAssociateMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
ArrayList<AssociateDTO> partialList = (ArrayList<AssociateDTO>) pairs.getValue();
try {
AssociateDTO maxDTO = (AssociateDTO)Collections.max(partialList, new AssociateIdComparator());
if (maxDTO.getId() > maxId) maxId = maxDTO.getId();
} catch (NoSuchElementException nsee) {
// default to 0
}
}
return maxId;
}
class AssociateIdComparator implements Comparator<AssociateDTO> {
@Override
public int compare(AssociateDTO o1, AssociateDTO o2) {
return o1.getId().compareTo(o2.getId());
}
}
}