All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vmlens.report.builder.ReportBuilder Maven / Gradle / Ivy

package com.vmlens.report.builder;

import com.anarsoft.trace.agent.description.*;
import com.vmlens.report.container.ContainerForField;
import com.vmlens.report.container.ContainerForMethod;
import com.vmlens.report.container.ContainerForTestLoop;
import com.vmlens.report.container.ContainerForThread;
import com.vmlens.report.description.DescriptionContext;
import com.vmlens.report.description.DescriptionContextImpl;
import com.vmlens.report.description.NeedsDescriptionCallback;
import com.vmlens.report.element.*;
import com.vmlens.report.uielement.UILoopsAndStacktraceLeafs;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


public class ReportBuilder implements NeedsDescriptionCallback, ThreadOrLoopDescriptionVisitor {

    private final Map idToFieldContainer = new HashMap<>();
    private final Map idToMethodContainer = new HashMap<>();
    private final Map indexToThreadDescription = new HashMap<>();
    private final Map idToTestLoopDescription = new HashMap<>();

    private final List loopAndRuns = new LinkedList<>();
    private final List stacktraceLeafs = new LinkedList<>();

    public void addClassDescription(ClassDescription classDescription) {
        for (FieldInClassDescription fieldInClassDescription : classDescription.serializedFieldDescriptionArray()) {
            ContainerForField fieldContainer = idToFieldContainer.get(fieldInClassDescription.id());
            if (fieldContainer != null) {
                fieldContainer.setClassDescription(classDescription);
                fieldContainer.setFieldInClassDescription(fieldInClassDescription);
            }
        }
        for (MethodDescription methodDescription : classDescription.methodArray()) {


            ContainerForMethod methodContainer = idToMethodContainer.get(methodDescription.id());
            if (methodContainer != null) {
                methodContainer.setMethodDescription(methodDescription);
                methodContainer.setClassDescription(classDescription);
            }
        }
    }

    public void addThreadOrLoopDescription(ThreadOrLoopDescription threadOrLoopDescription) {
        threadOrLoopDescription.accept(this);
    }


    @Override
    public void visit(ThreadDescription threadDescription) {
        LoopRunAndThreadIndex loopRunAndThreadIndex = new LoopRunAndThreadIndex(threadDescription.loopId(),
                threadDescription.runId(),
                threadDescription.threadIndex());
        indexToThreadDescription.put(loopRunAndThreadIndex, new ContainerForThread(threadDescription));

    }

    @Override
    public void visit(TestLoopDescription whileLoopDescription) {
        idToTestLoopDescription.put(whileLoopDescription.loopId(), new ContainerForTestLoop(whileLoopDescription));
    }

    public void addLoopAndRun(TestLoop testLoop, List run) {
        for (RunElement element : run) {
            idToMethodContainer.put(element.inMethodId(), new ContainerForMethod());
            element.operationTextFactory().addToNeedsDescription(this);
        }
        loopAndRuns.add(new LoopAndRun(testLoop, run));
    }

    public void addStacktraceLeaf(StacktraceLeaf stacktraceLeaf) {
        stacktraceLeafs.add(stacktraceLeaf);

        for (StacktraceElement stacktraceElement : stacktraceLeaf.stacktraceElements()) {
            idToMethodContainer.put(stacktraceElement.methodId(), new ContainerForMethod());
        }
    }

    public UILoopsAndStacktraceLeafs build() {
        DescriptionContext operationTextFactoryContext =
                new DescriptionContextImpl(indexToThreadDescription,
                        idToMethodContainer,
                        idToFieldContainer,
                        idToTestLoopDescription);


        return new ReportBuildAlgo(loopAndRuns, operationTextFactoryContext).build();
    }

    @Override
    public void needsField(int fieldId) {
        idToFieldContainer.put(fieldId, new ContainerForField());
    }

    @Override
    public void needsMethod(int methodId) {
        idToMethodContainer.put(methodId,new ContainerForMethod());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy