/** * Copyright (c) 2012 BMW Car IT 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 */ package org.jnario.suite.jvmmodel; import com.google.common.base.Objects; import com.google.common.collect.Iterables; import com.google.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtend.core.xtend.XtendTypeDeclaration; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IntegerRange; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.ListExtensions; import org.jnario.Specification; import org.jnario.suite.jvmmodel.SpecResolver; import org.jnario.suite.jvmmodel.SuiteNode; import org.jnario.suite.suite.Reference; import org.jnario.suite.suite.Suite; import org.jnario.suite.suite.SuiteFile; @SuppressWarnings("all") public class SuiteNodeBuilder { private final static char PREFIX = "#".charAt(0); @Inject @Extension private SpecResolver _specResolver; public Iterable<SuiteNode> buildNodeModel(final SuiteFile suiteFile) { ArrayList<SuiteNode> _xblockexpression = null; { EList<XtendTypeDeclaration> _xtendTypes = suiteFile.getXtendTypes(); Iterable<Suite> _filter = Iterables.<Suite>filter(_xtendTypes, Suite.class); final List<Suite> suites = IterableExtensions.<Suite>toList(_filter); final ArrayList<SuiteNode> result = CollectionLiterals.<SuiteNode>newArrayList(); boolean _isEmpty = suites.isEmpty(); if (_isEmpty) { return result; } final HashMap<EObject, SuiteNode> mapping = CollectionLiterals.<EObject, SuiteNode>newHashMap(); int _size = suites.size(); int _minus = (_size - 1); IntegerRange _upTo = new IntegerRange(0, _minus); for (final Integer i : _upTo) { { final Suite current = suites.get((i).intValue()); Suite _parent = this.parent(suites, (i).intValue()); final SuiteNode parentNode = mapping.get(_parent); final SuiteNode currentNode = this.createNode(current, parentNode); mapping.put(current, currentNode); boolean _equals = Objects.equal(parentNode, null); if (_equals) { result.add(currentNode); } } } _xblockexpression = result; } return _xblockexpression; } public SuiteNode createNode(final Suite current, final SuiteNode parent) { EList<Reference> _elements = current.getElements(); final Function1<Reference, List<Specification>> _function = new Function1<Reference, List<Specification>>() { public List<Specification> apply(final Reference it) { return SuiteNodeBuilder.this._specResolver.resolveSpecs(it); } }; List<List<Specification>> _map = ListExtensions.<Reference, List<Specification>>map(_elements, _function); final Iterable<Specification> specs = Iterables.<Specification>concat(_map); final SuiteNode node = new SuiteNode(current, specs); node.setParent(parent); return node; } public Suite parent(final List<Suite> suites, final int i) { if ((i == 0)) { return null; } Suite _get = suites.get(i); final int current = this.level(_get); IntegerRange _upTo = new IntegerRange((i - 1), 0); for (final Integer j : _upTo) { { final Suite candidate = suites.get((j).intValue()); int _level = this.level(candidate); boolean _greaterThan = (current > _level); if (_greaterThan) { return candidate; } } } return null; } public int level(final Suite suite) { final String name = suite.getName(); int i = 0; while ((i < name.length())) { { char _charAt = name.charAt(i); boolean _notEquals = (_charAt != SuiteNodeBuilder.PREFIX); if (_notEquals) { return i; } i = (i + 1); } } return i; } }