/////////////////////////////////////////////////////////////////////////////
//
// 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.fibu.kost;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.log4j.Logger;
import org.projectforge.common.AbstractCache;
import org.projectforge.common.NumberHelper;
import org.projectforge.reporting.Kost2Art;
import org.projectforge.reporting.impl.Kost2ArtImpl;
import org.springframework.orm.hibernate3.HibernateTemplate;
/**
* The kost2 entries will be cached.
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class KostCache extends AbstractCache
{
private static Logger log = Logger.getLogger(KostCache.class);
private HibernateTemplate hibernateTemplate;
/** The key is the kost2-id. */
private Map<Integer, Kost2DO> kost2Map;
/** The key is the kost2-id. */
private Map<Integer, Kost1DO> kost1Map;
private List<Kost2Art> allKost2Arts;
private boolean kost2EntriesExists = false;
public Kost2DO getKost2(final Integer kost2Id)
{
if (NumberHelper.greaterZero(kost2Id) == false) {
return null;
}
return getKost2Map().get(kost2Id);
}
/**
* @param kostString Format ######## or #.###.##.## is supported.
* @see #getKost2(int, int, int, int)
*/
public Kost2DO getKost2(final String kostString)
{
final int[] kost = KostHelper.parseKostString(kostString);
if (kost == null) {
return null;
}
return getKost2(kost[0], kost[1], kost[2], kost[3]);
}
public Kost2DO getKost2(final int nummernkreis, final int bereich, final int teilbereich, final int kost2art)
{
for (final Kost2DO kost : getKost2Map().values()) {
if (kost.getNummernkreis() == nummernkreis
&& kost.getBereich() == bereich
&& kost.getTeilbereich() == teilbereich
&& kost.getKost2ArtId() == kost2art) {
return kost;
}
}
return null;
}
public List<Kost2DO> getActiveKost2(int nummernkreis, int bereich, int teilbereich)
{
final List<Kost2DO> list = new ArrayList<Kost2DO>();
for (final Kost2DO kost : getKost2Map().values()) {
if (kost.getNummernkreis() == nummernkreis
&& kost.getBereich() == bereich
&& kost.getTeilbereich() == teilbereich
&& (kost.getKostentraegerStatus() == KostentraegerStatus.ACTIVE || kost.getKostentraegerStatus() == null)) {
list.add(kost);
}
}
if (CollectionUtils.isEmpty(list) == true) {
return null;
}
return list;
}
public Kost1DO getKost1(final Integer kost1Id)
{
if (NumberHelper.greaterZero(kost1Id) == false) {
return null;
}
return getKost1Map().get(kost1Id);
}
/**
* Gibt die für das Projekt definierten, nicht gelöschten Kostenarten zurück.
* @param projektId
*/
public Set<Kost2ArtDO> getKost2Arts(Integer projektId)
{
checkRefresh();
Set<Kost2ArtDO> set = new TreeSet<Kost2ArtDO>();
if (projektId == null) {
return set;
}
for (Kost2DO kost : getKost2Map().values()) {
if (kost.isDeleted() == true) {
continue;
}
if (ObjectUtils.equals(projektId, kost.getProjektId()) == true) {
Kost2ArtDO kost2Art = kost.getKost2Art();
if (kost2Art != null) {
set.add(kost2Art);
}
}
}
return set;
}
/**
* Gibt alle nicht gelöschten Kostenarten zurück, wobei die für das Projekt definierten entsprechend markiert sind.
* @param projektId
*/
public List<Kost2Art> getAllKost2Arts(Integer projektId)
{
checkRefresh();
final Set<Kost2ArtDO> set = getKost2Arts(projektId);
final List<Kost2Art> result = new ArrayList<Kost2Art>();
for (Kost2Art kost2Art : allKost2Arts) {
if (kost2Art.isDeleted() == true) {
continue;
}
final Kost2ArtDO kost2ArtDO = new Kost2ArtDO();
kost2ArtDO.copyValuesFrom(((Kost2ArtImpl) kost2Art).getKost2ArtDO());
final Kost2ArtImpl art = new Kost2ArtImpl(kost2ArtDO);
if (set.contains(((Kost2ArtImpl) kost2Art).getKost2ArtDO()) == true) {
art.setExistsAlready(true);
}
result.add(art);
}
return result;
}
public List<Kost2Art> getAllKostArts()
{
checkRefresh();
final List<Kost2Art> list = new ArrayList<Kost2Art>();
if (allKost2Arts != null) {
for (final Kost2Art kost2Art : allKost2Arts) {
final Kost2ArtDO kost2ArtDO = ((Kost2ArtImpl) kost2Art).getKost2ArtDO();
final Kost2ArtDO clone = new Kost2ArtDO();
clone.copyValuesFrom(kost2ArtDO);
list.add(new Kost2ArtImpl(clone));
}
}
return list;
}
public boolean isKost2EntriesExists()
{
checkRefresh();
return kost2EntriesExists;
}
/**
* Should be called after user modifications.
* @param user
*/
void updateKost2(final Kost2DO kost2)
{
getKost2Map().put(kost2.getId(), kost2);
}
/**
* Should be called after user modifications.
* @param user
*/
void updateKost1(final Kost1DO kost1)
{
getKost1Map().put(kost1.getId(), kost1);
}
@SuppressWarnings("unchecked")
void updateKost2Arts()
{
List<Kost2ArtDO> result = hibernateTemplate.find("from Kost2ArtDO t where t.deleted = false order by t.id");
List<Kost2Art> list = new ArrayList<Kost2Art>();
for (Kost2ArtDO kost2ArtDO : result) {
Kost2ArtImpl art = new Kost2ArtImpl(kost2ArtDO);
list.add(art);
}
// This method must not be synchronized because it works with a new copy of list.
this.allKost2Arts = list;
}
private Map<Integer, Kost2DO> getKost2Map()
{
checkRefresh();
return kost2Map;
}
private Map<Integer, Kost1DO> getKost1Map()
{
checkRefresh();
return kost1Map;
}
/**
* This method will be called by CacheHelper and is synchronized via getData();
*/
@SuppressWarnings("unchecked")
protected void refresh()
{
log.info("Initializing KostCache ...");
// This method must not be synchronized because it works with a new copy of maps.
final Map<Integer, Kost1DO> map1 = new HashMap<Integer, Kost1DO>();
final List<Kost1DO> list1 = hibernateTemplate.find("from Kost1DO t");
for (Kost1DO kost1 : list1) {
map1.put(kost1.getId(), kost1);
}
this.kost1Map = map1;
final Map<Integer, Kost2DO> map2 = new HashMap<Integer, Kost2DO>();
final List<Kost2DO> list2 = hibernateTemplate.find("from Kost2DO t");
kost2EntriesExists = false;
for (Kost2DO kost2 : list2) {
if (kost2EntriesExists == false && kost2.isDeleted() == false) {
kost2EntriesExists = true;
}
map2.put(kost2.getId(), kost2);
}
this.kost2Map = map2;
updateKost2Arts();
log.info("Initializing of KostCache done.");
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate)
{
this.hibernateTemplate = hibernateTemplate;
}
}