package com.idega.idegaweb.egov.bpm.presentation; import is.idega.idegaweb.egov.bpm.IWBundleStarter; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.idega.block.process.presentation.beans.CasesListCustomizer; import com.idega.builder.bean.AdvancedProperty; import com.idega.core.business.DefaultSpringBean; import com.idega.idegaweb.IWResourceBundle; import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO; import com.idega.jbpm.bean.VariableInstanceInfo; import com.idega.jbpm.data.VariableInstanceQuerier; import com.idega.jbpm.utils.JBPMConstants; import com.idega.jbpm.variables.MultipleSelectionVariablesResolver; import com.idega.util.CoreConstants; import com.idega.util.ListUtil; import com.idega.util.StringUtil; import com.idega.util.datastructures.map.MapUtil; import com.idega.util.expression.ELUtil; public abstract class DefaultCasesListCustomizer extends DefaultSpringBean implements CasesListCustomizer { @Autowired private CasesBPMDAO casesBPMDAO; @Autowired private VariableInstanceQuerier variablesQuerier; protected CasesBPMDAO getCasesBPMDAO() { if (casesBPMDAO == null) ELUtil.getInstance().autowire(this); return casesBPMDAO; } protected void setCasesBPMDAO(CasesBPMDAO casesBPMDAO) { this.casesBPMDAO = casesBPMDAO; } protected VariableInstanceQuerier getVariablesQuerier() { if (variablesQuerier == null) ELUtil.getInstance().autowire(this); return variablesQuerier; } protected void setVariablesQuerier(VariableInstanceQuerier variablesQuerier) { this.variablesQuerier = variablesQuerier; } protected String getLocalizedHeader(IWResourceBundle iwrb, String key) { return iwrb.getLocalizedString(JBPMConstants.VARIABLE_LOCALIZATION_PREFIX.concat(key), key); } @Override public List<String> getHeaders(List<String> headersKeys) { if (ListUtil.isEmpty(headersKeys)) return null; List<String> headers = new ArrayList<String>(); IWResourceBundle iwrb = getResourceBundle(getBundle(IWBundleStarter.IW_BUNDLE_IDENTIFIER)); for (String key: headersKeys) headers.add(getLocalizedHeader(iwrb, key)); return headers; } @Override public Map<String, String> getHeadersAndVariables(List<String> headersKeys) { if (ListUtil.isEmpty(headersKeys)) return null; Map<String, String> headers = new LinkedHashMap<String, String>(headersKeys.size()); IWResourceBundle iwrb = getResourceBundle(getBundle(IWBundleStarter.IW_BUNDLE_IDENTIFIER)); for (String key: headersKeys) headers.put(key, getLocalizedHeader(iwrb, key)); return headers; } private MultipleSelectionVariablesResolver getResolver(String name) { Map<String, Boolean> resolvers = getCache("multipleSelectionVariablesResolverCache"); String key = MultipleSelectionVariablesResolver.BEAN_NAME_PREFIX + name; Boolean validResolver = resolvers.get(key); MultipleSelectionVariablesResolver resolver = null; if (validResolver == null) { try { resolver = ELUtil.getInstance().getBean(key); } catch (Exception e) {} validResolver = resolver != null; resolvers.put(key, validResolver); } if (resolver != null) return resolver; if (validResolver != null && validResolver) return ELUtil.getInstance().getBean(key); return null; } protected AdvancedProperty getLabel(VariableInstanceInfo variable) { String name = variable.getName(); MultipleSelectionVariablesResolver resolver = getResolver(name); if (resolver != null) return new AdvancedProperty(name, resolver.isValueUsedForCaseList() ? resolver.getPresentation(variable.getValue().toString()) : resolver.getKeyPresentation(variable.getProcessInstanceId(), variable.getValue().toString()) ); return new AdvancedProperty(name, variable.getValue().toString()); } @Override public Map<String, Map<String, String>> getLabelsForHeaders(List<String> casesIds, List<String> headersKeys) { if (ListUtil.isEmpty(casesIds) || ListUtil.isEmpty(headersKeys)) { getLogger().warning("There are no cases IDs or/and headers provided"); return null; } Map<Long, List<VariableInstanceInfo>> vars = getCasesBPMDAO().getBPMValuesByCasesIdsAndVariablesNames(casesIds, headersKeys); if (MapUtil.isEmpty(vars)) { getLogger().warning("There are no values for cases " + casesIds + " and variables " + headersKeys); return null; } // Resolving labels Map<String, Map<String, String>> labels = new LinkedHashMap<String, Map<String,String>>(); Map<String, Long> mappings = new HashMap<String, Long>(); for (Long procId: vars.keySet()) { List<VariableInstanceInfo> procVars = vars.get(procId); if (ListUtil.isEmpty(procVars)) continue; Map<String, String> caseLabels = null; for (VariableInstanceInfo info: procVars) { String caseId = info.getCaseId(); if (StringUtil.isEmpty(caseId)) continue; mappings.put(caseId, procId); caseLabels = labels.get(caseId); if (caseLabels == null) { caseLabels = new HashMap<String, String>(); labels.put(caseId, caseLabels); } Serializable value = info.getValue(); if (value == null) continue; AdvancedProperty label = getLabel(info); caseLabels.put(label.getId(), label.getValue()); } } // Checking if everything was resolved Map<String, List<String>> missingLabels = new HashMap<String, List<String>>(); for (String caseId: labels.keySet()) { for (String headerKey: headersKeys) { Map<String, String> caseLabels = labels.get(caseId); if (caseLabels.containsKey(headerKey) && !StringUtil.isEmpty(caseLabels.get(headerKey))) continue; List<String> varNames = missingLabels.get(caseId); if (varNames == null) { varNames = new ArrayList<String>(); missingLabels.put(caseId, varNames); } varNames.add(headerKey); } } if (!MapUtil.isEmpty(missingLabels)) { getLogger().info("There are missing labels: " + missingLabels + " will try to resolve them"); doResolveMissingLabels(labels, missingLabels); } return labels; } /** * Resolves missing values * * @param labels: case ID -> variable name: value * @param missingLabels: case ID -> variable names */ protected void doResolveMissingLabels(Map<String, Map<String, String>> labels, Map<String, List<String>> missingLabels) { if (MapUtil.isEmpty(labels) || MapUtil.isEmpty(missingLabels)) return; for (String caseId: missingLabels.keySet()) { List<String> varNames = missingLabels.get(caseId); if (ListUtil.isEmpty(varNames)) continue; getLogger().warning("Missing labels for case (" + caseId + "): " + varNames); Map<String, String> caseLabels = labels.get(caseId); for (String varName: varNames) { if (!caseLabels.containsKey(varName)) caseLabels.put(varName, CoreConstants.MINUS); } } } }