/**
* 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.doc;
import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.StringExtensions;
import org.jnario.Specification;
import org.jnario.doc.AbstractDocGenerator;
import org.jnario.doc.HtmlFile;
import org.jnario.doc.HtmlFileBuilder;
import org.jnario.report.Executable2ResultMapping;
import org.jnario.suite.jvmmodel.SpecResolver;
import org.jnario.suite.jvmmodel.SuiteClassNameProvider;
import org.jnario.suite.suite.Reference;
import org.jnario.suite.suite.SpecReference;
import org.jnario.suite.suite.Suite;
import org.jnario.suite.suite.SuiteFile;
import org.jnario.util.Strings;
import org.jnario.util.XtendTypes;
@SuppressWarnings("all")
public class SuiteDocGenerator extends AbstractDocGenerator {
@Inject
@Extension
private SuiteClassNameProvider _suiteClassNameProvider;
@Inject
@Extension
private SpecResolver _specResolver;
@Inject
@Extension
private HtmlFileBuilder _htmlFileBuilder;
public void doGenerate(final Resource input, final IFileSystemAccess fsa, final Executable2ResultMapping spec2ResultMapping) {
this.initResultMapping(spec2ResultMapping);
EList<EObject> _contents = input.getContents();
Iterable<SuiteFile> _filter = Iterables.<SuiteFile>filter(_contents, SuiteFile.class);
final Procedure1<SuiteFile> _function = new Procedure1<SuiteFile>() {
public void apply(final SuiteFile it) {
final HtmlFile htmlFile = SuiteDocGenerator.this.createHtmlFile(it);
EList<XtendTypeDeclaration> _xtendTypes = it.getXtendTypes();
XtendTypeDeclaration _head = IterableExtensions.<XtendTypeDeclaration>head(_xtendTypes);
SuiteDocGenerator.this._htmlFileBuilder.generate(_head, fsa, htmlFile);
}
};
IterableExtensions.<SuiteFile>forEach(_filter, _function);
}
public HtmlFile createHtmlFile(final SuiteFile file) {
HtmlFile _xblockexpression = null;
{
EList<XtendTypeDeclaration> _xtendTypes = file.getXtendTypes();
final Iterable<Suite> suites = Iterables.<Suite>filter(_xtendTypes, Suite.class);
boolean _isEmpty = IterableExtensions.isEmpty(suites);
if (_isEmpty) {
return HtmlFile.EMPTY_FILE;
}
final Suite rootSuite = IterableExtensions.<Suite>head(suites);
final Procedure1<HtmlFile> _function = new Procedure1<HtmlFile>() {
public void apply(final HtmlFile it) {
String _javaClassName = SuiteDocGenerator.this._suiteClassNameProvider.toJavaClassName(rootSuite);
it.setName(_javaClassName);
String _describe = SuiteDocGenerator.this._suiteClassNameProvider.describe(rootSuite);
String _decode = SuiteDocGenerator.this.decode(_describe);
it.setTitle(_decode);
CharSequence _generateContent = SuiteDocGenerator.this.generateContent(suites);
it.setContent(_generateContent);
String _root = SuiteDocGenerator.this.root(rootSuite);
it.setRootFolder(_root);
CharSequence _pre = SuiteDocGenerator.this.pre(file, "lang-suite");
it.setSourceCode(_pre);
String _fileName = SuiteDocGenerator.this.fileName(file);
it.setFileName(_fileName);
String _executionStateClass = SuiteDocGenerator.this.executionStateClass(rootSuite);
it.setExecutionStatus(_executionStateClass);
}
};
_xblockexpression = HtmlFile.newHtmlFile(_function);
}
return _xblockexpression;
}
public HtmlFile createHtmlFile(final XtendClass file) {
HtmlFile _xblockexpression = null;
{
final Suite suite = ((Suite) file);
final Procedure1<HtmlFile> _function = new Procedure1<HtmlFile>() {
public void apply(final HtmlFile it) {
String _javaClassName = SuiteDocGenerator.this._suiteClassNameProvider.toJavaClassName(suite);
it.setName(_javaClassName);
String _describe = SuiteDocGenerator.this._suiteClassNameProvider.describe(suite);
String _decode = SuiteDocGenerator.this.decode(_describe);
it.setTitle(_decode);
CharSequence _generateContent = SuiteDocGenerator.this.generateContent(suite);
it.setContent(_generateContent);
String _root = SuiteDocGenerator.this.root(suite);
it.setRootFolder(_root);
CharSequence _pre = SuiteDocGenerator.this.pre(file, "lang-suite");
it.setSourceCode(_pre);
String _fileName = SuiteDocGenerator.this.fileName(file);
it.setFileName(_fileName);
String _executionStateClass = SuiteDocGenerator.this.executionStateClass(suite);
it.setExecutionStatus(_executionStateClass);
}
};
_xblockexpression = HtmlFile.newHtmlFile(_function);
}
return _xblockexpression;
}
public CharSequence generateContent(final Iterable<Suite> suites) {
StringConcatenation _builder = new StringConcatenation();
{
for(final Suite suite : suites) {
{
Suite _head = IterableExtensions.<Suite>head(suites);
boolean _equals = Objects.equal(suite, _head);
boolean _not = (!_equals);
if (_not) {
CharSequence _title = this.title(suite);
_builder.append(_title, "");
_builder.newLineIfNotEmpty();
}
}
CharSequence _generateContent = this.generateContent(suite);
_builder.append(_generateContent, "");
_builder.newLineIfNotEmpty();
}
}
return _builder;
}
public CharSequence title(final Suite suite) {
StringConcatenation _builder = new StringConcatenation();
String _name = suite.getName();
final String title = Strings.firstLine(_name);
_builder.newLineIfNotEmpty();
_builder.append("<span");
String _id = this.id(title);
_builder.append(_id, "");
_builder.append(" class=\"suite ");
String _executionStateClass = this.executionStateClass(suite);
_builder.append(_executionStateClass, "");
_builder.append("\">");
String _markdown2Html = this.markdown2Html(title);
_builder.append(_markdown2Html, "");
_builder.append("</span>");
_builder.newLineIfNotEmpty();
return _builder;
}
public String desc(final Suite suite) {
String _name = suite.getName();
String _trimFirstLine = Strings.trimFirstLine(_name);
return this.markdown2Html(_trimFirstLine);
}
public CharSequence generateContent(final Suite suite) {
StringConcatenation _builder = new StringConcatenation();
String _desc = this.desc(suite);
_builder.append(_desc, "");
_builder.newLineIfNotEmpty();
{
EList<Reference> _elements = suite.getElements();
boolean _isEmpty = _elements.isEmpty();
boolean _not = (!_isEmpty);
if (_not) {
_builder.append("<ul>");
_builder.newLine();
{
EList<Reference> _elements_1 = suite.getElements();
for(final Reference spec : _elements_1) {
_builder.append("\t");
CharSequence _generate = this.generate(spec);
_builder.append(_generate, "\t");
_builder.newLineIfNotEmpty();
}
}
_builder.append("</ul>");
_builder.newLine();
}
}
return _builder;
}
public CharSequence generate(final Reference ref) {
StringConcatenation _builder = new StringConcatenation();
{
List<Specification> _resolveSpecs = this._specResolver.resolveSpecs(ref);
for(final Specification spec : _resolveSpecs) {
_builder.append("<li><a class=\"specref ");
String _executionStateClass = this.executionStateClass(spec);
_builder.append(_executionStateClass, "");
_builder.append("\" href=\"");
String _linkTo = this.linkTo(ref, spec);
_builder.append(_linkTo, "");
_builder.append("\">");
String _describe = this._suiteClassNameProvider.describe(spec);
_builder.append(_describe, "");
_builder.append("</a>");
String _executionState = this.executionState(spec);
_builder.append(_executionState, "");
String _text = this.text(ref);
_builder.append(_text, "");
_builder.append("</li>");
_builder.newLineIfNotEmpty();
}
}
return _builder;
}
public String linkTo(final EObject context, final Specification spec) {
String _xblockexpression = null;
{
String _xifexpression = null;
String _packageName = XtendTypes.packageName(spec);
boolean _equals = Objects.equal(_packageName, null);
if (_equals) {
_xifexpression = "";
} else {
String _packageName_1 = XtendTypes.packageName(spec);
_xifexpression = _packageName_1.replace(".", "/");
}
final String path = _xifexpression;
String _root = this.root(context);
String _plus = (_root + path);
String _plus_1 = (_plus + "/");
String _javaClassName = this._suiteClassNameProvider.toJavaClassName(spec);
String _htmlFileName = this.htmlFileName(_javaClassName);
_xblockexpression = (_plus_1 + _htmlFileName);
}
return _xblockexpression;
}
public String text(final Reference ref) {
boolean _matched = false;
if (!_matched) {
if (ref instanceof SpecReference) {
String _text = ((SpecReference)ref).getText();
String _trim = null;
if (_text!=null) {
_trim=_text.trim();
}
boolean _isNullOrEmpty = StringExtensions.isNullOrEmpty(_trim);
boolean _not = (!_isNullOrEmpty);
if (_not) {
_matched=true;
String _text_1 = ((SpecReference)ref).getText();
String result = this.markdown2Html(_text_1);
int _length = result.length();
int _minus = (_length - 4);
String _substring = result.substring(3, _minus);
result = _substring;
return (": " + result);
}
}
}
return "";
}
}