package org.egov.assets.service;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.Metamodel;
import org.egov.assets.model.Asset;
import org.egov.assets.repository.AssetRepository;
import org.egov.assets.util.AssetCommonUtil;
import org.egov.commons.EgwStatus;
import org.egov.commons.dao.EgwStatusHibernateDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true)
public class AssetService {
private final AssetRepository assetRepository;
@PersistenceContext
private EntityManager entityManager;
@Autowired
private AssetCommonUtil assetCommonUtil;
@Autowired
private EgwStatusHibernateDAO egwStatusHibernateDAO;
@Autowired
public AssetService(final AssetRepository assetRepository) {
this.assetRepository = assetRepository;
}
@Transactional
public Asset create(final Asset asset) {
if(asset.getCategoryProperties() != null)
{
String serialize = assetCommonUtil.serialize(asset.getCategoryProperties());
asset.setProperties(serialize);
}
return assetRepository.save(asset);
}
@Transactional
public Asset update(final Asset asset) {
if(asset.getCategoryProperties() != null)
{
String serialize = assetCommonUtil.serialize(asset.getCategoryProperties());
asset.setProperties(serialize);
}
return assetRepository.save(asset);
}
public List<Asset> findAll() {
return assetRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
}
public Asset findByName(String name) {
return assetRepository.findByName(name);
}
public Asset findByCode(String code) {
return assetRepository.findByCode(code);
}
public Asset findOne(Long id) {
return assetRepository.findOne(id);
}
public List<Asset> search(Asset asset) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Asset> createQuery = cb.createQuery(Asset.class);
Root<Asset> assets = createQuery.from(Asset.class);
createQuery.select(assets);
Metamodel model = entityManager.getMetamodel();
EntityType<Asset> Asset_ = model.entity(Asset.class);
List<Predicate> predicates = new ArrayList<Predicate>();
if(asset.getName()!=null)
{
String name="%"+asset.getName().toLowerCase()+"%";
predicates.add(cb.isNotNull(assets.get("name")));
predicates.add(cb.like(cb.lower(assets.get(Asset_.getDeclaredSingularAttribute("name", String.class))),name));
}
if(asset.getCode()!=null)
{
String code="%"+asset.getCode().toLowerCase()+"%";
predicates.add(cb.isNotNull(assets.get("code")));
predicates.add(cb.like(cb.lower(assets.get(Asset_.getDeclaredSingularAttribute("code", String.class))),code));
}
if(asset.getAssetCategory() != null)
{
predicates.add(cb.equal(assets.get("assetCategory"), asset.getAssetCategory()));
}
if(asset.getDepartment() != null)
{
predicates.add(cb.equal(assets.get("department"),asset.getDepartment()));
}
if(asset.getSearchStatus() != null)
{
Expression<Long> status = assets.get("status");
predicates.add(status.in(asset.getSearchStatus()));
}
createQuery.where(predicates.toArray(new Predicate[]{}));
TypedQuery<Asset> query=entityManager.createQuery(createQuery);
List<Asset> resultList = query.getResultList();
return resultList;
}
}