org.polarsys.reqcycle.export.transform.TraceabilityExport.java Source code

Java tutorial

Introduction

Here is the source code for org.polarsys.reqcycle.export.transform.TraceabilityExport.java

Source

/*******************************************************************************
 *  Copyright (c) 2014 AtoS
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html *
 *  Contributors:
 *    Abdellah El Ayadi (AtoS) - initial API and implementation and/or initial documentation
 *******************************************************************************/

package org.polarsys.reqcycle.export.transform;

import java.text.DateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ILabelProvider;
import org.osgi.framework.FrameworkUtil;
import org.polarsys.reqcycle.export.model.ReqCycleExport.Attribute;
import org.polarsys.reqcycle.export.model.ReqCycleExport.AttributeValue;
import org.polarsys.reqcycle.export.model.ReqCycleExport.Export;
import org.polarsys.reqcycle.export.model.ReqCycleExport.Model;
import org.polarsys.reqcycle.export.model.ReqCycleExport.Property;
import org.polarsys.reqcycle.export.model.ReqCycleExport.ReqCycleExportFactory;
import org.polarsys.reqcycle.export.model.ReqCycleExport.Traceability;
import org.polarsys.reqcycle.predicates.core.api.IPredicate;
import org.polarsys.reqcycle.repository.data.RequirementSourceData.Requirement;
import org.polarsys.reqcycle.repository.data.RequirementSourceData.RequirementsContainer;
import org.polarsys.reqcycle.repository.data.RequirementSourceData.Section;
import org.polarsys.reqcycle.traceability.engine.ITraceabilityEngine;
import org.polarsys.reqcycle.traceability.engine.ITraceabilityEngine.DIRECTION;
import org.polarsys.reqcycle.traceability.engine.Request;
import org.polarsys.reqcycle.traceability.engine.Request.DEPTH;
import org.polarsys.reqcycle.traceability.exceptions.EngineException;
import org.polarsys.reqcycle.traceability.model.Link;
import org.polarsys.reqcycle.traceability.model.Pair;
import org.polarsys.reqcycle.traceability.model.scopes.CompositeScope;
import org.polarsys.reqcycle.traceability.model.scopes.Scopes;
import org.polarsys.reqcycle.traceability.types.ITraceabilityAttributesManager;
import org.polarsys.reqcycle.traceability.types.ITraceabilityAttributesManager.EditableAttribute;
import org.polarsys.reqcycle.traceability.types.ITypesConfigurationProvider;
import org.polarsys.reqcycle.traceability.types.configuration.typeconfiguration.Configuration;
import org.polarsys.reqcycle.traceability.types.engine.ITypedTraceabilityEngine;
import org.polarsys.reqcycle.traceability.utils.EngineUtils;
import org.polarsys.reqcycle.uri.IReachableManager;
import org.polarsys.reqcycle.uri.exceptions.IReachableHandlerException;
import org.polarsys.reqcycle.uri.model.Reachable;
import org.polarsys.reqcycle.uri.model.ReachableObject;
import org.polarsys.reqcycle.utils.inject.ZigguratInject;

import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;

public class TraceabilityExport {

    IReachableManager manager = ZigguratInject.make(IReachableManager.class);
    ITraceabilityEngine engine = ZigguratInject.make(ITraceabilityEngine.class);
    ITypedTraceabilityEngine typedEngine = ZigguratInject.make(ITypedTraceabilityEngine.class);
    ReqCycleExportFactory factory = ReqCycleExportFactory.eINSTANCE;
    ITraceabilityAttributesManager attributesManager = ZigguratInject.make(ITraceabilityAttributesManager.class);
    ITypesConfigurationProvider typeProvider = ZigguratInject.make(ITypesConfigurationProvider.class);

    public Export transform(Iterable<IRequirementProvider> reqResult, Iterable<IPredicate> predicateResult,
            List<IProject> projects, boolean exportTraceability, String outputPath, IProgressMonitor monitor) {

        // model.get
        Multimap<Reachable, Link> traceaMap = null;
        if (exportTraceability) {
            Request request = getRequest(reqResult, projects);
            try {
                Iterator<Pair<Link, Reachable>> traca = getEngine().getTraceability(request);
                traceaMap = EngineUtils.toFollowingMap(traca);
            } catch (EngineException e) {
                e.printStackTrace();
            }
        }

        Export export = factory.createExport();
        export.setPath(outputPath);
        Date date = new Date();
        DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
        export.setDate(shortDateFormat.format(date));
        monitor.beginTask("Extraction", Lists.newArrayList(reqResult).size());
        for (IRequirementProvider iRequirementProvider : reqResult) {
            if (monitor.isCanceled()) {
                return null;
            }
            List<Attribute> attributes = Lists.newArrayList();
            initAttributes(attributes);
            List<Attribute> predicateAttributes = Lists.newArrayList();
            List<Attribute> tracea = Lists.newArrayList();
            initPredicatesattributes(predicateAttributes, predicateResult);

            // creation model
            Model m = initModel();
            m.setName(iRequirementProvider.getLabel());
            for (Entry<String, String> entry : iRequirementProvider.getMetadata().entrySet()) {
                Property uriProperty = factory.createProperty();
                uriProperty.setName(entry.getKey());
                uriProperty.setValue(entry.getValue());
                m.getMetadata().add(uriProperty);
            }
            for (Requirement r : iRequirementProvider.getRequirements()) {
                org.polarsys.reqcycle.export.model.ReqCycleExport.Requirement reqCopy = factory.createRequirement();
                reqCopy.setID(r.getId());
                handleSection(attributes, r, reqCopy);
                // ajoute attribute value : text & section
                handleEAttributes(attributes, r, reqCopy);

                handlePredicates(predicateResult, predicateAttributes, r, reqCopy);

                if (traceaMap != null) {
                    handleTracea(traceaMap, r, tracea, reqCopy);
                }

                m.getRequirements().add(reqCopy);
            }
            m.getAttributes().addAll(attributes);
            m.getAttributes().addAll(predicateAttributes);
            m.getAttributes().addAll(tracea);

            export.getModels().add(m);
            monitor.worked(1);
        }

        return export;
    }

    private void handleSection(List<Attribute> attributes, Requirement r,
            org.polarsys.reqcycle.export.model.ReqCycleExport.Requirement reqCopy) {
        AttributeValue val = factory.createAttributeValue();
        val.setValue(getSection(r));
        val.setAttribute(getAttribute(attributes, "section", String.class.getName()));
        reqCopy.getValues().add(val);
    }

    private String getSection(Requirement r) {
        List<String> result = Lists.newArrayList();
        EObject parent = r.eContainer();
        while (parent != null && (!(parent instanceof RequirementsContainer))) {
            if (parent instanceof Section) {
                Section section = (Section) parent;
                result.add(section.getId());
                parent = parent.eContainer();
            }
        }
        return Joiner.on("\\").join(result);
    }

    protected void handleTracea(Multimap<Reachable, Link> traceaMap, Requirement r, List<Attribute> tracea,
            org.polarsys.reqcycle.export.model.ReqCycleExport.Requirement reqCopy) {
        Collection<Link> links = traceaMap.get(getReachable(r));
        for (Link l : links) {
            Traceability t = factory.createTraceability();

            Attribute attribute = getAttribute(tracea, l.getLabel(), String.class.getName());
            AttributeValue val = factory.createAttributeValue();
            val.setValue(getLabel(l.getTargets().iterator().next()));
            val.setAttribute(attribute);

            t.getTraceabilityValues().add(val);

            Collection<EditableAttribute> attributeOfLink = attributesManager.getAttributes(l.getId());
            for (EditableAttribute a : attributeOfLink) {
                Attribute att = getAttribute(tracea, a.getName(), a.getType().getName());
                AttributeValue value = factory.createAttributeValue();
                value.setValue(valueOf(a.getValue()));
                value.setAttribute(att);
                t.getTraceabilityValues().add(value);
            }
            reqCopy.getDownwardTraceability().add(t);
        }
    }

    protected String valueOf(Object object) {
        if (object != null) {
            return String.valueOf(object);
        }
        return "";
    }

    protected void handlePredicates(Iterable<IPredicate> predicateResult, List<Attribute> predicateAttributes,
            Requirement r, org.polarsys.reqcycle.export.model.ReqCycleExport.Requirement reqCopy) {
        for (IPredicate p : predicateResult) {
            AttributeValue val = factory.createAttributeValue();
            val.setAttribute(getAttribute(predicateAttributes, p.getDisplayName(), Boolean.class.getName()));
            try {
                val.setValue(valueOf(p.match(r)));
            } catch (Exception e) {
                val.setValue("error");
            }
            reqCopy.getValues().add(val);
        }
    }

    protected void handleEAttributes(List<Attribute> attributes, Requirement r,
            org.polarsys.reqcycle.export.model.ReqCycleExport.Requirement reqCopy) {
        for (EAttribute att : r.eClass().getEAllAttributes()) {
            // ajout attribut si n'existe pas
            // ignorer : uri
            if (!"uri".equals(att.getName()) && !"id".equals(att.getName())) {
                Attribute attribute = getAttribute(attributes, att.getName(),
                        att.getEType().getInstanceClassName());
                AttributeValue attributeValue = factory.createAttributeValue();
                attributeValue.setValue(valueOf(r.eGet(att)));
                attributeValue.setAttribute(attribute);
                reqCopy.getValues().add(attributeValue);
            }
        }
    }

    private ITraceabilityEngine getEngine() {
        Configuration defaultConfiguration = typeProvider.getDefaultConfiguration();
        if (defaultConfiguration != null) {
            return typedEngine;
        }
        return engine;
    }

    private Attribute getAttribute(List<Attribute> attributes, String name, String type) {
        for (Attribute att : attributes) {
            if (att.getName().equals(name)) {
                return att;
            }
        }
        Attribute newAtt = factory.createAttribute();
        newAtt.setName(name);
        newAtt.setType(type);
        attributes.add(newAtt);
        return newAtt;
    }

    private void initPredicatesattributes(List<Attribute> predicateAttributes,
            Iterable<IPredicate> predicateResult) {
        for (IPredicate p : predicateResult) {
            Attribute Att = factory.createAttribute();
            Att.setName(p.getDisplayName());
        }
    }

    private void initAttributes(List<Attribute> attributes) {
        Attribute att = factory.createAttribute();
        att.setName("text");
        attributes.add(att);

        Attribute section = factory.createAttribute();
        section.setName("section");
        attributes.add(section);
    }

    private Model initModel() {
        Model model = factory.createModel();
        model.setVersion(FrameworkUtil.getBundle(getClass()).getVersion().toString());
        return model;
    }

    private Request getRequest(Iterable<IRequirementProvider> reqResult, List<IProject> projects) {
        Request r = new Request();
        r.setDirection(DIRECTION.DOWNWARD);
        r.setDepth(DEPTH.ONE);
        if (projects.size() == ResourcesPlugin.getWorkspace().getRoot().getProjects().length) {
            r.setScope(Scopes.getWorkspaceScope());
        } else {
            CompositeScope compo = new CompositeScope();
            for (IProject p : projects) {
                compo.add(Scopes.getProjectScope(p));
            }
            r.setScope(compo);
        }
        // for each sources or scopes
        for (IRequirementProvider p : reqResult) {
            // for each req
            for (Requirement req : p.getRequirements()) {
                r.addSource(getReachable(req));
            }
        }
        return r;
    }

    private Reachable getReachable(Requirement req) {
        try {
            return manager.getHandlerFromObject(req).getFromObject(req).getReachable();
        } catch (IReachableHandlerException e) {
            e.printStackTrace();
        }
        return null;
    }

    private String getLabel(Reachable reachable) {
        try {
            ReachableObject fromReachable = manager.getHandlerFromReachable(reachable).getFromReachable(reachable);
            if (fromReachable != null) {
                ILabelProvider provider = (ILabelProvider) fromReachable.getAdapter(ILabelProvider.class);
                if (provider != null) {
                    return provider.getText(reachable);
                }
            }
        } catch (IReachableHandlerException e) {
            e.printStackTrace();
        }
        return "no label";
    }

}