com.nec.harvest.service.impl.OrganizationServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.nec.harvest.service.impl.OrganizationServiceImpl.java

Source

/*
 * Copyright(C) 2014
 * NEC Corporation All rights reserved.
 * 
 * No permission to use, copy, modify and distribute this software
 * and its documentation for any purpose is granted.
 * This software is provided under applicable license agreement only.
 */
package com.nec.harvest.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.GenericJDBCException;
import org.hibernate.exception.SQLGrammarException;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.transform.Transformers;

import com.nec.core.exception.ObjectNotFoundException;
import com.nec.core.exception.TooManyObjectsException;
import com.nec.crud.hibernate.HibernateSessionManager;
import com.nec.harvest.bean.mapping.OrganizationPaginationBean;
import com.nec.harvest.constant.Constants;
import com.nec.harvest.constant.SqlConstants;
import com.nec.harvest.constant.TblConstants;
import com.nec.harvest.exception.ServiceException;
import com.nec.harvest.model.Organization;
import com.nec.harvest.model.PettyCashBookReport;
import com.nec.harvest.repository.OrganizationRepository;
import com.nec.harvest.service.OrganizationService;

/**
 * {@link OrganizationService}
 * 
 * @author hungpd
 * 
 */
public class OrganizationServiceImpl implements OrganizationService {

    private OrganizationRepository repository;

    public OrganizationServiceImpl(OrganizationRepository organizationRepository) {
        this.repository = organizationRepository;
    }

    /** {@inheritDoc} */
    @Override
    public Organization findByOrgCode(String strCode) throws ServiceException {
        if (StringUtils.isEmpty(strCode)) {
            throw new IllegalArgumentException("The organization's code must not be null or empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        Organization organization = null;
        try {
            tx = session.beginTransaction();
            Criterion criterion = Restrictions.and(Restrictions.eq("strCode", strCode),
                    Restrictions.eq("delKbn", Constants.STATUS_ACTIVE));
            Criteria criteria = repository.getCriteria(session, Organization.class);
            criteria.add(criterion);
            List<Organization> organizations = repository.findByCriteria(criteria);
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException("Could not find any organization matches with code " + strCode);
            }

            if (organizations.size() > 1) {
                throw new TooManyObjectsException("Too many organization objects are matches with code " + strCode);
            }
            organization = organizations.get(0);
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An exception occured while finding a organization by " + strCode
                    + " and delKbn " + Constants.STATUS_ACTIVE, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organization;
    }

    /** {@inheritDoc} */
    @Override
    public Organization findByOrgCodeAndKaisoBango(String strCode, String kaisoBango) throws ServiceException {
        if (StringUtils.isEmpty(strCode)) {
            throw new IllegalArgumentException("The organization's code must not be null or empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        Organization organization = null;
        try {
            tx = session.beginTransaction();
            Criterion criterion = Restrictions.and(Restrictions.eq("strCode", strCode),
                    Restrictions.eq("kaisoBango", kaisoBango), Restrictions.eq("delKbn", Constants.STATUS_ACTIVE));
            Criteria criteria = repository.getCriteria(session, Organization.class);
            criteria.add(criterion);
            List<Organization> organizations = repository.findByCriteria(criteria);
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException("Could not find any organization matches with code " + strCode
                        + " and kaiso " + kaisoBango);
            }

            if (organizations.size() > 1) {
                throw new TooManyObjectsException("Too many organization objects are matches with code " + strCode
                        + " and kaiso " + kaisoBango);
            }
            organization = organizations.get(0);
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An exception occured while finding a organization by code " + strCode
                    + " and kaisoBango " + kaisoBango, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organization;
    }

    /** {@inheritDoc} */
    @Override
    public List<Organization> findByKaisoBango(String kaisoBango) throws ServiceException {
        if (StringUtils.isEmpty(kaisoBango)) {
            throw new IllegalArgumentException("The organization's code must not be null or empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        List<Organization> organizations = new ArrayList<Organization>();
        try {
            tx = session.beginTransaction();
            Criteria criteria = repository.getCriteria(session, Organization.class)
                    .setProjection(Projections.projectionList().add(Projections.property("strCode").as("strCode"))
                            .add(Projections.property("strNameR").as("strNameR")))
                    .add(Restrictions.eq("kaisoBango", kaisoBango))
                    .add(Restrictions.eq("delKbn", Constants.STATUS_ACTIVE))
                    .setResultTransformer(Transformers.aliasToBean(Organization.class));

            // 
            organizations = repository.findByCriteria(criteria);
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException("Could not find any Organization with kaisoBango " + kaisoBango);
            }
            // sort organizations by code value
            Collections.sort(organizations);
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException(
                    "An exception occured while finding Organization list with kaisoBango " + kaisoBango, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organizations;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("unchecked")
    public List<OrganizationPaginationBean> findByStrCodeUp(String strCodeUp) throws ServiceException {
        if (StringUtils.isEmpty(strCodeUp)) {
            throw new IllegalArgumentException("The organization's code must not be null or empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        List<OrganizationPaginationBean> organizations = new ArrayList<OrganizationPaginationBean>();
        try {
            tx = session.beginTransaction();
            Criteria criteria = repository.getCriteria(session, Organization.class)
                    .setProjection(Projections.projectionList().add(Projections.property("strCode").as("strCode"))
                            .add(Projections.property("strNameR").as("strNameR"))
                            .add(Projections.property("comName").as("comName")))
                    .add(Restrictions.eq("strCodeUp", strCodeUp))
                    .add(Restrictions.eq("delKbn", Constants.STATUS_ACTIVE)).addOrder(Order.asc("strCode"))
                    .setResultTransformer(new AliasToBeanResultTransformer(OrganizationPaginationBean.class));
            organizations = criteria.list();
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException("Could not find any Organization with strCodeUp " + strCodeUp);
            }
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException(
                    "An exception occured while finding Organization list with strCodeUp " + strCodeUp, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organizations;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("unchecked")
    public List<String> findByStrCodeAndKaisoBango(String strCode, String kaisoBango) throws ServiceException {
        if (StringUtils.isEmpty(strCode)) {
            throw new IllegalArgumentException("Can not find department with the strCode empty");
        }
        if (StringUtils.isEmpty(kaisoBango)) {
            throw new IllegalArgumentException("Can not find department with the kaisoBango empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        List<String> organizations = new ArrayList<String>();
        try {
            tx = session.beginTransaction();
            StringBuilder sql = new StringBuilder("SELECT T1.StrCode ");
            sql.append(" FROM " + TblConstants.TBL_ORGANIZATION + " T1 ");
            sql.append(" LEFT JOIN " + TblConstants.TBL_ORGANIZATION + " T2 ");
            sql.append(" ON (T1.StrCodeUp = T2.StrCode AND T2.StrCode = :strCode) ");
            sql.append(" WHERE T1.KaisoBango = :kaisoBango");
            sql.append(" AND T1.DelKbn = 2 ");

            // 
            Query query = repository.getSQLQuery(session, sql.toString());
            query.setString("strCode", strCode);
            query.setString("kaisoBango", kaisoBango);

            // 
            organizations = query.list();
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException(
                        "Can not find organizations with strCode " + strCode + " and KaisoBango " + kaisoBango);
            }
        } catch (SQLGrammarException | GenericJDBCException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An exception occured while finding Organization list with strCode "
                    + strCode + " and KaisoBango " + kaisoBango, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organizations;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("unchecked")
    public PettyCashBookReport findDistrictByShop(String shopID) throws ServiceException {
        if (StringUtils.isEmpty(shopID)) {
            throw new IllegalArgumentException("ShopID?NULL???????");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        PettyCashBookReport organization = null;
        try {
            tx = session.beginTransaction();
            Query query = repository.getSQLQuery(session, SqlConstants.SQL_FIND_ORGANIZATION_BY_SHOP);
            query.setParameter("StrCode", shopID);
            query.setResultTransformer(Transformers.aliasToBean(PettyCashBookReport.class));
            List<PettyCashBookReport> organizations = query.list();
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException(
                        " " + shopID + "???????? ");
            }
            organization = organizations.get(0);
        } catch (SQLGrammarException | GenericJDBCException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An exception occured while finding Organization list with ShopID " + shopID,
                    ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organization;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("unchecked")
    public List<String> findOrgsByDepartmentCode(String strCode) throws ServiceException {
        if (StringUtils.isEmpty(strCode)) {
            throw new IllegalArgumentException("Can not find department with the strCode empty");
        }

        final Session session = HibernateSessionManager.getSession();
        Transaction tx = null;

        List<String> organizations = new ArrayList<String>();
        try {
            tx = session.beginTransaction();
            StringBuilder sql = new StringBuilder(
                    "SELECT ifnull(t5.StrCode,ifnull(t4.StrCode,ifnull(t3.StrCode,ifnull(t2.StrCode,t1.StrCode)))) as strcode FROM at102 AS t1");
            sql.append("  LEFT JOIN at102 AS t2 ON t2.StrCodeUp = t1.StrCode ");
            sql.append("  LEFT JOIN at102 AS t3 ON t3.StrCodeUp = t2.StrCode ");
            sql.append("  LEFT JOIN at102 AS t4 ON t4.StrCodeUp = t3.StrCode ");
            sql.append("  LEFT JOIN at102 AS t5 ON t5.StrCodeUp = t4.StrCode ");
            sql.append(" where t1.StrCode = :strcode ");

            // executed sql to get list data orgazation's codes with kaisobango = 5
            Query query = repository.getSQLQuery(session, sql.toString());
            query.setParameter("strcode", strCode);
            organizations = query.list();
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(organizations)) {
                throw new ObjectNotFoundException("Can not find organizations with strCode " + strCode);
            }
        } catch (SQLGrammarException | GenericJDBCException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException(
                    "An exception occured while finding Organization list with strCode " + strCode, ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return organizations;
    }
}