/******************************************************************************* * Copyright (c) 2017 Rogue Wave Software Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Rogue Wave Software Inc. - initial implementation *******************************************************************************/ package org.eclipse.php.phpunit.model.providers; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.php.phpunit.model.elements.*; public class PHPUnitTestTraceTreeContentProvider extends ArrayContentProvider implements ITreeContentProvider { private boolean filter; public PHPUnitTestTraceTreeContentProvider(final boolean filter) { this.filter = filter; } @Override public Object[] getElements(final Object inputElement) { return getChildren(inputElement); } @Override public Object[] getChildren(final Object parentElement) { final List<PHPUnitElement> results = new ArrayList<>(); if (parentElement instanceof PHPUnitTestCase) { getCaseChildren((PHPUnitTestCase) parentElement, results); } if (parentElement instanceof PHPUnitTestEvent) { getEventChildren((PHPUnitTestEvent) parentElement, results); } return results.toArray(); } private void getCaseChildren(final PHPUnitTestCase testCase, final List<PHPUnitElement> results) { final PHPUnitTestException exception = testCase.getException(); if (exception != null && exception.getTrace() != null && (!filter || !exception.isFiltered())) { results.add(testCase.getException()); } final List<PHPUnitElement> warnings = testCase.getWarnings(); if (warnings == null || warnings.isEmpty()) { return; } if (!filter) { results.addAll(warnings); } else { for (PHPUnitElement warning : warnings) { if (!warning.isFiltered()) { results.add(warning); } } } } private void getEventChildren(final PHPUnitTestEvent testEvent, final List<PHPUnitElement> results) { List<? extends PHPUnitElement> trace = testEvent.getTrace(); if (trace == null || trace.isEmpty()) { return; } if (!filter) { results.addAll(trace); } else { for (PHPUnitElement frame : trace) { if (!frame.isFiltered()) { results.add(frame); } } } } @Override public Object getParent(final Object element) { if (element instanceof PHPUnitTraceFrame) { return ((PHPUnitTraceFrame) element).getParent(); } return null; } @Override public boolean hasChildren(final Object element) { if (element instanceof PHPUnitTestCase) { return hasChildrenCase((PHPUnitTestCase) element); } if (element instanceof PHPUnitTestEvent) { return hasChildrenEvent((PHPUnitTestEvent) element); } return false; } private boolean hasChildrenCase(final PHPUnitTestCase testCase) { if (testCase.getException() != null) { return true; } final List<PHPUnitElement> warnings = testCase.getWarnings(); if (warnings != null && !warnings.isEmpty()) { return true; } return false; } private boolean hasChildrenEvent(final PHPUnitTestEvent testEvent) { List<?> trace = testEvent.getTrace(); if (trace != null && !trace.isEmpty()) { return true; } return false; } }