blob: 5b3cf341652949d35099d750bf0fbd31b131fd8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Parasoft.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Janusz Studzizba - initial API and implementation
* Dariusz Oszczedlowski - initial API and implementation
* Magdalena Gniewek - initial API and implementation
* Michal Wlodarczyk - initial API and implementation
*******************************************************************************/
package org.eclipse.opencert.impactanalysis.relations;
import org.eclipse.opencert.apm.assuranceassets.assuranceasset.EventKind;
import org.eclipse.opencert.infra.general.general.ChangeEffectKind;
import org.eclipse.opencert.apm.baseline.baseline.BaseArtefact;
import org.eclipse.opencert.apm.baseline.baseline.BaseArtefactRel;
import org.eclipse.opencert.evm.evidspec.evidence.Artefact;
import org.eclipse.opencert.evm.evidspec.evidence.ArtefactRel;
import org.eclipse.opencert.storage.cdo.CDOStorageUtil;
public class ArtefactsRelationImpactFactory
{
public static IArtefactRelationImpact createArtefactsRelationImpact(int recursionDepth, ArtefactRel originalArtefactRel,
EventKind impactingEventKind)
{
ChangeEffectKind impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(originalArtefactRel.getModificationEffect(),
originalArtefactRel.getRevocationEffect(), impactingEventKind);
if (impactedChangeEffectKind == null) {
return null;
}
return new ArtefactsRelationImpact(recursionDepth, originalArtefactRel, impactedChangeEffectKind, impactingEventKind);
}
public static IArtefactRelationImpact createArtefactsRelationImpact(int recursionDepth, BaseArtefactRel originalBaseArtefactRel,
EventKind impactingEventKind)
{
ChangeEffectKind impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(originalBaseArtefactRel.getModificationEffect(),
originalBaseArtefactRel.getRevocationEffect(), impactingEventKind);
if (impactedChangeEffectKind == null) {
return null;
}
return new BaseArtefactsRelationImpact(recursionDepth, originalBaseArtefactRel, impactedChangeEffectKind, impactingEventKind);
}
public static IArtefactRelationImpact createEvidenceMappedToBaseArtefactImpact(int recursionDepth, Artefact impactingArtefact,
BaseArtefact impactedMappedBaseArtefact, EventKind impactingEventKind, IArtefactRelationImpact sourceArtefactRelationImpact)
{
ChangeEffectKind impactedChangeEffectKind = null;
//in this case this means that this is modify/revoke on an artefact mapped to this baseartefact, so we should react as in case of
//first artefact - react only on modify and revoke (user calling "validate" on an artefact he is altering himself has no sense)
if (sourceArtefactRelationImpact == null) {
impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(
ChangeEffectKind.MODIFY,
ChangeEffectKind.REVOKE,
impactingEventKind);
} else {
//in this case we want to mimic the ArtefactRel that propagated to mapped Artefact. We threat mapped BaseArtefact just like
//this Artefact, so impact should be exactly the same
if (ArtefactRelationType.DIRECT_EVIDENCE_RELATION.equals(sourceArtefactRelationImpact.getArtefactRelationType())) {
ArtefactsRelationImpact artefactRelationImpactToMimic = (ArtefactsRelationImpact)sourceArtefactRelationImpact;
impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(
artefactRelationImpactToMimic.getImpactingArtefactRelModificationEffect(),
artefactRelationImpactToMimic.getImpactingArtefactRelRevocationEffect(),
impactingEventKind);
}
if (ArtefactRelationType.BASELINE_TO_EVIDENCE_VIA_MAP_RELATION.equals(sourceArtefactRelationImpact.getArtefactRelationType())) {
BaseArtefactMappedToArtefactRelationImpact baseArtefactMappedToArtefactRelationImpact =
(BaseArtefactMappedToArtefactRelationImpact)sourceArtefactRelationImpact;
//this block is to prevent the turn-around back from Artefact to BaseArtefact that we have just came.
Long impactedMappedArtefactCDOId = CDOStorageUtil.getCDOId(impactedMappedBaseArtefact);
Long originallyImpactingBaseArtefactCDOId = baseArtefactMappedToArtefactRelationImpact.getImpactingArtefactCDOId();
if (impactedMappedArtefactCDOId != null && impactedMappedArtefactCDOId.equals(originallyImpactingBaseArtefactCDOId)) {
return null;
}
impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(
baseArtefactMappedToArtefactRelationImpact.getImpactingBaseArtefactRelModificationEffect(),
baseArtefactMappedToArtefactRelationImpact.getImpactingBaseArtefactRelRevocationEffect(),
impactingEventKind);
}
}
if (impactedChangeEffectKind == null) {
return null;
}
ArtefactToMappedBaseArtefactRelationImpact artefactToMappedBaseArtefactRelationImpact = new ArtefactToMappedBaseArtefactRelationImpact(
recursionDepth, impactingArtefact, impactedMappedBaseArtefact, impactedChangeEffectKind, impactingEventKind);
return artefactToMappedBaseArtefactRelationImpact;
}
public static IArtefactRelationImpact createBaseArtefactMappedToEvidenceImpact(
int recursionDepth, BaseArtefact baseArtefact,
Artefact mappedArtefact, EventKind impactingEventKind, IArtefactRelationImpact sourceArtefactRelationImpact)
{
if (sourceArtefactRelationImpact == null ||
!ArtefactRelationType.DIRECT_BASELINE_RELATION.equals(sourceArtefactRelationImpact.getArtefactRelationType())) {
throw new IllegalStateException("Impact analysis from Baseline to Evidence can performed only in a chain in which previous relation was of type"
+ ArtefactRelationType.DIRECT_BASELINE_RELATION + ". Offending BaseArtefact: " + baseArtefact);
}
BaseArtefactsRelationImpact baseArtefactsRelationImpact = (BaseArtefactsRelationImpact)sourceArtefactRelationImpact;
ChangeEffectKind impactingBaseArtefactRelModificationEffect = baseArtefactsRelationImpact.getImpactingBaseArtefactRelModificationEffect();
ChangeEffectKind impactingBaseArtefactRelRevocationEffect = baseArtefactsRelationImpact.getImpactingBaseArtefactRelRevocationEffect();
ChangeEffectKind impactedChangeEffectKind = selectArtefactRelChangeEffectByEventKind(
impactingBaseArtefactRelModificationEffect,
impactingBaseArtefactRelRevocationEffect,
impactingEventKind);
if (impactedChangeEffectKind == null) {
return null;
}
return new BaseArtefactMappedToArtefactRelationImpact(recursionDepth, impactingBaseArtefactRelModificationEffect, impactingBaseArtefactRelRevocationEffect,
baseArtefact, mappedArtefact, impactedChangeEffectKind, impactingEventKind);
}
private static ChangeEffectKind selectArtefactRelChangeEffectByEventKind(
ChangeEffectKind modificationChangeEffectKind,
ChangeEffectKind revocationChangeEffectKind,
EventKind impactingEventKind)
{
if (EventKind.MODIFICATION.equals(impactingEventKind)) {
return modificationChangeEffectKind;
}
if (EventKind.REVOCATION.equals(impactingEventKind)) {
return revocationChangeEffectKind;
}
return null;
}
}