/**
* Copyright (c) 2015 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.model.stext.ui.tasks;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.tasks.DefaultTaskFinder;
import org.eclipse.xtext.tasks.ITaskParser;
import org.eclipse.xtext.tasks.ITaskTagProvider;
import org.eclipse.xtext.tasks.Task;
import org.eclipse.xtext.tasks.TaskTags;
import org.yakindu.base.base.BasePackage;
import org.yakindu.base.base.DocumentedElement;
import org.yakindu.sct.model.sgraph.SGraphPackage;
import org.yakindu.sct.model.sgraph.SpecificationElement;
import org.yakindu.sct.model.stext.resource.StextResource;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
/**
*
* @author andreas muelder - Initial contribution and API
*
*/
@SuppressWarnings("restriction")
public class STextTaskFinder extends DefaultTaskFinder {
@Inject
ITaskTagProvider taskTagProvider;
@Inject
private ITaskParser parser;
@Override
public List<Task> findTasks(Resource resource) {
if (resource instanceof StextResource) {
return findTasks((StextResource) resource);
}
return super.findTasks(resource);
}
//TODO: Extend the Task class to provide element id for MarkerNavigatorService
public List<Task> findTasks(StextResource resource) {
TaskTags taskTags = taskTagProvider.getTaskTags(resource);
List<Task> result = Lists.newArrayList();
TreeIterator<EObject> allContents = resource.getAllContents();
while (allContents.hasNext()) {
EObject eObject = (EObject) allContents.next();
if (eObject instanceof SpecificationElement) {
List<Task> parseTasks = parseTasks(eObject,
SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION, taskTags);
result.addAll(parseTasks);
}
if (eObject instanceof DocumentedElement) {
result.addAll(parseTasks(eObject, BasePackage.Literals.DOCUMENTED_ELEMENT__DOCUMENTATION, taskTags));
}
}
return result;
}
protected List<Task> parseTasks(EObject element, EStructuralFeature feature, TaskTags tags) {
String expression = (String) element.eGet(feature);
if (expression == null)
return Collections.emptyList();
return parser.parseTasks(expression, tags);
}
}