AssureRequirementsCoverageView.java

/**
 * Copyright (c) 2004-2025 Carnegie Mellon University and others. (see Contributors file).
 * All Rights Reserved.
 * 
 * NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
 * KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE
 * OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT
 * MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.
 * 
 * This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Created, in part, with funding and support from the United States Government. (see Acknowledgments file).
 * 
 * This program includes and/or can make use of certain third party source code, object code, documentation and other
 * files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system
 * configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and
 * conditions contained in any such Third Party Software or separate license file distributed with such Third Party
 * Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party benefici-
 * aries to this license with respect to the terms applicable to their Third Party Software. Third Party Software li-
 * censes only apply to the Third Party Software and not any other portion of this program or this program as a whole.
 */
package org.osate.alisa.workbench.ui.views;

import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.ui.editor.GlobalURIEditorOpener;
import org.eclipse.xtext.ui.resource.IResourceSetProvider;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.Functions.Function2;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
import org.eclipse.xtext.xbase.lib.MapExtensions;
import org.eclipse.xtext.xbase.lib.ObjectExtensions;
import org.eclipse.xtext.xbase.lib.Pair;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.osate.aadl2.util.Activator;
import org.osate.alisa.workbench.alisa.AlisaPackage;
import org.osate.alisa.workbench.alisa.AssuranceCase;
import org.osate.alisa.workbench.alisa.AssurancePlan;
import org.osate.assure.assure.AssuranceCaseResult;
import org.osate.assure.assure.AssurePackage;
import org.osate.assure.assure.AssureResult;
import org.osate.assure.assure.ClaimResult;
import org.osate.assure.assure.ElseResult;
import org.osate.assure.assure.Metrics;
import org.osate.assure.assure.ModelResult;
import org.osate.assure.assure.PreconditionResult;
import org.osate.assure.assure.PredicateResult;
import org.osate.assure.assure.QualifiedClaimReference;
import org.osate.assure.assure.QualifiedVAReference;
import org.osate.assure.assure.SubsystemResult;
import org.osate.assure.assure.ThenResult;
import org.osate.assure.assure.ValidationResult;
import org.osate.assure.assure.VerificationActivityResult;
import org.osate.assure.evaluator.IAssureProcessor;
import org.osate.assure.evaluator.IAssureRequirementMetricsProcessor;
import org.osate.assure.generator.IAssureConstructor;
import org.osate.assure.util.AssureUtilExtension;
import org.osate.categories.categories.CategoriesPackage;
import org.osate.categories.categories.CategoryFilter;
import org.osate.result.Diagnostic;
import org.osate.result.DiagnosticType;
import org.osate.result.Result;
import org.osate.result.ResultType;

@SuppressWarnings("all")
public class AssureRequirementsCoverageView extends ViewPart {
  private static final String ASSURANCE_CASE_URIS_KEY = "ASSURANCE_CASE_URIS_KEY";

  private static final String FILTER_URIS_KEY = "FILTER_URIS_KEY";

  private static final String ALISA_EXTENSION = "alisa";

  private static final String ASSURE_EXTENSION = "assure";

  private final IResourceSetProvider resourceSetProvider;

  private final ResourceSet resourceSetForUI;

  private final IResourceDescriptions rds;

  private final IAssureConstructor assureConstructor;

  private final String settingsFileName;

  private final IDialogSettings dialogSettings;

  @Inject
  private IAssureRequirementMetricsProcessor assureRequirementMetricsProcessor;

  private final HashMap<URI, URI> selectedFilters = CollectionLiterals.<URI, URI>newHashMap();

  private Pair<URI, URI> displayedCaseAndFilter = Pair.<URI, URI>of(null, null);

  private TreeViewer alisaViewer;

  private TreeViewer assureCoverageViewer;

  private final IResourceChangeListener resourceChangeListener;

  @Inject
  public AssureRequirementsCoverageView(final IResourceSetProvider resourceSetProvider, final IResourceDescriptions rds, final GlobalURIEditorOpener editorOpener, final IAssureConstructor assureConstructor, final IAssureProcessor assureProcessor) {
    this.resourceSetProvider = resourceSetProvider;
    this.resourceSetForUI = resourceSetProvider.get(null);
    this.rds = rds;
    this.assureConstructor = assureConstructor;
    final IPath pluginsDir = Activator.getDefault().getStateLocation().removeLastSegments(1);
    this.settingsFileName = pluginsDir.append("org.osate.assure").append("assure_view_settings.xml").toOSString();
    DialogSettings _dialogSettings = new DialogSettings("assure_view_settings");
    this.dialogSettings = _dialogSettings;
    try {
      this.dialogSettings.load(this.settingsFileName);
      final String[] assuranceCaseURIs = this.dialogSettings.getArray(AssureRequirementsCoverageView.ASSURANCE_CASE_URIS_KEY);
      final String[] filterURIs = this.dialogSettings.getArray(AssureRequirementsCoverageView.FILTER_URIS_KEY);
      if ((((assuranceCaseURIs != null) && (filterURIs != null)) && (((List<String>)Conversions.doWrapArray(assuranceCaseURIs)).size() == ((List<String>)Conversions.doWrapArray(filterURIs)).size()))) {
        for (int i = 0; (i < ((List<String>)Conversions.doWrapArray(filterURIs)).size()); i++) {
          {
            final URI assuranceCaseURI = URI.createURI(assuranceCaseURIs[i]);
            final URI filterURI = URI.createURI(filterURIs[i]);
            if (((this.resourceSetForUI.getEObject(assuranceCaseURI, true) != null) && 
              (this.resourceSetForUI.getEObject(filterURI, true) != null))) {
              this.selectedFilters.put(assuranceCaseURI, filterURI);
            }
          }
        }
      }
    } catch (final Throwable _t) {
      if (_t instanceof IOException) {
      } else {
        throw Exceptions.sneakyThrow(_t);
      }
    }
    final IResourceChangeListener _function = (IResourceChangeEvent it) -> {
      try {
        final AtomicBoolean alisaFileChanged = new AtomicBoolean(false);
        final AtomicBoolean assureFileChanged = new AtomicBoolean(false);
        final IResourceDeltaVisitor _function_1 = (IResourceDelta it_1) -> {
          boolean _xblockexpression = false;
          {
            String _fileExtension = it_1.getResource().getFileExtension();
            boolean _equals = Objects.equal(_fileExtension, AssureRequirementsCoverageView.ALISA_EXTENSION);
            if (_equals) {
              alisaFileChanged.set(true);
            } else {
              String _fileExtension_1 = it_1.getResource().getFileExtension();
              boolean _equals_1 = Objects.equal(_fileExtension_1, AssureRequirementsCoverageView.ASSURE_EXTENSION);
              if (_equals_1) {
                assureFileChanged.set(true);
              }
            }
            _xblockexpression = true;
          }
          return _xblockexpression;
        };
        it.getDelta().accept(_function_1);
        final Consumer<Resource> _function_2 = (Resource it_1) -> {
          it_1.unload();
        };
        this.resourceSetForUI.getResources().forEach(_function_2);
        boolean _get = alisaFileChanged.get();
        if (_get) {
          final Runnable _function_3 = () -> {
            final Function2<URI, URI, Boolean> _function_4 = (URI assuranceCase, URI filter) -> {
              return Boolean.valueOf(((this.resourceSetForUI.getEObject(assuranceCase, true) == null) || 
                (this.resourceSetForUI.getEObject(filter, true) == null)));
            };
            final Set<URI> toRemove = MapExtensions.<URI, URI>filter(this.selectedFilters, _function_4).keySet();
            final Consumer<URI> _function_5 = (URI it_1) -> {
              this.selectedFilters.remove(it_1);
            };
            toRemove.forEach(_function_5);
            final Object[] expandedElements = this.alisaViewer.getExpandedElements();
            this.alisaViewer.setInput(this.getAssuranceCaseURIsInWorkspace());
            this.alisaViewer.setExpandedElements(expandedElements);
            Pair<URI, URI> _mappedTo = Pair.<URI, URI>of(null, null);
            this.displayedCaseAndFilter = _mappedTo;
            Object _firstElement = this.alisaViewer.getStructuredSelection().getFirstElement();
            this.updateAssureViewer(((URI) _firstElement), true);
          };
          this.getViewSite().getWorkbenchWindow().getWorkbench().getDisplay().asyncExec(_function_3);
        } else {
          boolean _get_1 = assureFileChanged.get();
          if (_get_1) {
            final Runnable _function_4 = () -> {
              Pair<URI, URI> _mappedTo = Pair.<URI, URI>of(null, null);
              this.displayedCaseAndFilter = _mappedTo;
              Object _firstElement = this.alisaViewer.getStructuredSelection().getFirstElement();
              this.updateAssureViewer(((URI) _firstElement), false);
            };
            this.getViewSite().getWorkbenchWindow().getWorkbench().getDisplay().asyncExec(_function_4);
          }
        }
      } catch (Throwable _e) {
        throw Exceptions.sneakyThrow(_e);
      }
    };
    this.resourceChangeListener = _function;
  }

  @Override
  public void createPartControl(final Composite parent) {
    SashForm _sashForm = new SashForm(parent, SWT.HORIZONTAL);
    final Procedure1<SashForm> _function = (SashForm it) -> {
      Composite _composite = new Composite(it, SWT.NONE);
      final Procedure1<Composite> _function_1 = (Composite it_1) -> {
        final TreeColumnLayout columnLayout = new TreeColumnLayout();
        it_1.setLayout(columnLayout);
        this.alisaViewer = this.createAlisaViewer(it_1, columnLayout);
      };
      ObjectExtensions.<Composite>operator_doubleArrow(_composite, _function_1);
      Composite _composite_1 = new Composite(it, SWT.NONE);
      final Procedure1<Composite> _function_2 = (Composite it_1) -> {
        final TreeColumnLayout columnLayout = new TreeColumnLayout();
        it_1.setLayout(columnLayout);
        this.assureCoverageViewer = this.createAssureCoverageViewer(it_1, columnLayout);
      };
      ObjectExtensions.<Composite>operator_doubleArrow(_composite_1, _function_2);
      it.setWeights(new int[] { 1, 3 });
    };
    ObjectExtensions.<SashForm>operator_doubleArrow(_sashForm, _function);
    ResourcesPlugin.getWorkspace().addResourceChangeListener(this.resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
  }

  @Override
  public void setFocus() {
    this.alisaViewer.getTree().setFocus();
  }

  @Override
  public void dispose() {
    try {
      ResourcesPlugin.getWorkspace().removeResourceChangeListener(this.resourceChangeListener);
      final List<URI> caseURIs = IterableExtensions.<URI>toList(this.selectedFilters.keySet());
      final Function1<URI, URI> _function = (URI it) -> {
        return this.selectedFilters.get(it);
      };
      final List<URI> filterURIs = ListExtensions.<URI, URI>map(caseURIs, _function);
      final Function1<URI, String> _function_1 = (URI it) -> {
        return it.toString();
      };
      this.dialogSettings.put(AssureRequirementsCoverageView.ASSURANCE_CASE_URIS_KEY, ((String[])Conversions.unwrapArray(ListExtensions.<URI, String>map(caseURIs, _function_1), String.class)));
      final Function1<URI, String> _function_2 = (URI it) -> {
        return it.toString();
      };
      this.dialogSettings.put(AssureRequirementsCoverageView.FILTER_URIS_KEY, ((String[])Conversions.unwrapArray(ListExtensions.<URI, String>map(filterURIs, _function_2), String.class)));
      this.dialogSettings.save(this.settingsFileName);
      super.dispose();
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }

  private TreeViewer createAlisaViewer(final Composite parent, final TreeColumnLayout columnLayout) {
    TreeViewer _treeViewer = new TreeViewer(parent, (((SWT.BORDER | SWT.H_SCROLL) | SWT.V_SCROLL) | SWT.SINGLE));
    final Procedure1<TreeViewer> _function = (TreeViewer treeViewer) -> {
      Tree _tree = treeViewer.getTree();
      _tree.setHeaderVisible(true);
      treeViewer.setContentProvider(new ITreeContentProvider() {
        @Override
        public void dispose() {
        }

        @Override
        public Object[] getChildren(final Object parentElement) {
          Object[] _switchResult = null;
          EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) parentElement), true);
          boolean _matched = false;
          if (!_matched) {
            _switchResult = new Object[] {};
          }
          return _switchResult;
        }

        @Override
        public Object[] getElements(final Object inputElement) {
          return ((Object[])Conversions.unwrapArray(((List<URI>) inputElement), Object.class));
        }

        @Override
        public Object getParent(final Object element) {
          Object _switchResult = null;
          EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
          final EObject elementEObject = _eObject;
          boolean _matched = false;
          if (elementEObject instanceof AssuranceCase) {
            _matched=true;
            _switchResult = treeViewer.getInput();
          }
          if (!_matched) {
            if (elementEObject instanceof AssurancePlan) {
              _matched=true;
              _switchResult = EcoreUtil.getURI(((AssurancePlan)elementEObject).eContainer());
            }
          }
          return _switchResult;
        }

        @Override
        public boolean hasChildren(final Object element) {
          boolean _switchResult = false;
          EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
          boolean _matched = false;
          if (!_matched) {
            _switchResult = false;
          }
          return _switchResult;
        }

        @Override
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }
      });
      TreeViewerColumn _treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
      final Procedure1<TreeViewerColumn> _function_1 = (TreeViewerColumn it) -> {
        TreeColumn _column = it.getColumn();
        ColumnWeightData _columnWeightData = new ColumnWeightData(1);
        columnLayout.setColumnData(_column, _columnWeightData);
        TreeColumn _column_1 = it.getColumn();
        _column_1.setText("Assurance Cases");
        it.setLabelProvider(new ColumnLabelProvider() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCase) {
              _matched=true;
              _switchResult = ((AssuranceCase)eObject).getName();
            }
            if (!_matched) {
              if (eObject instanceof AssurancePlan) {
                _matched=true;
                _switchResult = ((AssurancePlan)eObject).getName();
              }
            }
            return _switchResult;
          }
        });
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn, _function_1);
      TreeViewerColumn _treeViewerColumn_1 = new TreeViewerColumn(treeViewer, SWT.LEFT);
      final Procedure1<TreeViewerColumn> _function_2 = (TreeViewerColumn it) -> {
        TreeColumn _column = it.getColumn();
        ColumnWeightData _columnWeightData = new ColumnWeightData(1);
        columnLayout.setColumnData(_column, _columnWeightData);
        TreeColumn _column_1 = it.getColumn();
        _column_1.setText("Filter");
        it.setLabelProvider(new ColumnLabelProvider() {
          @Override
          public String getText(final Object element) {
            String _xblockexpression = null;
            {
              final EObject eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
              String _xifexpression = null;
              if ((eObject instanceof AssuranceCase)) {
                String _xblockexpression_1 = null;
                {
                  final URI filter = AssureRequirementsCoverageView.this.selectedFilters.get(element);
                  String _xifexpression_1 = null;
                  if ((filter != null)) {
                    EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(filter, true);
                    _xifexpression_1 = ((CategoryFilter) _eObject).getName();
                  } else {
                    _xifexpression_1 = "<all>";
                  }
                  _xblockexpression_1 = _xifexpression_1;
                }
                _xifexpression = _xblockexpression_1;
              }
              _xblockexpression = _xifexpression;
            }
            return _xblockexpression;
          }
        });
        it.setEditingSupport(new EditingSupport(treeViewer) {
          @Override
          protected boolean canEdit(final Object element) {
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            return (_eObject instanceof AssuranceCase);
          }

          @Override
          protected CellEditor getCellEditor(final Object element) {
            Tree _tree = treeViewer.getTree();
            ComboBoxViewerCellEditor _comboBoxViewerCellEditor = new ComboBoxViewerCellEditor(_tree, SWT.READ_ONLY);
            final Procedure1<ComboBoxViewerCellEditor> _function = (ComboBoxViewerCellEditor it_1) -> {
              it_1.setContentProvider(ArrayContentProvider.getInstance());
              it_1.setLabelProvider(new LabelProvider() {
                @Override
                public String getText(final Object element) {
                  String _xblockexpression = null;
                  {
                    final Optional<URI> filterURI = ((Optional<URI>) element);
                    String _xifexpression = null;
                    boolean _isPresent = filterURI.isPresent();
                    if (_isPresent) {
                      EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(filterURI.get(), true);
                      _xifexpression = ((CategoryFilter) _eObject).getName();
                    } else {
                      _xifexpression = "<all>";
                    }
                    _xblockexpression = _xifexpression;
                  }
                  return _xblockexpression;
                }
              });
              Optional<URI> _empty = Optional.<URI>empty();
              final Function1<IEObjectDescription, Optional<URI>> _function_1 = (IEObjectDescription it_2) -> {
                return Optional.<URI>of(it_2.getEObjectURI());
              };
              Iterable<Optional<URI>> _map = IterableExtensions.<IEObjectDescription, Optional<URI>>map(AssureRequirementsCoverageView.this.rds.getExportedObjectsByType(CategoriesPackage.Literals.CATEGORY_FILTER), _function_1);
              it_1.setInput(IterableExtensions.<Optional<URI>>toList(Iterables.<Optional<URI>>concat(Collections.<Optional<URI>>unmodifiableList(CollectionLiterals.<Optional<URI>>newArrayList(_empty)), _map)));
            };
            return ObjectExtensions.<ComboBoxViewerCellEditor>operator_doubleArrow(_comboBoxViewerCellEditor, _function);
          }

          @Override
          protected Object getValue(final Object element) {
            return Optional.<URI>ofNullable(AssureRequirementsCoverageView.this.selectedFilters.get(element));
          }

          @Override
          protected void setValue(final Object element, final Object value) {
            final URI assuranceCase = ((URI) element);
            final Optional<URI> filter = ((Optional<URI>) value);
            boolean _isPresent = filter.isPresent();
            if (_isPresent) {
              AssureRequirementsCoverageView.this.selectedFilters.put(assuranceCase, filter.get());
            } else {
              AssureRequirementsCoverageView.this.selectedFilters.remove(assuranceCase);
            }
            treeViewer.update(assuranceCase, null);
            AssureRequirementsCoverageView.this.updateAssureViewer(assuranceCase, true);
          }
        });
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_1, _function_2);
      final ISelectionChangedListener _function_3 = (SelectionChangedEvent it) -> {
        Object _firstElement = treeViewer.getStructuredSelection().getFirstElement();
        this.updateAssureViewer(((URI) _firstElement), true);
      };
      treeViewer.addSelectionChangedListener(_function_3);
      treeViewer.setInput(this.getAssuranceCaseURIsInWorkspace());
    };
    return ObjectExtensions.<TreeViewer>operator_doubleArrow(_treeViewer, _function);
  }

  private TreeViewer createAssureCoverageViewer(final Composite parent, final TreeColumnLayout columnLayout) {
    abstract class __AssureRequirementsCoverageView_6 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_6 _this__AssureRequirementsCoverageView_6 = this;

      public abstract int getCumulativeRequirementsWithoutPlanClaimCount(final AssureResult ele);

      public abstract int getCumulativeRequirementsCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_7 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_7 _this__AssureRequirementsCoverageView_7 = this;

      NumberFormat format;

      public abstract int getCumulativeQualityCategoryRequirementsCount(final AssureResult ele);

      public abstract int getCumulativeTotalQualityCategorysCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_8 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_8 _this__AssureRequirementsCoverageView_8 = this;

      public abstract int getCumulativeFeaturesRequirementsCount(final AssureResult ele);

      public abstract int getCumulativeFeaturesCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_9 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_9 _this__AssureRequirementsCoverageView_9 = this;

      public abstract int getCumulativeNoVerificationPlansCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_10 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_10 _this__AssureRequirementsCoverageView_10 = this;

      public abstract int getCumulativeExceptionsCount(final AssureResult ele);

      public abstract int getCumulativeRequirementsCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_11 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_11 _this__AssureRequirementsCoverageView_11 = this;

      public abstract int getCumulativeReqTargetHasEMV2SubclauseCount(final AssureResult ele);

      public abstract int getCumulativeRequirementsCount(final AssureResult ele);
    }

    abstract class __AssureRequirementsCoverageView_12 extends ColumnLabelProvider {
      final __AssureRequirementsCoverageView_12 _this__AssureRequirementsCoverageView_12 = this;

      public abstract int getCumulativeFeaturesWithRequiredClassifierCount(final AssureResult ele);

      public abstract int getCumulativeFeaturesRequiringClassifierCount(final AssureResult ele);
    }

    TreeViewer _treeViewer = new TreeViewer(parent, ((SWT.BORDER | SWT.H_SCROLL) | SWT.V_SCROLL));
    final Procedure1<TreeViewer> _function = (TreeViewer it) -> {
      IWorkbenchPartSite _site = this.getSite();
      _site.setSelectionProvider(it);
      final ViewerFilter _function_1 = new ViewerFilter() {
        @Override
        public boolean select(final Viewer viewer, final Object parentElement, final Object element) {
          boolean _switchResult = false;
          EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
          boolean _matched = false;
          if (_eObject instanceof Metrics) {
            _matched=true;
          }
          if (!_matched) {
            if (_eObject instanceof QualifiedClaimReference) {
              _matched=true;
            }
          }
          if (!_matched) {
            if (_eObject instanceof QualifiedVAReference) {
              _matched=true;
            }
          }
          if (!_matched) {
            if (_eObject instanceof ClaimResult) {
              _matched=true;
            }
          }
          if (_matched) {
            _switchResult = false;
          }
          if (!_matched) {
            _switchResult = true;
          }
          return _switchResult;
        }
      };
      it.addFilter(_function_1);
      TreeViewerColumn _treeViewerColumn = new TreeViewerColumn(it, SWT.LEFT);
      final Procedure1<TreeViewerColumn> _function_2 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(300);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        it_1.setLabelProvider(new ColumnLabelProvider() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              String _name = ((AssuranceCaseResult)eObject).getName();
              _switchResult = ("Assurance case " + _name);
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((ModelResult)eObject));
                _switchResult = ("Assurance plan " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof SubsystemResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((SubsystemResult)eObject));
                _switchResult = ("Subsystem verification " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof ClaimResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((ClaimResult)eObject));
                _switchResult = ("Claim " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof VerificationActivityResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((VerificationActivityResult)eObject));
                _switchResult = ("Evidence " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof ValidationResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((ValidationResult)eObject));
                _switchResult = ("Validation " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof PreconditionResult) {
                _matched=true;
                String _name = AssureUtilExtension.getName(((PreconditionResult)eObject));
                _switchResult = ("Precondition " + _name);
              }
            }
            if (!_matched) {
              if (eObject instanceof Diagnostic) {
                _matched=true;
                String _elvis = null;
                EObject _modelElement = ((Diagnostic)eObject).getModelElement();
                String _constructLabel = null;
                if (_modelElement!=null) {
                  _constructLabel=AssureUtilExtension.constructLabel(_modelElement);
                }
                if (_constructLabel != null) {
                  _elvis = _constructLabel;
                } else {
                  String _constructMessage = AssureUtilExtension.constructMessage(((Diagnostic)eObject));
                  _elvis = _constructMessage;
                }
                _switchResult = ("Issue " + _elvis);
              }
            }
            if (!_matched) {
              if (eObject instanceof ElseResult) {
                _matched=true;
                _switchResult = "else";
              }
            }
            if (!_matched) {
              if (eObject instanceof ThenResult) {
                _matched=true;
                _switchResult = "then";
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          @Override
          public Image getImage(final Object element) {
            Image _xblockexpression = null;
            {
              String _switchResult = null;
              EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
              final EObject eObject = _eObject;
              boolean _matched = false;
              if (eObject instanceof Result) {
                _matched=true;
                String _switchResult_1 = null;
                ResultType _resultType = ((Result)eObject).getResultType();
                if (_resultType != null) {
                  switch (_resultType) {
                    case ERROR:
                      _switchResult_1 = "error.png";
                      break;
                    case SUCCESS:
                      _switchResult_1 = "valid.png";
                      break;
                    case FAILURE:
                      _switchResult_1 = "invalid.png";
                      break;
                    case TBD:
                      _switchResult_1 = "info.png";
                      break;
                    default:
                      break;
                  }
                }
                _switchResult = _switchResult_1;
              }
              if (!_matched) {
                if (eObject instanceof Diagnostic) {
                  _matched=true;
                  String _switchResult_1 = null;
                  DiagnosticType _diagnosticType = ((Diagnostic)eObject).getDiagnosticType();
                  if (_diagnosticType != null) {
                    switch (_diagnosticType) {
                      case ERROR:
                        _switchResult_1 = "invalid.png";
                        break;
                      case WARNING:
                        _switchResult_1 = "warning.png";
                        break;
                      case INFO:
                        _switchResult_1 = "info.png";
                        break;
                      case TBD:
                        _switchResult_1 = "questionmark.png";
                        break;
                      default:
                        break;
                    }
                  }
                  _switchResult = _switchResult_1;
                }
              }
              if (!_matched) {
                if (eObject instanceof AssuranceCaseResult) {
                  _matched=true;
                  _switchResult = "assure.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof ClaimResult) {
                  _matched=true;
                  _switchResult = "claim.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof VerificationActivityResult) {
                  _matched=true;
                  _switchResult = "evidence.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof ValidationResult) {
                  _matched=true;
                  _switchResult = "validation.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof PreconditionResult) {
                  _matched=true;
                  _switchResult = "precondition.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof ModelResult) {
                  _matched=true;
                  _switchResult = "precondition.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = "claims.png";
                }
              }
              if (!_matched) {
                if (eObject instanceof PredicateResult) {
                  _matched=true;
                  _switchResult = "precondition.png";
                }
              }
              if (!_matched) {
                _switchResult = "info.png";
              }
              final String fileName = _switchResult;
              _xblockexpression = ImageDescriptor.createFromFile(this.getClass(), ("/icons/" + fileName)).createImage();
            }
            return _xblockexpression;
          }
        });
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn, _function_2);
      TreeViewerColumn _treeViewerColumn_1 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_3 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Reqs w/no plan claim");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(160);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_6 ___AssureRequirementsCoverageView_6 = new __AssureRequirementsCoverageView_6() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              int _cumulativeRequirementsWithoutPlanClaimCount = this.getCumulativeRequirementsWithoutPlanClaimCount(((AssureResult)eObject));
              String _plus = (Integer.valueOf(_cumulativeRequirementsWithoutPlanClaimCount) + " of ");
              int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(((AssureResult)eObject));
              _switchResult = (_plus + Integer.valueOf(_cumulativeRequirementsCount));
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int noPlan = ((AssureResult)eObject).getMetrics().getRequirementsWithoutPlanClaimCount();
                  final int reqs = ((AssureResult)eObject).getMetrics().getRequirementsCount();
                  final int cumulativeNoPlan = this.getCumulativeRequirementsWithoutPlanClaimCount(((AssureResult)eObject));
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(noPlan);
                  _builder.append(" of ");
                  _builder.append(reqs);
                  _builder.append(" | Cume: ");
                  _builder.append(cumulativeNoPlan);
                  _builder.append(" of ");
                  int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(((AssureResult)eObject));
                  _builder.append(_cumulativeRequirementsCount);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              if (eObject instanceof Diagnostic) {
                _matched=true;
                String _elvis = null;
                EObject _modelElement = ((Diagnostic)eObject).getModelElement();
                String _constructLabel = null;
                if (_modelElement!=null) {
                  _constructLabel=AssureUtilExtension.constructLabel(_modelElement);
                }
                if (_constructLabel != null) {
                  _elvis = _constructLabel;
                } else {
                  String _constructMessage = AssureUtilExtension.constructMessage(((Diagnostic)eObject));
                  _elvis = _constructMessage;
                }
                _switchResult = _elvis;
              }
            }
            if (!_matched) {
              if (eObject instanceof ElseResult) {
                _matched=true;
                _switchResult = "else";
              }
            }
            if (!_matched) {
              if (eObject instanceof ThenResult) {
                _matched=true;
                _switchResult = "then";
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeRequirementsWithoutPlanClaimCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _requirementsWithoutPlanClaimCount = ele.getMetrics().getRequirementsWithoutPlanClaimCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeRequirementsWithoutPlanClaimCount = this.getCumulativeRequirementsWithoutPlanClaimCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeRequirementsWithoutPlanClaimCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_requirementsWithoutPlanClaimCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeRequirementsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _requirementsCount = ele.getMetrics().getRequirementsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeRequirementsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_requirementsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_6);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_1, _function_3);
      TreeViewerColumn _treeViewerColumn_2 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_4 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Quality Categories Cvrg");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(180);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_7 ___AssureRequirementsCoverageView_7 = new __AssureRequirementsCoverageView_7() {
          {
            format = ObjectExtensions.<NumberFormat>operator_doubleArrow(NumberFormat.getPercentInstance(), ((Procedure1<NumberFormat>) (NumberFormat it_2) -> {
              it_2.setMinimumFractionDigits(2);
            }));
          }
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              int _cumulativeQualityCategoryRequirementsCount = this.getCumulativeQualityCategoryRequirementsCount(((AssureResult)eObject));
              int _cumulativeTotalQualityCategorysCount = this.getCumulativeTotalQualityCategorysCount(((AssureResult)eObject));
              double _divide = (((double) _cumulativeQualityCategoryRequirementsCount) / _cumulativeTotalQualityCategorysCount);
              _switchResult = this.format.format(_divide);
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int qualityReqs = ((AssureResult)eObject).getMetrics().getQualityCategoryRequirementsCount();
                  final int totalQuality = ((AssureResult)eObject).getMetrics().getTotalQualityCategoryCount();
                  int _cumulativeQualityCategoryRequirementsCount = this.getCumulativeQualityCategoryRequirementsCount(((AssureResult)eObject));
                  int _cumulativeTotalQualityCategorysCount = this.getCumulativeTotalQualityCategorysCount(((AssureResult)eObject));
                  double _divide = (((double) _cumulativeQualityCategoryRequirementsCount) / _cumulativeTotalQualityCategorysCount);
                  final String percent = this.format.format(_divide);
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(qualityReqs);
                  _builder.append(" of ");
                  _builder.append(totalQuality);
                  _builder.append(" | Cume: ");
                  _builder.append(percent);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              if (eObject instanceof Diagnostic) {
                _matched=true;
                String _elvis = null;
                EObject _modelElement = ((Diagnostic)eObject).getModelElement();
                String _constructLabel = null;
                if (_modelElement!=null) {
                  _constructLabel=AssureUtilExtension.constructLabel(_modelElement);
                }
                if (_constructLabel != null) {
                  _elvis = _constructLabel;
                } else {
                  String _constructMessage = AssureUtilExtension.constructMessage(((Diagnostic)eObject));
                  _elvis = _constructMessage;
                }
                _switchResult = _elvis;
              }
            }
            if (!_matched) {
              if (eObject instanceof ElseResult) {
                _matched=true;
                _switchResult = "else";
              }
            }
            if (!_matched) {
              if (eObject instanceof ThenResult) {
                _matched=true;
                _switchResult = "then";
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeQualityCategoryRequirementsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _qualityCategoryRequirementsCount = ele.getMetrics().getQualityCategoryRequirementsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeQualityCategoryRequirementsCount = this.getCumulativeQualityCategoryRequirementsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeQualityCategoryRequirementsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_qualityCategoryRequirementsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeTotalQualityCategorysCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _totalQualityCategoryCount = ele.getMetrics().getTotalQualityCategoryCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeTotalQualityCategorysCount = this.getCumulativeTotalQualityCategorysCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeTotalQualityCategorysCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_totalQualityCategoryCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_7);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_2, _function_4);
      TreeViewerColumn _treeViewerColumn_3 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_5 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Requirement for Features");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(180);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_8 ___AssureRequirementsCoverageView_8 = new __AssureRequirementsCoverageView_8() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              int _cumulativeFeaturesRequirementsCount = this.getCumulativeFeaturesRequirementsCount(((AssureResult)eObject));
              String _plus = (Integer.valueOf(_cumulativeFeaturesRequirementsCount) + " for ");
              int _cumulativeFeaturesCount = this.getCumulativeFeaturesCount(((AssureResult)eObject));
              _switchResult = (_plus + Integer.valueOf(_cumulativeFeaturesCount));
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int featuresReqs = ((AssureResult)eObject).getMetrics().getFeaturesRequirementsCount();
                  final int features = ((AssureResult)eObject).getMetrics().getFeaturesCount();
                  final int cumulativeFeaturesReqs = this.getCumulativeFeaturesRequirementsCount(((AssureResult)eObject));
                  final int cumulativeFeatures = this.getCumulativeFeaturesCount(((AssureResult)eObject));
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(featuresReqs);
                  _builder.append(" for ");
                  _builder.append(features);
                  _builder.append(" | Cume: ");
                  _builder.append(cumulativeFeaturesReqs);
                  _builder.append(" for ");
                  _builder.append(cumulativeFeatures);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              if (eObject instanceof Diagnostic) {
                _matched=true;
                String _elvis = null;
                EObject _modelElement = ((Diagnostic)eObject).getModelElement();
                String _constructLabel = null;
                if (_modelElement!=null) {
                  _constructLabel=AssureUtilExtension.constructLabel(_modelElement);
                }
                if (_constructLabel != null) {
                  _elvis = _constructLabel;
                } else {
                  String _constructMessage = AssureUtilExtension.constructMessage(((Diagnostic)eObject));
                  _elvis = _constructMessage;
                }
                _switchResult = _elvis;
              }
            }
            if (!_matched) {
              if (eObject instanceof ElseResult) {
                _matched=true;
                _switchResult = "else";
              }
            }
            if (!_matched) {
              if (eObject instanceof ThenResult) {
                _matched=true;
                _switchResult = "then";
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeFeaturesRequirementsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _featuresRequirementsCount = ele.getMetrics().getFeaturesRequirementsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeFeaturesRequirementsCount = this.getCumulativeFeaturesRequirementsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeFeaturesRequirementsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_featuresRequirementsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeFeaturesCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _featuresCount = ele.getMetrics().getFeaturesCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeFeaturesCount = this.getCumulativeFeaturesCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeFeaturesCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_featuresCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_8);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_3, _function_5);
      TreeViewerColumn _treeViewerColumn_4 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_6 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("No Verify Plans");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(120);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_9 ___AssureRequirementsCoverageView_9 = new __AssureRequirementsCoverageView_9() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              _switchResult = Integer.valueOf(this.getCumulativeNoVerificationPlansCount(((AssureResult)eObject))).toString();
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                int _noVerificationPlansCount = ((AssureResult)eObject).getMetrics().getNoVerificationPlansCount();
                String _plus = (Integer.valueOf(_noVerificationPlansCount) + " | Cume: ");
                int _cumulativeNoVerificationPlansCount = this.getCumulativeNoVerificationPlansCount(((AssureResult)eObject));
                _switchResult = (_plus + Integer.valueOf(_cumulativeNoVerificationPlansCount));
              }
            }
            if (!_matched) {
              if (eObject instanceof Diagnostic) {
                _matched=true;
                String _elvis = null;
                EObject _modelElement = ((Diagnostic)eObject).getModelElement();
                String _constructLabel = null;
                if (_modelElement!=null) {
                  _constructLabel=AssureUtilExtension.constructLabel(_modelElement);
                }
                if (_constructLabel != null) {
                  _elvis = _constructLabel;
                } else {
                  String _constructMessage = AssureUtilExtension.constructMessage(((Diagnostic)eObject));
                  _elvis = _constructMessage;
                }
                _switchResult = _elvis;
              }
            }
            if (!_matched) {
              if (eObject instanceof ElseResult) {
                _matched=true;
                _switchResult = "else";
              }
            }
            if (!_matched) {
              if (eObject instanceof ThenResult) {
                _matched=true;
                _switchResult = "then";
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeNoVerificationPlansCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _noVerificationPlansCount = ele.getMetrics().getNoVerificationPlansCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeNoVerificationPlansCount = this.getCumulativeNoVerificationPlansCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeNoVerificationPlansCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_noVerificationPlansCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_9);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_4, _function_6);
      TreeViewerColumn _treeViewerColumn_5 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_7 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Reqs w/Exception");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(150);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_10 ___AssureRequirementsCoverageView_10 = new __AssureRequirementsCoverageView_10() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              int _cumulativeExceptionsCount = this.getCumulativeExceptionsCount(((AssureResult)eObject));
              String _plus = (Integer.valueOf(_cumulativeExceptionsCount) + " of ");
              int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(((AssureResult)eObject));
              _switchResult = (_plus + Integer.valueOf(_cumulativeRequirementsCount));
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int exceptions = ((AssureResult)eObject).getMetrics().getExceptionsCount();
                  final int reqs = ((AssureResult)eObject).getMetrics().getRequirementsCount();
                  final int cumulativeExceptions = this.getCumulativeExceptionsCount(((AssureResult)eObject));
                  final int cumulativeReqs = this.getCumulativeRequirementsCount(((AssureResult)eObject));
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(exceptions);
                  _builder.append(" of ");
                  _builder.append(reqs);
                  _builder.append(" | Cume: ");
                  _builder.append(cumulativeExceptions);
                  _builder.append(" of ");
                  _builder.append(cumulativeReqs);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeExceptionsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _exceptionsCount = ele.getMetrics().getExceptionsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeExceptionsCount = this.getCumulativeExceptionsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeExceptionsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_exceptionsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeRequirementsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _requirementsCount = ele.getMetrics().getRequirementsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeRequirementsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_requirementsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_10);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_5, _function_7);
      TreeViewerColumn _treeViewerColumn_6 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_8 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Req Target w/EMV2");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(150);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_11 ___AssureRequirementsCoverageView_11 = new __AssureRequirementsCoverageView_11() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              int _cumulativeReqTargetHasEMV2SubclauseCount = this.getCumulativeReqTargetHasEMV2SubclauseCount(((AssureResult)eObject));
              String _plus = (Integer.valueOf(_cumulativeReqTargetHasEMV2SubclauseCount) + " of ");
              int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(((AssureResult)eObject));
              _switchResult = (_plus + Integer.valueOf(_cumulativeRequirementsCount));
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int cumulativeSubclauses = this.getCumulativeReqTargetHasEMV2SubclauseCount(((AssureResult)eObject));
                  final int reqs = ((AssureResult)eObject).getMetrics().getRequirementsCount();
                  final int cumulativeReqs = this.getCumulativeRequirementsCount(((AssureResult)eObject));
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(cumulativeSubclauses);
                  _builder.append(" of ");
                  _builder.append(reqs);
                  _builder.append(" | Cume: ");
                  _builder.append(cumulativeSubclauses);
                  _builder.append(" of ");
                  _builder.append(cumulativeReqs);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeReqTargetHasEMV2SubclauseCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _reqTargetHasEMV2SubclauseCount = ele.getMetrics().getReqTargetHasEMV2SubclauseCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeReqTargetHasEMV2SubclauseCount = this.getCumulativeReqTargetHasEMV2SubclauseCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeReqTargetHasEMV2SubclauseCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_reqTargetHasEMV2SubclauseCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeRequirementsCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _requirementsCount = ele.getMetrics().getRequirementsCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeRequirementsCount = this.getCumulativeRequirementsCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeRequirementsCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_requirementsCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_11);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_6, _function_8);
      TreeViewerColumn _treeViewerColumn_7 = new TreeViewerColumn(it, SWT.RIGHT);
      final Procedure1<TreeViewerColumn> _function_9 = (TreeViewerColumn it_1) -> {
        TreeColumn _column = it_1.getColumn();
        _column.setAlignment(SWT.LEFT);
        TreeColumn _column_1 = it_1.getColumn();
        _column_1.setText("Classifiers for Features Requiring");
        TreeColumn _column_2 = it_1.getColumn();
        ColumnPixelData _columnPixelData = new ColumnPixelData(150);
        columnLayout.setColumnData(_column_2, _columnPixelData);
        __AssureRequirementsCoverageView_12 ___AssureRequirementsCoverageView_12 = new __AssureRequirementsCoverageView_12() {
          @Override
          public String getText(final Object element) {
            String _switchResult = null;
            EObject _eObject = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true);
            final EObject eObject = _eObject;
            boolean _matched = false;
            if (eObject instanceof AssuranceCaseResult) {
              _matched=true;
              String _xblockexpression = null;
              {
                final int cumulativeFeaturesWith = this.getCumulativeFeaturesWithRequiredClassifierCount(((AssureResult)eObject));
                final int cumulativeFeaturesRequiring = this.getCumulativeFeaturesRequiringClassifierCount(((AssureResult)eObject));
                String _plus = (Integer.valueOf(cumulativeFeaturesWith) + " of ");
                _xblockexpression = (_plus + Integer.valueOf(cumulativeFeaturesRequiring));
              }
              _switchResult = _xblockexpression;
            }
            if (!_matched) {
              if (eObject instanceof ModelResult) {
                _matched=true;
              }
              if (!_matched) {
                if (eObject instanceof SubsystemResult) {
                  _matched=true;
                }
              }
              if (_matched) {
                String _xblockexpression = null;
                {
                  final int featuresWith = ((AssureResult)eObject).getMetrics().getFeaturesWithRequiredClassifierCount();
                  final int featuresRequiring = ((AssureResult)eObject).getMetrics().getFeaturesRequiringClassifierCount();
                  final int cumulativeFeaturesWith = this.getCumulativeFeaturesWithRequiredClassifierCount(((AssureResult)eObject));
                  final int cumulativeFeaturesRequiring = this.getCumulativeFeaturesRequiringClassifierCount(((AssureResult)eObject));
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append(featuresWith);
                  _builder.append(" of ");
                  _builder.append(featuresRequiring);
                  _builder.append(" | Cume: ");
                  _builder.append(cumulativeFeaturesWith);
                  _builder.append(" of ");
                  _builder.append(cumulativeFeaturesRequiring);
                  _xblockexpression = _builder.toString();
                }
                _switchResult = _xblockexpression;
              }
            }
            if (!_matched) {
              _switchResult = "?";
            }
            return _switchResult;
          }

          public int getCumulativeFeaturesWithRequiredClassifierCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _featuresWithRequiredClassifierCount = ele.getMetrics().getFeaturesWithRequiredClassifierCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeFeaturesWithRequiredClassifierCount = this.getCumulativeFeaturesWithRequiredClassifierCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeFeaturesWithRequiredClassifierCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_featuresWithRequiredClassifierCount + (_fold).intValue());
            }
            return _xblockexpression;
          }

          public int getCumulativeFeaturesRequiringClassifierCount(final AssureResult ele) {
            int _xblockexpression = (int) 0;
            {
              EList<? extends AssureResult> _switchResult = null;
              boolean _matched = false;
              if (ele instanceof AssuranceCaseResult) {
                _matched=true;
                _switchResult = ((AssuranceCaseResult)ele).getModelResult();
              }
              if (!_matched) {
                if (ele instanceof ModelResult) {
                  _matched=true;
                  _switchResult = ((ModelResult)ele).getSubsystemResult();
                }
              }
              if (!_matched) {
                if (ele instanceof SubsystemResult) {
                  _matched=true;
                  _switchResult = ((SubsystemResult)ele).getSubsystemResult();
                }
              }
              final EList<? extends AssureResult> results = _switchResult;
              int _featuresRequiringClassifierCount = ele.getMetrics().getFeaturesRequiringClassifierCount();
              final Function2<Integer, AssureResult, Integer> _function = (Integer sum, AssureResult res) -> {
                int _cumulativeFeaturesRequiringClassifierCount = this.getCumulativeFeaturesRequiringClassifierCount(res);
                return Integer.valueOf(((sum).intValue() + _cumulativeFeaturesRequiringClassifierCount));
              };
              Integer _fold = IterableExtensions.fold(results, Integer.valueOf(0), _function);
              _xblockexpression = (_featuresRequiringClassifierCount + (_fold).intValue());
            }
            return _xblockexpression;
          }
        };
        it_1.setLabelProvider(___AssureRequirementsCoverageView_12);
      };
      ObjectExtensions.<TreeViewerColumn>operator_doubleArrow(_treeViewerColumn_7, _function_9);
      it.setContentProvider(new ITreeContentProvider() {
        @Override
        public void dispose() {
        }

        @Override
        public Object[] getChildren(final Object parentElement) {
          final Function1<EObject, URI> _function = (EObject it_1) -> {
            return EcoreUtil.getURI(it_1);
          };
          return ((Object[])Conversions.unwrapArray(ListExtensions.<EObject, URI>map(AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) parentElement), true).eContents(), _function), Object.class));
        }

        @Override
        public Object[] getElements(final Object inputElement) {
          return ((Object[])Conversions.unwrapArray(((List<URI>) inputElement), Object.class));
        }

        @Override
        public Object getParent(final Object element) {
          Object _elvis = null;
          EObject _eContainer = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true).eContainer();
          URI _uRI = null;
          if (_eContainer!=null) {
            _uRI=EcoreUtil.getURI(_eContainer);
          }
          if (_uRI != null) {
            _elvis = _uRI;
          } else {
            Object _input = it.getInput();
            _elvis = _input;
          }
          return _elvis;
        }

        @Override
        public boolean hasChildren(final Object element) {
          boolean _isEmpty = AssureRequirementsCoverageView.this.resourceSetForUI.getEObject(((URI) element), true).eContents().isEmpty();
          return (!_isEmpty);
        }

        @Override
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }
      });
      Tree _tree = it.getTree();
      _tree.setHeaderVisible(true);
      Tree _tree_1 = it.getTree();
      _tree_1.setLinesVisible(true);
    };
    return ObjectExtensions.<TreeViewer>operator_doubleArrow(_treeViewer, _function);
  }

  private List<URI> getAssuranceCaseURIsInWorkspace() {
    final Function1<IEObjectDescription, URI> _function = (IEObjectDescription it) -> {
      return it.getEObjectURI();
    };
    return IterableExtensions.<URI>toList(IterableExtensions.<IEObjectDescription, URI>map(this.rds.getExportedObjectsByType(AlisaPackage.Literals.ASSURANCE_CASE), _function));
  }

  private void updateAssureViewer(final URI assuranceCaseURI, final boolean updateRequirementsCoverageView) {
    URI _get = this.selectedFilters.get(assuranceCaseURI);
    final Pair<URI, URI> newURIs = Pair.<URI, URI>of(assuranceCaseURI, _get);
    boolean _notEquals = (!Objects.equal(this.displayedCaseAndFilter, newURIs));
    if (_notEquals) {
      this.displayedCaseAndFilter = newURIs;
      final EObject selectedAlisaObject = this.resourceSetForUI.getEObject(assuranceCaseURI, true);
      AssuranceCaseResult _xifexpression = null;
      if ((assuranceCaseURI != null)) {
        AssuranceCaseResult _xifexpression_1 = null;
        if ((selectedAlisaObject instanceof AssuranceCase)) {
          AssuranceCaseResult _xblockexpression = null;
          {
            final Iterable<IEObjectDescription> resultDescriptions = this.rds.getExportedObjectsByType(
              AssurePackage.Literals.ASSURANCE_CASE_RESULT);
            final Function1<IEObjectDescription, AssuranceCaseResult> _function = (IEObjectDescription it) -> {
              EObject _eObject = this.resourceSetForUI.getEObject(it.getEObjectURI(), true);
              return ((AssuranceCaseResult) _eObject);
            };
            final Iterable<AssuranceCaseResult> results = IterableExtensions.<IEObjectDescription, AssuranceCaseResult>map(resultDescriptions, _function);
            final Function1<AssuranceCaseResult, Boolean> _function_1 = (AssuranceCaseResult it) -> {
              String _name = it.getName();
              String _name_1 = ((AssuranceCase)selectedAlisaObject).getName();
              return Boolean.valueOf(Objects.equal(_name, _name_1));
            };
            _xblockexpression = IterableExtensions.<AssuranceCaseResult>findFirst(results, _function_1);
          }
          _xifexpression_1 = _xblockexpression;
        }
        _xifexpression = _xifexpression_1;
      }
      AssuranceCaseResult result = _xifexpression;
      CategoryFilter _xifexpression_2 = null;
      if (((result != null) && (this.displayedCaseAndFilter.getValue() != null))) {
        EObject _eObject = this.resourceSetForUI.getEObject(this.displayedCaseAndFilter.getValue(), true);
        _xifexpression_2 = ((CategoryFilter) _eObject);
      }
      final CategoryFilter filter = _xifexpression_2;
      if ((result == null)) {
        if ((selectedAlisaObject instanceof AssuranceCase)) {
          result = this.computeCoverage(((AssuranceCase)selectedAlisaObject), assuranceCaseURI, filter);
        }
      }
      this.setAssuranceCaseResult(result, filter);
    }
  }

  private AssuranceCaseResult createAndComputeCoverage(final AssuranceCase assuranceCase, final URI assuranceCaseURI, final Function1<? super ResourceSet, ? extends Pair<IProject, AssuranceCaseResult>> getProjectAndResult, final CategoryFilter filter) {
    AssuranceCaseResult _xblockexpression = null;
    {
      final IEditorPart[] dirtyEditors = this.getViewSite().getPage().getDirtyEditors();
      boolean _isEmpty = ((List<IEditorPart>)Conversions.doWrapArray(dirtyEditors)).isEmpty();
      boolean _not = (!_isEmpty);
      if (_not) {
        final NullProgressMonitor monitor = new NullProgressMonitor();
        final Consumer<IEditorPart> _function = (IEditorPart it) -> {
          it.doSave(monitor);
        };
        ((List<IEditorPart>)Conversions.doWrapArray(dirtyEditors)).forEach(_function);
      }
      final ResourceSet resourceSetForProcessing = this.resourceSetProvider.get(null);
      final Pair<IProject, AssuranceCaseResult> assureProjectAndResult = getProjectAndResult.apply(resourceSetForProcessing);
      final AssuranceCaseResult assuranceCaseResult = assureProjectAndResult.getValue();
      this.assureRequirementMetricsProcessor.processCase(assuranceCaseResult, filter, null);
      _xblockexpression = assuranceCaseResult;
    }
    return _xblockexpression;
  }

  private AssuranceCaseResult computeCoverage(final AssuranceCase assuranceCase, final URI assuranceCaseURI, final CategoryFilter filter) {
    final Function1<ResourceSet, Pair<IProject, AssuranceCaseResult>> _function = (ResourceSet resourceSetForProcessing) -> {
      return this.createCaseResult(assuranceCase, assuranceCaseURI, resourceSetForProcessing);
    };
    return this.createAndComputeCoverage(assuranceCase, assuranceCaseURI, _function, filter);
  }

  private Pair<IProject, AssuranceCaseResult> createCaseResult(final AssuranceCase assuranceCase, final URI assuranceCaseURI, final ResourceSet resourceSetForProcessing) {
    Pair<IProject, AssuranceCaseResult> _xblockexpression = null;
    {
      IWorkspaceRoot _root = ResourcesPlugin.getWorkspace().getRoot();
      String _platformString = assuranceCaseURI.toPlatformString(true);
      Path _path = new Path(_platformString);
      final IProject assureProject = _root.getFile(_path).getProject();
      StringConcatenation _builder = new StringConcatenation();
      IPath _fullPath = assureProject.getFullPath();
      _builder.append(_fullPath);
      _builder.append("/assure/");
      String _name = assuranceCase.getName();
      _builder.append(_name);
      _builder.append(".assure");
      final URI assureURI = URI.createPlatformResourceURI(_builder.toString(), false);
      final AtomicReference<AssuranceCaseResult> assuranceCaseResultHolder = new AtomicReference<AssuranceCaseResult>();
      final AssuranceCaseResult assuranceCaseResult = this.assureConstructor.generateFullAssuranceCase(assuranceCase);
      AssureUtilExtension.resetToTBD(assuranceCaseResult, null);
      AssureUtilExtension.recomputeAllCounts(assuranceCaseResult, null);
      Resource _elvis = null;
      Resource _resource = resourceSetForProcessing.getResource(assureURI, false);
      if (_resource != null) {
        _elvis = _resource;
      } else {
        Resource _createResource = resourceSetForProcessing.createResource(assureURI);
        _elvis = _createResource;
      }
      final Resource resource = _elvis;
      resource.getContents().clear();
      EList<EObject> _contents = resource.getContents();
      _contents.add(assuranceCaseResult);
      try {
        resource.save(null);
      } catch (final Throwable _t) {
        if (_t instanceof IOException) {
        } else {
          throw Exceptions.sneakyThrow(_t);
        }
      }
      assuranceCaseResultHolder.set(assuranceCaseResult);
      AssuranceCaseResult _get = assuranceCaseResultHolder.get();
      _xblockexpression = Pair.<IProject, AssuranceCaseResult>of(assureProject, _get);
    }
    return _xblockexpression;
  }

  void setAssuranceCaseResult(final AssuranceCaseResult assuranceCaseResult, final CategoryFilter filter) {
    final Object[] expandedElements = this.assureCoverageViewer.getExpandedElements();
    this.assureRequirementMetricsProcessor.processCase(assuranceCaseResult, filter, null);
    URI _uRI = EcoreUtil.getURI(assuranceCaseResult);
    this.assureCoverageViewer.setInput(Collections.<URI>unmodifiableList(CollectionLiterals.<URI>newArrayList(_uRI)));
    this.assureCoverageViewer.setExpandedElements(expandedElements);
  }
}