/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.humanresources;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Hibernate;
import org.projectforge.common.StringHelper;
import org.projectforge.fibu.KundeDO;
import org.projectforge.fibu.ProjektDO;
import org.projectforge.timesheet.TimesheetDO;
import org.projectforge.user.PFUserDO;
/**
* Is not synchronized.
* @author Kai Reinhard (k.reinhard@micromata.de)
*
*/
public class HRViewData implements Serializable
{
private static final long serialVersionUID = 8940066588727279286L;
HRFilter filter;
Map<Integer, HRViewUserData> userDatas;
private Map<Integer, ProjektDO> projects;
private Map<Integer, KundeDO> customers;
private List<HRViewUserData> sortedUserDatas;
private List<ProjektDO> sortedProjects;
private List<KundeDO> sortedCustomers;
HRViewData(final HRFilter filter)
{
this.filter = filter;
userDatas = new HashMap<Integer, HRViewUserData>();
projects = new HashMap<Integer, ProjektDO>();
customers = new HashMap<Integer, KundeDO>();
}
void addTimesheet(final TimesheetDO sheet, final PFUserDO user)
{
ensureAndGetUserData(user).addTimesheet(sheet);
sortedUserDatas = null;
}
void addTimesheet(final TimesheetDO sheet, final PFUserDO user, final ProjektDO projekt)
{
ensureAndGetUserData(user).addTimesheet(sheet, projekt);
addProjekt(projekt);
sortedUserDatas = null;
}
void addTimesheet(final TimesheetDO sheet, final PFUserDO user, final KundeDO kunde)
{
ensureAndGetUserData(user).addTimesheet(sheet, kunde);
addKunde(kunde);
sortedUserDatas = null;
}
void addHRPlanningEntry(final HRPlanningEntryDO entry, final PFUserDO user)
{
ensureAndGetUserData(user).addPlanningEntry(entry);
sortedUserDatas = null;
}
void addHRPlanningEntry(final HRPlanningEntryDO entry, final PFUserDO user, final ProjektDO projekt)
{
ensureAndGetUserData(user).addPlanningEntry(entry, projekt);
addProjekt(projekt);
sortedUserDatas = null;
}
void addHRPlanningEntry(final HRPlanningEntryDO entry, final PFUserDO user, final KundeDO kunde)
{
ensureAndGetUserData(user).addPlanningEntry(entry, kunde);
addKunde(kunde);
sortedUserDatas = null;
}
private void addProjekt(final ProjektDO projekt)
{
if (projekt != null) {
Hibernate.initialize(projekt);
if (projects.containsKey(projekt.getId()) == false) {
projects.put(projekt.getId(), projekt);
sortedProjects = null;
}
}
}
private void addKunde(final KundeDO kunde)
{
if (kunde != null) {
Hibernate.initialize(kunde);
if (customers.containsKey(kunde.getId()) == false) {
customers.put(kunde.getId(), kunde);
sortedCustomers = null;
}
}
}
public List<ProjektDO> getProjects()
{
if (sortedProjects == null) {
sortedProjects = new ArrayList<ProjektDO>();
sortedProjects.addAll(projects.values());
Collections.sort(sortedProjects, new Comparator<ProjektDO>() {
public int compare(ProjektDO o1, ProjektDO o2)
{
return StringHelper.compareTo(o1.getProjektIdentifierDisplayName(), o2.getProjektIdentifierDisplayName());
}
});
}
return sortedProjects;
}
public List<KundeDO> getCustomers()
{
if (sortedCustomers == null) {
sortedCustomers = new ArrayList<KundeDO>();
sortedCustomers.addAll(customers.values());
Collections.sort(sortedCustomers, new Comparator<KundeDO>() {
public int compare(KundeDO o1, KundeDO o2)
{
return StringHelper.compareTo(o1.getKundeIdentifierDisplayName(), o2.getKundeIdentifierDisplayName());
}
});
}
return sortedCustomers;
}
public List<HRViewUserData> getUserDatas()
{
if (sortedUserDatas == null) {
sortedUserDatas = new ArrayList<HRViewUserData>();
sortedUserDatas.addAll(userDatas.values());
Collections.sort(sortedUserDatas, new Comparator<HRViewUserData>() {
public int compare(HRViewUserData o1, HRViewUserData o2)
{
return StringHelper.compareTo(o1.getUser().getFullname(), o2.getUser().getFullname());
}
});
}
return sortedUserDatas;
}
public boolean containsUser(final PFUserDO user)
{
return userDatas.containsKey(user.getId());
}
public HRViewUserData getUserData(final PFUserDO user)
{
return userDatas.get(user.getId());
}
HRViewUserData ensureAndGetUserData(final PFUserDO user)
{
HRViewUserData data = userDatas.get(user.getId());
if (data == null) {
data = new HRViewUserData(user);
userDatas.put(user.getId(), data);
}
return data;
}
}