package is.idega.idegaweb.egov.bpm.cases.search.impl; import is.idega.idegaweb.egov.cases.data.GeneralCase; import is.idega.idegaweb.egov.cases.data.GeneralCaseHome; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import javax.ejb.FinderException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.block.process.business.CasesRetrievalManager; import com.idega.block.process.data.Case; import com.idega.block.process.data.CaseHome; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.util.CoreUtil; import com.idega.util.ListUtil; import com.idega.util.StringUtil; @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CaseNumberFilter extends DefaultCasesListSearchFilter { @Override public List<Integer> getSearchResults(List<Integer> casesIds) { String caseNumber = getCaseNumber(); String loweredCaseNumber = caseNumber.toLowerCase(CoreUtil.getIWContext().getCurrentLocale()); List<Integer> casesByNumberIds = new ArrayList<Integer>(); // "BPM" cases List<Long> bpmCases = null; try { bpmCases = getCasesBPMDAO().getCaseIdsByCaseNumber(loweredCaseNumber); } catch(Exception e) { getLogger().log(Level.WARNING, "Exception while resolving case ids by case number = " + loweredCaseNumber, e); } if (ListUtil.isEmpty(bpmCases)) { getLogger().log(Level.INFO, "No BPM cases found by number: " + caseNumber); } else { getLogger().log(Level.INFO, "BPM cases by number (" + caseNumber + "): " + bpmCases); casesByNumberIds.addAll(getConvertedFromNumbers(bpmCases)); } // Old cases List<Integer> simpleCases = CasesRetrievalManager.CASE_LIST_TYPE_USER.equals(getCaseListType()) ? getUserCasesByNumber(loweredCaseNumber) : getGeneralCasesByNumber(loweredCaseNumber); if (ListUtil.isEmpty(simpleCases)) { getLogger().log(Level.INFO, "No simple cases found by number: " + caseNumber); } else { getLogger().log(Level.INFO, "Simple cases by number (" + caseNumber + "): " + simpleCases); for (Integer id: simpleCases) { if (!casesByNumberIds.contains(id)) { casesByNumberIds.add(id); } } } if (ListUtil.isEmpty(casesByNumberIds)) { getLogger().log(Level.INFO, "No cases found by number: " + caseNumber); } else { getLogger().log(Level.INFO, "Cases found by number (" + caseNumber + "): " + casesByNumberIds); } return casesByNumberIds; } @Override protected String getInfo() { return "Looking for cases by number: " + getCaseNumber(); } private List<Integer> getGeneralCasesByNumber(String caseNumber) { GeneralCaseHome caseHome = null; try { caseHome = (GeneralCaseHome) IDOLookup.getHome(GeneralCase.class); } catch (IDOLookupException e) { e.printStackTrace(); } if (caseHome == null) { return null; // Unable to search for general cases } Collection<Integer> casesByNumber = null; try { casesByNumber = caseHome.getCasesIDsByCriteria(caseNumber, null, null, null, null, null, null, null, true); } catch (FinderException e) { e.printStackTrace(); } if (ListUtil.isEmpty(casesByNumber)) { return null; // No results } return getUniqueIds(casesByNumber); } private List<Integer> getUserCasesByNumber(String number) { CaseHome caseHome = getCaseHome(); if (caseHome == null) { return null; } Collection<Integer> casesByNumber = null; try { casesByNumber = caseHome.findIDsByCriteria(number, null, null, null, null, null, null, null, true); } catch (FinderException e) { e.printStackTrace(); } return getUniqueIds(casesByNumber); } private CaseHome getCaseHome() { try { return (CaseHome) IDOLookup.getHome(Case.class); } catch (IDOLookupException e) { e.printStackTrace(); } return null; } @Override protected String getFilterKey() { return getCaseNumber(); } @Override protected boolean isFilterKeyDefined() { String caseNumber = getCaseNumber(); if (StringUtil.isEmpty(caseNumber)) { getLogger().log(Level.INFO, "Case number is undefined, not filtering by it!"); return false; } return true; } }