package org.sharegov.cirm.process;
import static org.sharegov.cirm.rest.OperationService.getPersister;
import java.util.ArrayList;
import java.util.List;
import mjson.Json;
import org.sharegov.cirm.BOntology;
import org.sharegov.cirm.CirmTransaction;
import org.sharegov.cirm.legacy.CirmMessage;
import org.sharegov.cirm.utils.GenUtils;
/**
* Simple State Machine that represents the ApprovalProcess of self service SRs.
*
* Approval state transitions:
*
* APPROVAL_PENDING > APPROVED
* APPROVAL_NOT_NEEDED
*
* @author SABBAS
*
**/
public class ApprovalProcess
{
public enum ApprovalState
{
APPROVAL_PENDING, APPROVED, APPROVAL_NOT_NEEDED
};
private Json sr;
private ApprovalState approvalState;
private List<ApprovalSideEffect> sideEffects = new ArrayList<ApprovalSideEffect>();
private BOntology bo;
private List<CirmMessage> emailsToSend = new ArrayList<CirmMessage>();
private ArrayList<BOntology> withMetadata = new ArrayList<BOntology>();
private Json locationInfo = Json.object();
public Json getSr()
{
return sr;
}
public void setSr(Json sr)
{
this.sr = sr;
cleanSR();
approvalState = determineCurrentState();
}
public ApprovalState getApprovalState()
{
return approvalState;
}
public void setApprovalState(ApprovalState approvalState)
{
this.approvalState = approvalState;
}
public List<ApprovalSideEffect> getSideEffects()
{
return sideEffects;
}
public void setSideEffects(List<ApprovalSideEffect> sideEffects)
{
this.sideEffects = sideEffects;
}
public void approve() throws ApprovalException
{
// if (approvalState.equals(ApprovalState.APPROVAL_PENDING))
// {
getPersister().getStore().txn(new CirmTransaction<Json> () {
@Override
public Json call() throws Exception
{
for (ApprovalSideEffect sideEffect : sideEffects)
{
sideEffect.execute(ApprovalProcess.this);
}
return GenUtils.ok().set("bo", ApprovalProcess.this.getBOntology().toJSON());
}
});
// }
// else
// {
// if (approvalState.equals(ApprovalState.APPROVED))
// {
// throw new ApprovalException("The SR has already been approved.");
// }
// else
// {
// throw new ApprovalException(
// "Cannot approve SR, invalid state transition.");
// }
//
// }
}
private ApprovalState determineCurrentState()
{
// TODO finish impl.
// if SR intake method is IPHONE, ANDROID, OR WEB INTAKE
// and SR status is O-PENDNG
// and there is no prior status history
// then current state is APPROVAL_PENDING.
Json bo = sr.has("bo")? sr.at("bo") : sr;
if(bo.at("properties").at("legacy:hasIntakeMethod").at("iri").asString().endsWith("IPHONE")
|| bo.at("properties").at("legacy:hasIntakeMethod").at("iri").asString().endsWith("ANDROID")
|| bo.at("properties").at("legacy:hasIntakeMethod").at("iri").asString().endsWith("WEB"))
{
if(bo.at("properties").at("legacy:hasStatus").at("iri").asString().endsWith("O-PENDNG"))
{
return ApprovalState.APPROVAL_PENDING;
}
else if(bo.at("properties").at("legacy:hasStatus").at("iri").asString().endsWith("O-OPEN"))
{
return ApprovalState.APPROVED;
}
else
{
return ApprovalState.APPROVAL_NOT_NEEDED;
}
}
else
{
return ApprovalState.APPROVAL_NOT_NEEDED;
}
}
public BOntology getBOntology() {
if(bo == null)
{
if(sr != null)
{
bo = BOntology.makeRuntimeBOntology(sr);
}
}
return bo;
}
public List<CirmMessage> getEmailsToSend()
{
return emailsToSend;
}
public void setEmailsToSend(List<CirmMessage> emailsToSend)
{
this.emailsToSend = emailsToSend;
}
public ArrayList<BOntology> getWithMetadata()
{
return withMetadata;
}
public void setWithMetadata(ArrayList<BOntology> withMetadata)
{
this.withMetadata = withMetadata;
}
public Json getLocationInfo()
{
return locationInfo;
}
public void setLocationInfo(Json locationInfo)
{
this.locationInfo = locationInfo;
}
private void cleanSR()
{
Json bo = sr.has("bo")? sr.at("bo"): sr;
bo.at("properties").atDel("actorEmails");
bo.at("properties").atDel("hasRemovedAttachment");
}
}