package is.idega.idegaweb.egov.bpm.cases.board;
import is.idega.idegaweb.egov.bpm.IWBundleStarter;
import is.idega.idegaweb.egov.bpm.business.TaskViewerHelper;
import is.idega.idegaweb.egov.cases.presentation.CasesBoardViewer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
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.Propagation;
import org.springframework.transaction.annotation.Transactional;
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.exe.BPMFactory;
import com.idega.jbpm.exe.ProcessInstanceW;
import com.idega.jbpm.exe.TaskInstanceW;
import com.idega.jbpm.view.View;
import com.idega.jbpm.view.ViewSubmission;
import com.idega.presentation.IWContext;
import com.idega.util.ArrayUtil;
import com.idega.util.CoreConstants;
import com.idega.util.CoreUtil;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
@Transactional
@Service("boardCasesManagerBean")
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class BoardCasesManagerFacade extends DefaultSpringBean {
@Autowired
private CasesBPMDAO casesBPMDAO;
@Autowired
private BPMFactory bpmFactory;
@Autowired
private TaskViewerHelper taskViewer;
@Transactional(propagation = Propagation.REQUIRED)
public AdvancedProperty setCaseVariableValue(Integer caseId, String variableName, String value, String role, String backPage, Integer valueIndex,
Integer totalValues) {
if (caseId == null || StringUtil.isEmpty(variableName) || StringUtil.isEmpty(value))
return null;
boolean useNumberSign = valueIndex != null && totalValues != null;
if (valueIndex == null)
valueIndex = 0;
if (totalValues == null)
totalValues = 1;
IWContext iwc = CoreUtil.getIWContext();
if (iwc == null || !iwc.isLoggedOn())
return null;
if (!StringUtil.isEmpty(role) && !iwc.hasRole(role))
return null;
try {
if (value.equals("no_value"))
value = CoreConstants.EMPTY;
Long processInstanceId = casesBPMDAO.getCaseProcInstBindByCaseId(caseId).getProcInstId();
ProcessInstanceW piw = bpmFactory.getProcessInstanceW(processInstanceId);
String taskName = "Grading";
List<TaskInstanceW> allTasks = piw.getUnfinishedTaskInstancesForTask(taskName);
if (ListUtil.isEmpty(allTasks)) {
getLogger().warning("No tasks instances were found for task = " + taskName + " by process instance: " + processInstanceId);
return null;
}
// should be only one task instance
if (allTasks.size() > 1)
getLogger().warning("More than one task instance found for task = " + taskName + " when only one expected");
TaskInstanceW sharedTIW = allTasks.iterator().next();
Long sharedTaskInstanceId = sharedTIW.getTaskInstanceId();
View view = sharedTIW.loadView();
// TODO: move getViewSubmission to view too
// TODO: add addVariable and so to the viewSubmission
ViewSubmission viewSubmission = bpmFactory.getViewSubmission();
Map<String, Object> variables = view.resolveVariables();
if (variables == null)
variables = new HashMap<String, Object>();
if (useNumberSign) {
String[] currentValues = null;
Object currentValue = variables.get(variableName);
if (currentValue instanceof String)
currentValues = currentValue.toString().split(CoreConstants.HASH);
StringBuffer newValue = new StringBuffer();
for (int i = 0; i < totalValues; i++) {
if (i == valueIndex)
newValue.append(value);
else {
if (ArrayUtil.isEmpty(currentValues))
newValue.append(String.valueOf(0));
else {
if (i < currentValues.length)
newValue.append(currentValues[i]);
else
newValue.append(String.valueOf(0));
}
}
if (i < totalValues)
newValue.append(CoreConstants.HASH);
}
value = newValue.toString();
}
variables.put(variableName, value);
viewSubmission.populateParameters(view.resolveParameters());
viewSubmission.populateVariables(variables);
Long viewTaskInstanceId = view.getTaskInstanceId();
TaskInstanceW viewTIW = bpmFactory.getProcessManagerByTaskInstanceId(viewTaskInstanceId).getTaskInstance(viewTaskInstanceId);
viewTIW.submit(viewSubmission);
return new AdvancedProperty(value, taskViewer.getLinkToTheTask(iwc, caseId.toString(), sharedTaskInstanceId.toString(), backPage));
} catch (Exception e) {
getLogger().log(Level.SEVERE, "Error saving variable '" + variableName + "' with value '" + value + "' for case: " + caseId, e);
}
return null;
}
public String saveCustomizedColumns(String uuid, List<String> columns) {
String errorMessage = "Some error occurred. Reload a page and try again";
IWResourceBundle iwrb = getResourceBundle(getBundle(IWBundleStarter.IW_BUNDLE_IDENTIFIER));
if (StringUtil.isEmpty(uuid) || CoreConstants.MINUS.equals(uuid)) {
getLogger().warning("UUID is not provided of the " + CasesBoardViewer.class + " UI component");
return iwrb.getLocalizedString("some_error_occurred", errorMessage);
}
if (ListUtil.isEmpty(columns)) {
getLogger().warning("No columns selected");
return iwrb.getLocalizedString("no_columns_selected", "Please select some columns to display");
}
IWContext iwc = CoreUtil.getIWContext();
iwc.setSessionAttribute(CasesBoardViewer.PARAMETER_CUSTOM_COLUMNS + uuid, columns);
return null;
}
public String resetCustomizedColumns(String uuid) {
IWResourceBundle iwrb = getResourceBundle(getBundle(IWBundleStarter.IW_BUNDLE_IDENTIFIER));
if (StringUtil.isEmpty(uuid))
return iwrb.getLocalizedString("error_resetting_custom_columns", "Some error occurred. Reload a page and try again");
IWContext iwc = CoreUtil.getIWContext();
iwc.removeSessionAttribute(CasesBoardViewer.PARAMETER_CUSTOM_COLUMNS + uuid);
return null;
}
}