blob: f84a6e0617a31cb06bc17ec6140eee0127f98327 [file] [log] [blame]
/**
* Copyright (c)2020 CEA LIST, Committer Name, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST - Initial API and implementation
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr
* Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
*
*/
package org.eclipse.papyrus.pdp4eng.req.profile.constraints;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.papyrus.sysml14.requirements.Requirement;
import org.eclipse.uml2.uml.DirectedRelationship;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;
public class TraceabilityIndexer {
private HashMap<Element,ArrayList<DirectedRelationship> > upwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
private HashMap<Element,ArrayList<DirectedRelationship> > downwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
private HashMap<Element,Element > ownerRequirement= new HashMap<Element, Element>();
private HashMap<Element,ArrayList<Element> > subRequirements= new HashMap<Element, ArrayList<Element>>();
private static TraceabilityIndexer instance=null;
public static TraceabilityIndexer getInstance() {
if( instance==null) {
instance= new TraceabilityIndexer();
}
return instance;
}
public void loadTraceability(Element context) {
upwardTraceability.clear();
downwardTraceability.clear();
ownerRequirement.clear();
subRequirements.clear();
ResourceSet resourceSet=context.eResource().getResourceSet();
for(int i=0; i< resourceSet.getResources().size();i++) {
Resource resource = (Resource) resourceSet.getResources().get(i);
if( resource instanceof UMLResource) {
for (Iterator<EObject> iteratorObject = resource.getAllContents(); iteratorObject.hasNext();) {
EObject currentEobject = (EObject) iteratorObject.next();
if(currentEobject instanceof DirectedRelationship) {
DirectedRelationship directedRelationship= (DirectedRelationship)currentEobject;
for (Iterator<Element> iterator = directedRelationship.getSources().iterator(); iterator.hasNext();) {
Element currentSource = (Element) iterator.next();
if( upwardTraceability.get(currentSource)!=null) {
upwardTraceability.get(currentSource).add(directedRelationship);
}
else {
ArrayList<DirectedRelationship> aCollection= new ArrayList<DirectedRelationship>();
aCollection.add(directedRelationship);
upwardTraceability.put(currentSource, aCollection);
}
}
for (Iterator<Element> iterator = directedRelationship.getTargets().iterator(); iterator.hasNext();) {
Element currentTarget = (Element) iterator.next();
if( downwardTraceability.get(currentTarget)!=null) {
downwardTraceability.get(currentTarget).add(directedRelationship);
}
else {
ArrayList<DirectedRelationship> aCollection= new ArrayList<DirectedRelationship>();
aCollection.add(directedRelationship);
downwardTraceability.put(currentTarget, aCollection);
}
}
}
// add also Owner and composed Requirements
if( currentEobject instanceof org.eclipse.uml2.uml.Class) {
if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentEobject, Requirement.class)!=null) {
org.eclipse.uml2.uml.Class currentReq=(org.eclipse.uml2.uml.Class)currentEobject;
if( currentReq.eContainer() instanceof org.eclipse.uml2.uml.Class) {
if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentReq.eContainer(), Requirement.class)!=null) {
org.eclipse.uml2.uml.Class parentReq=(org.eclipse.uml2.uml.Class)currentReq.eContainer();
ownerRequirement.put(currentReq, (org.eclipse.uml2.uml.Class)currentEobject.eContainer());
if( subRequirements.get(parentReq)==null) {
ArrayList<Element> subElements= new ArrayList<Element>();
subRequirements.put(parentReq, subElements);
}
subRequirements.get(parentReq).add(currentReq);
}
}
}
}
}
}
}
}
public ArrayList<DirectedRelationship> getUpwardTraceabiltiy(Element context){
return upwardTraceability.get(context);
}
public ArrayList<DirectedRelationship> getDownwardTraceabiltiy(Element context){
return downwardTraceability.get(context);
}
public Element getParentRequirement(Element currentElement) {
return ownerRequirement.get(currentElement);
}
public ArrayList<Element> getsubRequirements(Element currentElement) {
return subRequirements.get(currentElement);
}
}