package org.fraunhofer.plugins.hts.service;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.fraunhofer.plugins.hts.model.CausesToHazards;
import org.fraunhofer.plugins.hts.model.ControlToCause;
import org.fraunhofer.plugins.hts.model.Hazard_Causes;
import org.fraunhofer.plugins.hts.model.Hazard_Controls;
import org.fraunhofer.plugins.hts.model.Hazards;
import org.fraunhofer.plugins.hts.model.Risk_Categories;
import org.fraunhofer.plugins.hts.model.Risk_Likelihoods;
import org.fraunhofer.plugins.hts.model.Transfers;
import org.fraunhofer.plugins.hts.view.model.CauseTransfer;
import com.atlassian.activeobjects.external.ActiveObjects;
import com.atlassian.jira.component.ComponentAccessor;
import com.google.common.base.Strings;
import net.java.ao.DBParam;
import net.java.ao.Query;
public class CauseService {
private final ActiveObjects ao;
private final TransferService transferService;
private final HazardService hazardService;
public CauseService(ActiveObjects ao, TransferService transferService, HazardService hazardService) {
this.ao = checkNotNull(ao);
this.transferService = checkNotNull(transferService);
this.hazardService = checkNotNull(hazardService);
}
public Hazard_Causes add(int hazardID, String title, String owner, Risk_Categories risk,
Risk_Likelihoods likelihood, String description, String effects, String safetyFeatures) {
Hazard_Causes cause = ao.create(Hazard_Causes.class, new DBParam("TITLE", title));
Hazards hazard = hazardService.getHazardById(hazardID);
cause.setCauseNumber(hazard.getHazardCauses().length + 1);
cause.setTransfer(0);
cause.setOwner(owner);
cause.setRiskCategory(risk);
cause.setRiskLikelihood(likelihood);
cause.setDescription(description);
cause.setEffects(effects);
cause.setAdditionalSafetyFeatures(safetyFeatures);
cause.setOriginalDate(new Date());
cause.setLastUpdated(new Date());
cause.save();
associateCauseToHazard(hazard, cause);
return cause;
}
public Hazard_Causes updateRegularCause(int causeID, String title, String owner, Risk_Categories risk,
Risk_Likelihoods likelihood, String description, String effects, String safetyFeatures) {
Hazard_Causes cause = getHazardCauseByID(causeID);
cause.setTitle(title);
cause.setOwner(owner);
if (risk != null && cause.getRiskCategory() != null) {
if (risk.getID() != cause.getRiskCategory().getID()) {
cause.setRiskCategory(risk);
}
} else {
cause.setRiskCategory(risk);
}
if (likelihood != null && cause.getRiskLikelihood() != null) {
if (likelihood.getID() != cause.getRiskLikelihood().getID()) {
cause.setRiskLikelihood(likelihood);
}
} else {
cause.setRiskLikelihood(likelihood);
}
cause.setDescription(description);
cause.setEffects(effects);
cause.setAdditionalSafetyFeatures(safetyFeatures);
cause.setLastUpdated(new Date());
cause.save();
return cause;
}
public Hazard_Causes updateTransferredCause(int causeID, String transferReason) {
Hazard_Causes cause = getHazardCauseByID(causeID);
cause.setDescription(transferReason);
cause.setLastUpdated(new Date());
cause.save();
return cause;
}
public List<Hazard_Causes> getAllNonDeletedCausesWithinHazard(Hazards hazard) {
List<Hazard_Causes> nonDeleted = new ArrayList<Hazard_Causes>();
for (Hazard_Causes current : hazard.getHazardCauses()) {
if (Strings.isNullOrEmpty(current.getDeleteReason())) {
nonDeleted.add(current);
}
}
return nonDeleted;
}
public Map<Integer, CauseTransfer> getAllTransferredCauses(Hazards hazard) {
Map<Integer, CauseTransfer> transferredCauses = new HashMap<Integer, CauseTransfer>();
for (Hazard_Causes originCause : hazard.getHazardCauses()) {
if (originCause.getTransfer() != 0) {
Transfers transfer = transferService.getTransferByID(originCause.getTransfer());
if (transfer.getTargetType().equals("CAUSE")) {
// CauseToCause transfer
Hazard_Causes targetCause = getHazardCauseByID(transfer.getTargetID());
if (targetCause.getHazards()[0].getProjectID() == hazard.getProjectID()) {
transferredCauses.put(originCause.getID(),
CauseTransfer.createCauseToCauseTransfer(transfer, originCause, targetCause));
} else {
transferredCauses
.put(originCause.getID(),
CauseTransfer.createMovedProjectTransfer(transfer,
ComponentAccessor.getProjectManager()
.getProjectObj(targetCause.getHazards()[0].getProjectID())
.getName()));
}
} else {
// CauseToHazard transfer
Hazards targetHazard = hazardService.getHazardById(transfer.getTargetID());
if (targetHazard.getProjectID() == hazard.getProjectID()) {
transferredCauses.put(originCause.getID(),
CauseTransfer.createCauseToHazardTransfer(transfer, originCause, targetHazard));
} else {
transferredCauses.put(originCause.getID(),
CauseTransfer.createMovedProjectTransfer(transfer, ComponentAccessor.getProjectManager()
.getProjectObj(targetHazard.getProjectID()).getName()));
}
}
}
}
return transferredCauses;
}
public Hazard_Causes getHazardCauseByID(int causeID) {
final Hazard_Causes[] hazardCause = ao.find(Hazard_Causes.class, Query.select().where("ID=?", causeID));
return hazardCause.length > 0 ? hazardCause[0] : null;
}
public Hazard_Causes[] getHazardCausesByID(Integer[] id) {
if (id == null) {
return null;
} else {
Hazard_Causes[] causesArr = new Hazard_Causes[id.length];
for (int i = 0; i < id.length; i++) {
causesArr[i] = ao.get(Hazard_Causes.class, id[i]);
}
return causesArr;
}
}
public Hazard_Causes addHazardTransfer(int originHazardID, int targetHazardID, String transferReason) {
Hazard_Causes cause = add(originHazardID, "transfer", null, null, null, transferReason, null, null);
int transferID = createTransfer(cause.getID(), "CAUSE", targetHazardID, "HAZARD");
cause.setTransfer(transferID);
cause.save();
return cause;
}
public Hazard_Causes addCauseTransfer(int originHazardID, int targetCauseID, String transferReason) {
Hazard_Causes cause = add(originHazardID, "transfer", null, null, null, transferReason, null, null);
int transferID = createTransfer(cause.getID(), "CAUSE", targetCauseID, "CAUSE");
cause.setTransfer(transferID);
cause.save();
return cause;
}
public Hazard_Causes deleteCause(int causeID, String deleteReason) {
Hazard_Causes cause = getHazardCauseByID(causeID);
if (cause != null) {
cause.setDeleteReason(deleteReason);
if (cause.getTransfer() != 0) {
Transfers transfer = transferService.getTransferByID(cause.getTransfer());
removeTransfer(transfer.getID());
transfer.save();
cause.setTransfer(0);
}
List<Hazard_Controls> orphanControls = hazardService.getOrphanControls(cause.getHazards()[0]);
int controlNum = 0;
if(!orphanControls.isEmpty())
controlNum = orphanControls.get(orphanControls.size() - 1).getControlNumber();
for (Hazard_Controls control : cause.getControls()) {
ao.delete(ao.find(ControlToCause.class,
Query.select().where("CONTROL_ID=? AND CAUSE_ID=?", control.getID(), causeID)));
control.setControlNumber(++controlNum);
control.save();
}
cause.save();
}
return cause;
}
private void associateCauseToHazard(Hazards hazard, Hazard_Causes hazardCause) {
final CausesToHazards causeToHazard = ao.create(CausesToHazards.class);
causeToHazard.setHazard(hazard);
causeToHazard.setHazardCause(hazardCause);
causeToHazard.save();
}
private int createTransfer(int originID, String originType, int targetID, String targetType) {
Transfers transfer = transferService.add(originID, originType, targetID, targetType);
return transfer.getID();
}
private void removeTransfer(int id) {
ao.delete(ao.find(Transfers.class, Query.select().where("ID=?", id)));
}
}