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

Java tutorial

Introduction

Here is the source code for com.nec.harvest.service.impl.HelpServiceImpl.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.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.GenericJDBCException;
import org.hibernate.exception.SQLGrammarException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.nec.core.exception.ObjectNotFoundException;
import com.nec.crud.hibernate.HibernateSessionManager;
import com.nec.harvest.bean.mapping.MoveTransferBean;
import com.nec.harvest.bean.mapping.json.JSONBean;
import com.nec.harvest.bean.mapping.json.JSONHelp;
import com.nec.harvest.constant.Constants;
import com.nec.harvest.constant.MsgConstants;
import com.nec.harvest.exception.ServiceException;
import com.nec.harvest.helper.MessageHelper;
import com.nec.harvest.helper.ProductHelper;
import com.nec.harvest.model.User;
import com.nec.harvest.repository.HelpRepository;
import com.nec.harvest.service.HelpService;
import com.nec.harvest.service.SerialNumberService;
import com.nec.harvest.userdetails.AuthenticatedUserDetails;

/**
 * {@link HelpService}
 * 
 * @author sondn
 *
 */
public class HelpServiceImpl implements HelpService {

    private static final Logger logger = LoggerFactory.getLogger(HelpServiceImpl.class);

    private final int STATE_DELETE = 1;
    private final int STATE_UPDATE = 2;
    private final int STATE_INSERT = 3;

    private final HelpRepository repository;

    private final SerialNumberService serialNumberService;

    public HelpServiceImpl(HelpRepository helpRepository, SerialNumberService serialNumberService) {
        this.repository = helpRepository;
        this.serialNumberService = serialNumberService;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("unchecked")
    public List<MoveTransferBean> findByOrgCodeAndMonthly(String orgCode, String monthly) throws ServiceException {
        if (StringUtils.isEmpty(orgCode)) {
            throw new IllegalArgumentException("Orginazation's code must not be null or empty");
        }
        if (StringUtils.isEmpty(monthly)) {
            throw new IllegalArgumentException("Month must not be null or empty");
        }

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

        List<MoveTransferBean> moveTransferes = new ArrayList<>();
        try {
            tx = session.beginTransaction();
            Query query = repository.getQuery(session, " SELECT "
                    + " new com.nec.harvest.bean.mapping.MoveTransferBean(a.recID, a.srDate, "
                    + " a.strCodeU, ( SELECT b.strNameR FROM Organization b WHERE b.kaisoBango = :kaisoBango AND b.delKbn = :delKbn AND b.strCode = a.strCodeU) as strNameRU, "
                    + " a.account.kmkCode, a.account.kmkNameR, "
                    + " a.strCodeH, ( SELECT c.strNameR FROM Organization c WHERE c.kaisoBango = :kaisoBango AND c.delKbn = :delKbn AND c.strCode = a.strCodeH) as strNameRH, "
                    + " a.kmkCodeH, ( SELECT d.kmkNameR FROM Account d WHERE d.helpKbn = :helpKbn AND d.delKbn = :delKbn AND d.kmkCode = a.kmkCodeH) as kmkNameRH, "
                    + " a.tekiyo, a.jikan, a.kingaku, a.updNo) " + " FROM Help a "
                    + " WHERE  a.getSudo = :getSudo AND  a.organization.strCode = :strCode AND  a.delKbn = :delKbn "
                    + " ORDER BY a.srDate ASC, a.strCodeU ASC, a.account.kmkCode ASC, a.strCodeH ASC, a.kmkCodeH ASC ");
            query.setParameter("strCode", orgCode);
            query.setParameter("getSudo", monthly);
            query.setParameter("kaisoBango", Constants.DEFAULT_KAISOBANGO);
            query.setParameter("helpKbn", Constants.DEFAULT_KBN);
            query.setParameter("delKbn", Constants.STATUS_ACTIVE);

            moveTransferes = query.list();
            // Release transaction
            tx.commit();
            if (CollectionUtils.isEmpty(moveTransferes)) {
                throw new ObjectNotFoundException(
                        "Could not find any Help by organization " + orgCode + " and monthly " + monthly);
            }
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An error occurred while finding the Help by organization " + orgCode
                    + " and monthly " + monthly);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return moveTransferes;
    }

    /** {@inheritDoc} */
    @Override
    public boolean updateHelp(JSONHelp jsonHelp) throws ServiceException {
        if (jsonHelp == null) {
            throw new IllegalArgumentException("Help must not be null or empty");
        }
        if (StringUtils.isEmpty(jsonHelp.getRecID())) {
            throw new IllegalArgumentException("Help ID must not be null or empty");
        }

        User user = AuthenticatedUserDetails.getUserPrincipal();
        if (user == null) {
            throw new IllegalArgumentException(
                    "Sorry, you don't have a permission to use this. Please login with right permission");
        }

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

        boolean isUpdated = Boolean.FALSE;
        try {
            StringBuilder sql = new StringBuilder();
            sql.append(" UPDATE AT013");
            sql.append(
                    " SET srDate=:srDate, strCodeU=:strCodeU, kmkCode=:kmkCode, strCodeH=:strCodeH, kmkCodeH=:kmkCodeH, jikan=:jikan,");
            sql.append(" tekiyo=:tekiyo, kingaku=:kingaku, tanCode=:tanCode, recCKbn=:recCKbn, aPInf2=:aPInf2,");
            sql.append(" stfCodeU=:stfCodeU, prdNoU=:prdNoU, timeU=NOW(), updNo = (:updNo + 1)");
            sql.append(" WHERE recID=:recID AND delKbn=:delKbn AND updNo=:updNo");

            tx = session.beginTransaction();
            Query query = repository.getSQLQuery(session, sql.toString())
                    .setParameter("srDate", jsonHelp.getSrDate()).setParameter("strCodeU", jsonHelp.getStrCodeU())
                    .setParameter("strCodeH", jsonHelp.getStrCodeH()).setParameter("kmkCode", jsonHelp.getKmkCode())
                    .setParameter("kmkCodeH", jsonHelp.getKmkCodeH()).setParameter("jikan", jsonHelp.getJikan())
                    .setParameter("tekiyo", jsonHelp.getTekiyo()).setParameter("kingaku", jsonHelp.getKingaku())
                    .setParameter("tanCode", user.getUsrCode()).setParameter("aPInf2", user.getUsrCode())
                    .setParameter("stfCodeU", user.getUsrCode()).setParameter("recCKbn", Constants.DEFAULT_KBN);
            try {
                query.setParameter("prdNoU", ProductHelper.getProductInfor().getVersion());
            } catch (IOException e) {
                logger.warn("Can not get product informations when update help record");
            }

            query.setParameter("recID", jsonHelp.getRecID()).setParameter("delKbn", Constants.STATUS_ACTIVE)
                    .setParameter("updNo", jsonHelp.getUpdNo());

            int result = query.executeUpdate();
            isUpdated = (result > 0);
            tx.commit();
        } catch (SQLGrammarException | GenericJDBCException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException(
                    "An error occurred while update help record with id: " + jsonHelp.getRecID());
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return isUpdated;
    }

    /** {@inheritDoc} */
    @Override
    public boolean deleteByIDs(String... Ids) throws ServiceException {
        if (ArrayUtils.isEmpty(Ids)) {
            throw new IllegalArgumentException("Array help must not be null or empty");
        }

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

        boolean isDeleted = Boolean.FALSE;
        try {
            tx = session.beginTransaction();
            String sql = " DELETE FROM  Help a WHERE a.delKbn = :delKbn AND a.recID IN (:recIDs) ";
            Query query = repository.getQuery(session, sql).setParameterList("recIDs", Ids).setParameter("delKbn",
                    Constants.STATUS_ACTIVE);

            int result = query.executeUpdate();
            isDeleted = (result > 0);
            tx.commit();
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An error occurred while delete help list");
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return isDeleted;
    }

    /** {@inheritDoc} */
    @Override
    public synchronized boolean insertHelp(String monthly, JSONHelp jsonHelp) throws ServiceException {
        if (StringUtils.isEmpty(monthly)) {
            throw new IllegalArgumentException("Monthly must not be null or empty");
        }
        if (jsonHelp == null) {
            throw new IllegalArgumentException("Help object must not be null");
        }

        User user = AuthenticatedUserDetails.getUserPrincipal();
        if (user == null) {
            throw new IllegalArgumentException(
                    "Sorry, you don't have a permission to use this. Please login with right permission");
        }

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

        boolean isInserted = Boolean.FALSE;
        try {
            StringBuilder sql = new StringBuilder();
            sql.append(" INSERT INTO at013 ");
            sql.append(
                    " (RecID, StrCode, Getsudo, SrDate, StrCodeU, StrCodeH, Jikan, Tekiyo, Kingaku, UpdNo, DelKbn, TanCode, ");
            sql.append(
                    " APInf1, APInf2, RecCkbn, StfCodeC, StfCodeU, KmkCode, KmkCodeH, PrdNoC, TimeC, PrdNoU, TimeU) ");
            sql.append(
                    " VALUES(:recID, :strCode, :getSudo, :srDate, :strCodeU, :strCodeH, :jikan, :tekiyo, :kingaku, :updNo, :delKbn, :tanCode, ");
            sql.append(
                    " :aPInf1, :aPInf2, :recCkbn, :stfCodeC, :stfCodeU, :kmkCode, :kmkCodeH, :prdNoC, now(), :prdNoU, now()) ");

            tx = session.beginTransaction();
            Query query = repository.getSQLQuery(session, sql.toString()).setParameter("recID", jsonHelp.getRecID())
                    .setParameter("strCode", user.getOrganization().getStrCode()).setParameter("getSudo", monthly)
                    .setParameter("srDate", jsonHelp.getSrDate()).setParameter("strCodeU", jsonHelp.getStrCodeU())
                    .setParameter("strCodeH", jsonHelp.getStrCodeH()).setParameter("jikan", jsonHelp.getJikan())
                    .setParameter("tekiyo", jsonHelp.getTekiyo()).setParameter("kingaku", jsonHelp.getKingaku())
                    .setParameter("tanCode", user.getUsrCode()).setParameter("aPInf1", user.getUsrCode())
                    .setParameter("aPInf2", user.getUsrCode()).setParameter("stfCodeC", user.getUsrCode())
                    .setParameter("stfCodeU", user.getUsrCode()).setParameter("kmkCode", jsonHelp.getKmkCode())
                    .setParameter("updNo", Constants.DEFAULT_INT_ONE)
                    .setParameter("delKbn", Constants.STATUS_ACTIVE).setParameter("recCkbn", Constants.DEFAULT_KBN)
                    .setParameter("kmkCodeH", jsonHelp.getKmkCodeH());
            try {
                String version = ProductHelper.getProductInfor().getVersion();
                query.setParameter("prdNoC", version);
                query.setParameter("prdNoU", version);
            } catch (IOException ex) {
                logger.warn(ex.getMessage());
            }

            int result = query.executeUpdate();
            isInserted = (result > 0);
            tx.commit();
        } catch (SQLGrammarException | GenericJDBCException ex) {
            if (tx != null) {
                tx.rollback();
            }
            throw new ServiceException("An error occurred while create a new one help record", ex);
        } finally {
            HibernateSessionManager.closeSession(session);
        }
        return isInserted;
    }

    /** {@inheritDoc} */
    @Override
    public JSONBean handleHelps(String monthly, List<JSONHelp> helps) throws ServiceException {
        if (logger.isDebugEnabled()) {
            logger.debug("Start handle help data to save");
        }

        if (StringUtils.isEmpty(monthly)) {
            throw new IllegalArgumentException("Monthly must not be null or empty");
        }

        if (CollectionUtils.isEmpty(helps)) {
            throw new IllegalArgumentException("Help object must not be null");
        }

        User user = AuthenticatedUserDetails.getUserPrincipal();
        if (user == null) {
            throw new IllegalArgumentException(
                    "Sorry, you don't have a permission to use this. Please login with right permission");
        }

        try {
            for (int i = 0; i < helps.size(); i++) {
                JSONHelp help = helps.get(i);
                int state = help.getState();

                switch (state) {
                case STATE_DELETE: {
                    boolean deleteState = deleteByIDs(help.getRecID());
                    if (!deleteState) {
                        logger.warn("Could not delete the record with entity's code " + help.getRecID()
                                + " and updNo " + help.getUpdNo());

                        // Update not successful
                        return new JSONBean(Boolean.FALSE, 2, MessageHelper.get(MsgConstants.CM_UPD_M03));
                    }
                    break;
                }
                case STATE_UPDATE: {
                    boolean helpsState = updateHelp(help);
                    if (!helpsState) {
                        logger.warn("Could not update the record with entity's code " + help.getRecID()
                                + " and updNo " + help.getUpdNo());

                        // Update not successful
                        return new JSONBean(Boolean.FALSE, 2, MessageHelper.get(MsgConstants.CM_UPD_M01));
                    }
                    break;
                }
                case STATE_INSERT: {
                    String maximumSeqNo = null;

                    try {
                        final String REC_CODE = "AT013.RecID";
                        maximumSeqNo = serialNumberService.generateUUIDByRecID(REC_CODE);
                    } catch (ServiceException ex) {
                        logger.error(ex.getMessage(), ex);

                        // Error while generate seq 
                        return new JSONBean(Boolean.FALSE, -1, MessageHelper.getSystemError());
                    }

                    if (StringUtils.isEmpty(maximumSeqNo)) {
                        logger.warn("Could not generate a sequence number at this time");

                        // Could not generate a sequence number at this time
                        return new JSONBean(Boolean.FALSE, 2, MessageHelper.get(MsgConstants.CM_UPD_M03));
                    }

                    logger.info("Old serial number is {} and maximum serial number is {}", help.getRecID(),
                            maximumSeqNo);

                    // Creating a new one move transfer for the given sequence number
                    help.setRecID(maximumSeqNo);

                    // Trying to insert...
                    insertHelp(monthly, help);
                    logger.info("Successfully created a new one help record");
                    break;
                }
                default: {
                    break;
                }
                }
            }

            logger.info("Handle submission data from client successfuly");
            return new JSONBean(Boolean.TRUE, 1, MessageHelper.get(MsgConstants.CM_UPD_M02));
        } catch (IllegalArgumentException ex) {
            logger.warn(ex.getMessage());

            // 
            return new JSONBean(Boolean.FALSE, 2, MessageHelper.get(MsgConstants.CM_UPD_M03));
        } catch (ServiceException ex) {
            logger.error(ex.getMessage(), ex);

            //
            return new JSONBean(Boolean.FALSE, -1, MessageHelper.getSystemError());
        }
    }
}