package com.idega.idegaweb.egov.bpm.business.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.logging.Level; import org.jbpm.context.exe.variableinstance.StringInstance; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; 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 com.idega.block.form.business.FormAssetsResolver; import com.idega.block.form.data.XFormSubmission; import com.idega.core.business.DefaultSpringBean; import com.idega.core.persistence.Param; import com.idega.jbpm.data.dao.BPMDAO; import com.idega.presentation.IWContext; import com.idega.user.data.User; import com.idega.util.ArrayUtil; import com.idega.util.ListUtil; @Service @Scope(BeanDefinition.SCOPE_SINGLETON) public class BPMFormsAssetsResolver extends DefaultSpringBean implements FormAssetsResolver { @Autowired private BPMDAO bpmDAO; @Override public List<XFormSubmission> getFilteredOutForms(IWContext iwc, List<XFormSubmission> submissions, List<String> procDefNames) { getLogger().warning("Not implemented!"); return null; } @Override public User getOwner(XFormSubmission submission) { getLogger().warning("Not implemented!"); return null; } @Override public List<String> getNamesOfAvailableProcesses(User user, List<String> processes) { if (user == null) { return null; } try { Set<String> roles = getApplication().getAccessController().getAllRolesForUser(user); if (ListUtil.isEmpty(roles)) { return null; } List<Param> params = new ArrayList<Param>(); String query = "select distinct pd.name from " + ProcessDefinition.class.getName() + " pd, " + ProcessInstance.class.getName() + " pi, " + StringInstance.class.getName() + " v where ("; for (Iterator<String> rolesIter = roles.iterator(); rolesIter.hasNext();) { query += "v.value like '" + rolesIter.next() + "'"; if (rolesIter.hasNext()) { query += " or "; } } query += ") "; if (!ListUtil.isEmpty(processes)) { query += " and pd.name in (:names) "; params.add(new Param("names", processes)); } query += " and pd.id = pi.processDefinition.id and v.processInstance.id = pi.id"; List<String> names = bpmDAO.getResultListByInlineQuery( query, String.class, ArrayUtil.convertListToArray(params) ); return names; } catch (Exception e) { getLogger().log(Level.WARNING, "Error resolving which processes are available for " + user + ", ID: " + user.getId(), e); } return null; } }