package com.idega.idegaweb.egov.bpm.business;
import is.idega.idegaweb.egov.cases.business.CaseArtifactsProvider;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.idega.idegaweb.egov.bpm.data.CaseProcInstBind;
import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO;
import com.idega.jbpm.bean.VariableInstanceInfo;
import com.idega.jbpm.data.VariableInstanceQuerier;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
@Service("bpmCaseArtifactsProvider")
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class BPMCaseArtifactsProvider implements CaseArtifactsProvider {
private static final Logger LOGGER = Logger.getLogger(BPMCaseArtifactsProvider.class.getName());
@Autowired
private CasesBPMDAO casesBPMDAO;
@Autowired
private VariableInstanceQuerier variablesQuerier;
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
public <T extends Serializable> T getVariableValue(Object caseId, String variableName) {
if (caseId == null || StringUtil.isEmpty(variableName)) {
return null;
}
CaseProcInstBind bind = null;
try {
bind = casesBPMDAO.getCaseProcInstBindByCaseId(Integer.valueOf(caseId.toString()));
} catch(Exception e) {
LOGGER.log(Level.WARNING, "Error getting bind by case id: " + caseId);
}
if (bind == null) {
return null;
}
Long procInstId = bind.getProcInstId();
Collection<VariableInstanceInfo> variables = null;
try {
variables = variablesQuerier.getVariablesByProcessInstanceIdAndVariablesNames(Arrays.asList(variableName), Arrays.asList(procInstId), false, false);
} catch(Exception e) {
LOGGER.log(Level.WARNING, "Error getting variable '"+variableName+"' from process instance: " + procInstId, e);
}
if (ListUtil.isEmpty(variables)) {
return null;
}
for (VariableInstanceInfo variable: variables) {
String name = variable.getName();
if (StringUtil.isEmpty(name)) {
continue;
}
if (name.equals(variableName)) {
Serializable value = variable.getValue();
return value == null ? null : (T) value;
}
}
return null;
}
}