com.webbfontaine.valuewebb.action.pricedb.pdss.PdssSearch.java Source code

Java tutorial

Introduction

Here is the source code for com.webbfontaine.valuewebb.action.pricedb.pdss.PdssSearch.java

Source

package com.webbfontaine.valuewebb.action.pricedb.pdss;

import com.webbfontaine.valuewebb.action.PdHome;
import com.webbfontaine.valuewebb.action.SPDHome;
import com.webbfontaine.valuewebb.cache.PersistenceUtil;
import com.webbfontaine.valuewebb.model.MarketPrice;
import com.webbfontaine.valuewebb.model.Pd;
import com.webbfontaine.valuewebb.model.PreFinSel;
import com.webbfontaine.valuewebb.model.SimpleDocument;
import com.webbfontaine.valuewebb.model.constants.Constants;
import com.webbfontaine.valuewebb.model.constants.Messages;
import com.webbfontaine.valuewebb.model.util.Utils;
import com.webbfontaine.valuewebb.search.UserCriterionUtils;
import com.webbfontaine.valuewebb.search.custom.Search;
import com.webbfontaine.valuewebb.search.custom.StringConditions;
import com.webbfontaine.valuewebb.search.custom.UserCriterion;
import com.webbfontaine.valuewebb.validation.ErrorHandling;
import org.hibernate.Criteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.log.Log;
import org.jboss.seam.log.Logging;

import javax.faces.application.FacesMessage;
import java.util.ArrayList;
import java.util.List;

/**
 * Copyrights 2002-2011 Webb Fontaine
 * This software is the proprietary information of Webb Fontaine.
 * Its use is subject to License terms.
 * User: nigiyan
 * Date: 5/20/11
 */

@Name("pdssSearch")
@BypassInterceptors
public class PdssSearch extends Search {

    private static final Log LOGGER = Logging.getLog(PdssSearch.class);

    private PreFinSel preFinSelTmp = new PreFinSel();
    private Pd instance;

    private Criteria pdCriteria;
    private Criteria mpCriteria;

    private List<Pd> pds = new ArrayList<>();
    private List<MarketPrice> mps = new ArrayList<>();

    private int pdsSearchResultCount;
    private int mpsSearchResultCount;

    private Long pdId;

    public PdssSearch() {
        setCriteriaContainer(new PdssCriteriaContainer());
    }

    public Pd getInstance() {
        return instance;
    }

    public void setInstance(Pd instance) {
        this.instance = instance;
    }

    public Object initByPdInstance() {
        /*pdId is null when audited entity*/
        if (instance != null && pdId != null && pdId
                .equals(instance.getId()) /*link is clicked while pdss is open => need to clear pdss/close*/) {
            instance = null;
            pds.clear();
            mps.clear();
        } else {
            if (instance == null || pdId != null && !instance.getId().equals(pdId)) {
                String viewId = Utils.currentPage();
                if (viewId.contains("PdEdit")) {
                    instance = Utils.getEntityManager().find(Pd.class, pdId);
                } else {
                    if (viewId.contains("SPD")) {
                        List<Pd> spdPds = SPDHome.getInstance().getPds();
                        for (Pd spdPd : spdPds) {
                            if (spdPd.getId().equals(pdId)) {
                                instance = spdPd;
                                break;
                            }
                        }
                    } else {
                        throw new RuntimeException("Unexpected PDSS use case");
                    }
                }
            }

            getCriteriaContainer().getSelectedUserCriteria().clear();
            pds.clear();
            mps.clear();

            List<PreFinSel> pfss = instance.getLoadedPfs();
            for (PreFinSel pfs : pfss) {
                if (pfs.getReferenceDocName().equals(Constants.PD_DOC_NAME)) {
                    Pd pd = Utils.getEntityManager().find(Pd.class, pfs.getReferenceDocId());
                    if (pd != null) {
                        pds.add(pd);
                    }
                } else {
                    MarketPrice mp = Utils.getEntityManager().find(MarketPrice.class, pfs.getReferenceDocId());
                    if (mp != null) {
                        mps.add(mp);
                    }
                }
            }
        }
        return "";
    }

    public PreFinSel extractSelection(SimpleDocument referer) {
        PreFinSel retVal = new PdssUtils(instance).extractSelection((Long) referer.getId(), referer.description());
        if (retVal == null) {
            retVal = new PreFinSel();
        }

        return retVal;
    }

    public String loadDefaultCriteria() {
        PdssCriteriaContainer criteriaContainer = (PdssCriteriaContainer) getCriteriaContainer();
        criteriaContainer.getSelectedUserCriteria().clear();
        UserCriterion uc = criteriaContainer.getDefinedCriterion("hsCode");
        uc.setCondition(StringConditions.STARTS_WITH);
        uc.setValue(instance.getHsCodeD().substring(0, 4));
        criteriaContainer.getSelectedUserCriteria().add(uc);

        uc = criteriaContainer.getDefinedCriterion("used");
        uc.setCondition(StringConditions.EQ);
        uc.setValue(instance.getUsed());
        criteriaContainer.getSelectedUserCriteria().add(uc);

        uc = criteriaContainer.getDefinedCriterion("productDsc");
        uc.setCondition(StringConditions.CONTAINS);
        uc.setValue(instance.getProductDscD());
        criteriaContainer.getSelectedUserCriteria().add(uc);

        uc = criteriaContainer.getDefinedCriterion("ageOfPrice");
        uc.setCondition(StringConditions.LE);
        uc.setValue(90L);
        criteriaContainer.getSelectedUserCriteria().add(uc);

        return "";
    }

    // passed when selection changed
    public PreFinSel getPreFinSelTmp() {
        return preFinSelTmp;
    }

    public void setPreFinSelTmp(PreFinSel preFinSelTmp) {
        this.preFinSelTmp = preFinSelTmp;
    }

    public Object selectionSubmit() {
        PdssUtils pdssUtils = new PdssUtils(instance);
        pdssUtils.updatePFS(preFinSelTmp);

        return null;
    }

    public void arrangeSearchResForSelections() {

        LOGGER.trace("PDSS: ");
        for (PreFinSel pfs : instance.getLoadedPfs()) {
            if (pfs.getReferenceDocName().equals(Constants.PD_DOC_NAME)) {
                Pd pdToShift = null;
                for (Pd searchPd : pds) {
                    if (searchPd.getId().equals(pfs.getReferenceDocId())) {
                        pdToShift = searchPd;
                        break;
                    }
                }
                if (pdToShift == null) {
                    pdToShift = Utils.getEntityManager().find(Pd.class, pfs.getReferenceDocId());

                }
                if (pdToShift != null) {
                    pds.remove(pdToShift);
                    pds.add(0, pdToShift);
                }
            } else {
                // mp
                if (pfs.getReferenceDocName().equals(Constants.MARKET_PRICE_DOC_NAME)) {
                    MarketPrice mpToShift = null;
                    for (MarketPrice searchMp : mps) {
                        if (searchMp.getId().equals(pfs.getReferenceDocId())) {
                            mpToShift = searchMp;
                            break;
                        }
                    }
                    if (mpToShift == null) {
                        mpToShift = Utils.getEntityManager().find(MarketPrice.class, pfs.getReferenceDocId());

                    }
                    if (mpToShift != null) {
                        mps.remove(mpToShift);
                        mps.add(0, mpToShift);
                    }
                } else {
                    throw new RuntimeException("Undefined reference doc name");
                }
            }
        }
    }

    @Override
    public Object search() {
        ErrorHandling.getInstance().removeErrorByMessage(Messages.SEARCH_ARGS_INCORRECT);
        ErrorHandling.getInstance().removeErrorByFieldId(Constants.document_id);
        if (UserCriterionUtils.checkAgeOfPrice(getCriteriaContainer())) {
            try {
                constructCriteria();
                pds = pdCriteria.list();
                mps = mpCriteria.list();

                pdsSearchResultCount = (Integer) pdCriteria.setProjection(Projections.rowCount()).uniqueResult();
                mpsSearchResultCount = (Integer) mpCriteria.setProjection(Projections.rowCount()).uniqueResult();

                LOGGER.debug("Search summary. PD list/count: {0}/{1}, MP list/count: {2}/{3}", pds.size(),
                        pdsSearchResultCount, mps.size(), mpsSearchResultCount);

                arrangeSearchResForSelections();

            } catch (Exception e) {
                LOGGER.warn("", e);
                ErrorHandling.addFacesMessage(null, Messages.SEARCH_ARGS_INCORRECT, FacesMessage.SEVERITY_ERROR);
            }
        }
        return "";
    }

    @Override
    protected boolean isCriteriaValid() {
        return true;
    }

    @Override
    protected Criteria constructCriteria() throws Exception {
        PdssCriteriaContainer criteriaContainer = (PdssCriteriaContainer) getCriteriaContainer();

        criteriaContainer.setEntityClass(Pd.class);
        criteriaContainer.setFakeToRealPropertyMap(PropertyMapProvider.forClass(Pd.class));

        pdCriteria = criteriaContainer.transformUserCriteria(PersistenceUtil.getSession(Utils.getEntityManager()));
        //        pdCriteria.addOrder(Order.desc("id"));
        pdCriteria.setMaxResults(Constants.MAX_RECORDS_IN_ATTACHED_FINDER);
        pdCriteria.add(Restrictions.ne("id", pdId));

        criteriaContainer.setEntityClass(MarketPrice.class);
        criteriaContainer.setFakeToRealPropertyMap(PropertyMapProvider.forClass(MarketPrice.class));

        mpCriteria = criteriaContainer.transformUserCriteria(PersistenceUtil.getSession(Utils.getEntityManager()));
        //        mpCriteria.addOrder(Order.desc("id"));
        mpCriteria.setMaxResults(Constants.MAX_RECORDS_IN_ATTACHED_FINDER);

        return null;
    }

    public List<Pd> getPds() {
        return pds;
    }

    public List<MarketPrice> getMps() {
        return mps;
    }

    public int getPdsSearchResultCount() {
        return pdsSearchResultCount;
    }

    public int getMpsSearchResultCount() {
        return mpsSearchResultCount;
    }

    @Override
    public Object reset() {
        getCriteriaContainer().getSelectedUserCriteria().clear();

        List<Pd> pdsAfterClear = new ArrayList<>();
        List<MarketPrice> mpsAfterClear = new ArrayList<>();
        for (Pd pd : pds) {
            if (extractSelection(pd).getId() != null) {
                pdsAfterClear.add(pd);
            }
        }
        for (MarketPrice mp : mps) {
            if (extractSelection(mp).getId() != null) {
                mpsAfterClear.add(mp);
            }
        }
        pds = pdsAfterClear;
        mps = mpsAfterClear;
        pdsSearchResultCount = 0;
        mpsSearchResultCount = 0;
        return "";
    }

    @Override
    public String desciption() {
        throw new RuntimeException("Unused");
    }

    public Long getPdId() {
        return pdId;
    }

    public void setPdId(Long pdId) {
        this.pdId = pdId;
    }

    @Factory(value = "pdssDisabled", scope = ScopeType.EVENT)
    public static Boolean pdssEditable() {
        PdHome pdHome = PdHome.getComponentInstance(false);
        return !(/*enabled for SPD and PD Edit: */Utils.currentPage().contains("SPD")
                || pdHome != null && !pdHome.isReadOnlyMode());
    }
}