package is.idega.idegaweb.egov.bpm.cases.actionhandlers;
import is.idega.idegaweb.egov.cases.business.CasesBusiness;
import is.idega.idegaweb.egov.cases.data.GeneralCase;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.business.IBORuntimeException;
import com.idega.core.accesscontrol.business.LoginSession;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWMainApplication;
import com.idega.idegaweb.egov.bpm.data.CaseProcInstBind;
import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO;
import com.idega.jbpm.BPMContext;
import com.idega.jbpm.exe.BPMFactory;
import com.idega.jbpm.utils.JBPMConstants;
import com.idega.presentation.IWContext;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.User;
import com.idega.util.expression.ELUtil;
/**
* @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a>
* @version $Revision: 1.3 $ Last modified: $Date: 2009/05/28 14:12:01 $ by $Author: valdas $
*/
@Service("assignCaseOwnerHandler")
@Scope("prototype")
public class AssignCaseOwnerHandler implements ActionHandler {
private static final long serialVersionUID = 340054091051722366L;
private Long processInstanceId;
private Integer ownerUserId;
@Autowired
private CasesBPMDAO casesBPMDAO;
@Autowired
private BPMFactory bpmFactory;
@Autowired
private BPMContext bpmContext;
public void execute(ExecutionContext ectx) throws Exception {
CaseProcInstBind cpi = getCasesBPMDAO().find(CaseProcInstBind.class,
processInstanceId);
Integer caseId = cpi.getCaseId();
IWApplicationContext iwac = getIWAC();
CasesBusiness casesBusiness = getCasesBusiness(iwac);
GeneralCase genCase = casesBusiness.getGeneralCase(caseId);
JBPMConstants.bpmLogger.fine("Setting new owner for a case (" + caseId
+ ") to be user id = " + getOwnerUserId());
User ownerUser = null;
if (getOwnerUserId() == null) {
ownerUser = getLoggedInUser();
}
else {
ownerUser = getUserBusiness(iwac).getUser(getOwnerUserId());
}
genCase.setOwner(ownerUser);
genCase.store();
TaskInstance taskInstance = getBpmFactory()
.getProcessManagerByProcessInstanceId(getProcessInstanceId())
.getProcessInstance(getProcessInstanceId())
.getStartTaskInstance().getTaskInstance();
if (ownerUser != null)
taskInstance.setActorId(ownerUser.getId());
getBpmContext().saveProcessEntity(taskInstance);
}
protected User getLoggedInUser() {
try {
LoginSession loginSession = ELUtil.getInstance().getBean(LoginSession.class);
return loginSession.isLoggedIn() ? loginSession.getUser() : null;
} catch(Exception e) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Error getting logged in user", e);
}
return null;
}
public Long getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(Long processInstanceId) {
this.processInstanceId = processInstanceId;
}
public Integer getOwnerUserId() {
return ownerUserId;
}
public void setOwnerUserId(Integer ownerUserId) {
this.ownerUserId = ownerUserId;
}
protected CasesBusiness getCasesBusiness(IWApplicationContext iwac) {
try {
return (CasesBusiness) IBOLookup.getServiceInstance(iwac,
CasesBusiness.class);
} catch (IBOLookupException ile) {
throw new IBORuntimeException(ile);
}
}
protected UserBusiness getUserBusiness(IWApplicationContext iwac) {
try {
return (UserBusiness) IBOLookup.getServiceInstance(iwac,
UserBusiness.class);
} catch (IBOLookupException ile) {
throw new IBORuntimeException(ile);
}
}
private IWApplicationContext getIWAC() {
final IWContext iwc = IWContext.getCurrentInstance();
final IWApplicationContext iwac;
// trying to get iwma from iwc, if available, downgrading to default
// iwma, if not
if (iwc != null) {
iwac = iwc;
} else {
iwac = IWMainApplication.getDefaultIWApplicationContext();
}
return iwac;
}
CasesBPMDAO getCasesBPMDAO() {
return casesBPMDAO;
}
public BPMFactory getBpmFactory() {
return bpmFactory;
}
public void setBpmFactory(BPMFactory bpmFactory) {
this.bpmFactory = bpmFactory;
}
public BPMContext getBpmContext() {
return bpmContext;
}
public void setBpmContext(BPMContext bpmContext) {
this.bpmContext = bpmContext;
}
}