package is.idega.idegaweb.egov.bpm.business; import is.idega.idegaweb.egov.bpm.cases.presentation.beans.CasesBPMAssetsState; import is.idega.idegaweb.egov.cases.presentation.CaseViewer; import is.idega.idegaweb.egov.cases.presentation.CasesProcessor; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.jbpm.graph.exe.ProcessInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.idega.block.process.presentation.UserCases; import com.idega.builder.business.BuilderLogic; import com.idega.builder.business.BuilderLogicWrapper; import com.idega.idegaweb.IWMainApplication; import com.idega.jbpm.exe.BPMFactory; import com.idega.jbpm.exe.ProcessInstanceW; import com.idega.jbpm.exe.TaskInstanceW; import com.idega.jbpm.identity.BPMUser; import com.idega.presentation.IWContext; import com.idega.util.CoreUtil; import com.idega.util.StringUtil; import com.idega.util.URIUtil; import com.idega.util.datastructures.map.MapUtil; @Service @Scope("singleton") @Transactional public class TaskViewerHelperImp implements TaskViewerHelper { private static final Logger LOGGER = Logger.getLogger(TaskViewerHelperImp.class.getName()); public static final String PROCESS_INSTANCE_ID_PARAMETER = "processInstanceId"; public static final String TASK_NAME_PARAMETER = "taskName"; public static final String CASE_ID_PARAMETER = "caseId"; public static final String BACK_PAGE_PARAMETER = "backPage"; public static final String TASK_VIEWER_PAGE_REQUESTED_PARAMETER = "taskViewerPageRequested"; @Autowired private BuilderLogicWrapper builderLogicWrapper; @Autowired private BPMFactory bpmFactory; /* * (non-Javadoc) * @see is.idega.idegaweb.egov.bpm.business.TaskViewerHelper#getLinksToTheTaskRedirector(com.idega.presentation.IWContext, java.util.Map, java.lang.String, java.lang.String) */ @Override public Map<Long, String> getLinksToTheTaskRedirector( IWContext iwc, Map<Long, ProcessInstance> relations, boolean backPage, String taskName) { if (iwc == null || StringUtil.isEmpty(taskName) || MapUtil.isEmpty(relations)) { return Collections.emptyMap(); } Map<Long, String> casesWithLinks = new HashMap<Long, String>(relations.size()); String pageURIToAssetsView = BuilderLogic.getInstance().getFullPageUrlByPageType( iwc, "bpm_assets_view", true); String baseUri = getCurrentPageUri(iwc); if (StringUtil.isEmpty(baseUri)) { LOGGER.warning("Failed to get base uri for page!"); return Collections.emptyMap(); } for (Long theCase: relations.keySet()) { ProcessInstance piw = relations.get(theCase); URIUtil uriUtil = null; if (piw.hasEnded()) { uriUtil = new URIUtil(pageURIToAssetsView); uriUtil.setParameter("piId", String.valueOf(piw.getId())); } else { uriUtil = new URIUtil(baseUri); uriUtil.setParameter(TASK_VIEWER_PAGE_REQUESTED_PARAMETER, Boolean.TRUE.toString()); uriUtil.setParameter(CASE_ID_PARAMETER, theCase.toString()); uriUtil.setParameter(PROCESS_INSTANCE_ID_PARAMETER, String.valueOf(piw.getId())); uriUtil.setParameter(TASK_NAME_PARAMETER, taskName); if (backPage) { uriUtil.setParameter(BACK_PAGE_PARAMETER, baseUri); } } casesWithLinks.put( theCase, iwc.getIWMainApplication().getTranslatedURIWithContext(uriUtil.getUri())); } return casesWithLinks; } /** * * @author <a href="mailto:martynas@idega.is">Martynas StakÄ—</a> */ protected String getCurrentPageUri(IWContext iwc) { String uri = null; if (CoreUtil.isSingleComponentRenderingProcess(iwc)) { try { uri = getBuilderLogicWrapper().getBuilderService(iwc).getCurrentPageURI(iwc); } catch(Exception e) { LOGGER.log(Level.WARNING, "Error getting current page's uri!", e); } } if (StringUtil.isEmpty(uri)) { uri = iwc.getRequestURI(); } return uri; } public String getLinkToTheTaskRedirector(IWContext iwc, String basePage, String caseId, Long processInstanceId, String backPage, String taskName) { if (iwc == null || StringUtil.isEmpty(basePage) || StringUtil.isEmpty(taskName)) { return null; } URIUtil uriUtil = null; if (getBpmFactory().getProcessInstanceW(processInstanceId).hasEnded()) { uriUtil = new URIUtil(BuilderLogic.getInstance().getFullPageUrlByPageType(iwc, "bpm_assets_view", true)); uriUtil.setParameter("piId", String.valueOf(processInstanceId)); return iwc.getIWMainApplication().getTranslatedURIWithContext(uriUtil.getUri()); } uriUtil = new URIUtil(basePage); uriUtil.setParameter(TASK_VIEWER_PAGE_REQUESTED_PARAMETER, Boolean.TRUE.toString()); uriUtil.setParameter(CASE_ID_PARAMETER, caseId); uriUtil.setParameter(PROCESS_INSTANCE_ID_PARAMETER, String.valueOf(processInstanceId)); uriUtil.setParameter(TASK_NAME_PARAMETER, taskName); if (!StringUtil.isEmpty(backPage)) { uriUtil.setParameter(BACK_PAGE_PARAMETER, backPage); } return iwc.getIWMainApplication().getTranslatedURIWithContext(uriUtil.getUri()); } public String getLinkToTheTask(IWContext iwc, String caseId, String taskInstanceId, String backPage) { URIUtil uriUtil = new URIUtil(getPageUriForTaskViewer(iwc)); uriUtil.setParameter(CasesProcessor.PARAMETER_ACTION, String.valueOf(UserCases.ACTION_CASE_MANAGER_VIEW)); uriUtil.setParameter(CaseViewer.PARAMETER_CASE_PK, caseId); uriUtil.setParameter(CasesBPMAssetsState.TASK_INSTANCE_ID_PARAMETER, taskInstanceId); if (!StringUtil.isEmpty(backPage)) { uriUtil.setParameter(CasesBPMAssetsState.CASES_ASSETS_SPECIAL_BACK_PAGE_PARAMETER, backPage.toString()); } return IWMainApplication.getDefaultIWMainApplication().getTranslatedURIWithContext(uriUtil.getUri()); } public String getPageUriForTaskViewer(IWContext iwc) { String uri = getBuilderLogicWrapper().getBuilderService(iwc).getFullPageUrlByPageType(iwc, BPMUser.defaultAssetsViewPageType, true); return StringUtil.isEmpty(uri) ? iwc.getRequestURI() : uri; } public String getTaskInstanceIdForTask(Long processInstanceId, String taskName) { if (processInstanceId == null || StringUtil.isEmpty(taskName)) { LOGGER.warning("Insufficient data: process instance ID: " + processInstanceId + ", task name: " + taskName); return null; } try { ProcessInstanceW piw = getBpmFactory().getProcessInstanceW(processInstanceId); TaskInstanceW gradingTIW = piw.getSingleUnfinishedTaskInstanceForTask(taskName); if (gradingTIW != null) return String.valueOf(gradingTIW.getTaskInstanceId()); else { LOGGER.log(Level.WARNING, "No grading task found for processInstance="+processInstanceId); return null; } } catch (Exception e) { LOGGER.log(Level.WARNING, "Error getting grading task instance for process = " + processInstanceId, e); return null; } } public BuilderLogicWrapper getBuilderLogicWrapper() { return builderLogicWrapper; } public void setBuilderLogicWrapper(BuilderLogicWrapper builderLogicWrapper) { this.builderLogicWrapper = builderLogicWrapper; } public BPMFactory getBpmFactory() { return bpmFactory; } public void setBpmFactory(BPMFactory bpmFactory) { this.bpmFactory = bpmFactory; } }