/**
* Copyright (c) 2016 committers of YAKINDU 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:
* committers of YAKINDU - initial API and implementation
*/
package org.yakindu.sct.generator.core.execution;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.validation.CheckMode;
import org.eclipse.xtext.validation.IResourceValidator;
import org.eclipse.xtext.validation.Issue;
import org.yakindu.base.base.NamedElement;
import org.yakindu.sct.generator.core.console.IConsoleLogger;
import org.yakindu.sct.generator.core.filesystem.DefaultFileSystemAccessFactory;
import org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess;
import org.yakindu.sct.generator.core.library.ICoreLibraryHelper;
import org.yakindu.sct.model.sgen.GeneratorEntry;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
*
* @author andreas muelder - Initial contribution and API
*
*/
public abstract class AbstractGeneratorEntryExecutor implements IGeneratorEntryExecutor {
@Inject
protected DefaultFileSystemAccessFactory factory;
@Inject
protected IConsoleLogger logger;
@Inject
protected ICoreLibraryHelper helper;
@Inject
protected IResourceValidator validator;
@Inject(optional = true)
@Named(SKIP_VALIDATION)
protected boolean skipValidation = false;
protected abstract void execute(ISCTFileSystemAccess access, GeneratorEntry generatorEntry);
@Override
public void execute(GeneratorEntry entry) {
logStart(entry);
if (valid(entry)) {
try {
execute(factory.create(entry), entry);
} catch (Exception ex) {
logger.logError(ex);
}
}
logEnd(entry);
}
protected void logStart(GeneratorEntry entry) {
EObject elementRef = entry.getElementRef();
String elementName = elementRef instanceof NamedElement
? ((NamedElement) elementRef).getName()
: elementRef.toString();
String targetProject = helper.getTargetProjectValue(entry).getStringValue();
logger.log(String.format("Generating '%s' to target project '%s' ...", elementName, targetProject));
}
protected void logEnd(GeneratorEntry entry) {
logger.log(((NamedElement) entry.getElementRef()).getName() + " done.");
}
protected void logException(Exception ex) {
logger.logError(ex);
}
protected boolean valid(GeneratorEntry entry) {
if (skipValidation) {
logger.log("Validation skipped...");
return true;
}
List<Issue> issues = validator.validate(entry.getElementRef().eResource(), CheckMode.ALL, null);
Iterable<Issue> errors = Iterables.filter(issues, new Predicate<Issue>() {
@Override
public boolean apply(Issue input) {
return input.getSeverity() == Severity.ERROR;
}
});
if (!Iterables.isEmpty(errors)) {
logger.log("The referenced model(" + ((NamedElement) entry.getElementRef()).getName()
+ ") contains errors and could not be generated:");
for (Issue issue : errors) {
logger.log(issue.getMessage());
}
return false;
}
return true;
}
}