blob: 69a403686f086c52d07fece9a3d2b9639616c7f8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.core.query;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
import org.eclipse.mylyn.docs.intent.core.document.IntentGenericElement;
import org.eclipse.mylyn.docs.intent.core.document.IntentSection;
import org.eclipse.mylyn.docs.intent.core.document.IntentStructuredElement;
import org.eclipse.mylyn.docs.intent.core.document.UnitInstruction;
import org.eclipse.mylyn.docs.intent.core.document.descriptionunit.DescriptionBloc;
import org.eclipse.mylyn.docs.intent.core.document.descriptionunit.DescriptionUnit;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
import org.eclipse.mylyn.docs.intent.markup.markup.Paragraph;
/**
* Class that provides useful services on Intent element.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public final class IntentHelper {
/**
* IntentHelper constructor.
*/
private IntentHelper() {
}
/**
* Indicates if the given element is an Intent element that can be hold by an IntentEditor.
*
* @param element
* the element to determine if it can be opened by an IntentEditor
* @return true if the given element is an Intent element that can be hold by an IntentEditor, false
* otherwise
*/
public static boolean canBeOpenedByIntentEditor(Object element) {
return element instanceof IntentStructuredElement;
}
/**
* Returns all the compilation status associated to the given elements and its sons.
*
* @param element
* the element to inspect
* @return all the compilation status associated to the given elements and its sons
*/
public static EList<CompilationStatus> getAllStatus(IntentGenericElement element) {
EList<CompilationStatus> allCompilationStatus = new BasicEList<CompilationStatus>();
allCompilationStatus.addAll(element.getCompilationStatus());
for (EObject object : element.eContents()) {
if (object instanceof IntentGenericElement) {
allCompilationStatus.addAll(getAllStatus((IntentGenericElement)object));
}
}
return allCompilationStatus;
}
/**
* Indicates if the given root contain the given searchedElement.
*
* @param root
* the root to study
* @param searchedElement
* the searchedElement
* @return true if the given root contain the given searchedElement, false otherwise
*/
public static boolean containsElement(IntentGenericElement root, IntentGenericElement searchedElement) {
boolean containsElement = root == searchedElement;
if (!containsElement && root != null) {
Iterator<EObject> containedElementsIterator = root.eContents().iterator();
while (!containsElement && containedElementsIterator.hasNext()) {
EObject containedElement = containedElementsIterator.next();
if (containedElement instanceof IntentGenericElement) {
containsElement = containsElement((IntentGenericElement)containedElement, searchedElement);
}
}
}
return containsElement;
}
/**
* Returns all model elements instance of the given class contained in the given root.
*
* @param root
* the root in which search should be performed
* @param clazz
* the expected type of contained element
* @param <T>
* the expected type of contained element
* @return all model elements instance of the given class contained in the given root
*/
public static <T> Collection<T> getAllContainedElements(Class<T> clazz, IntentGenericElement root) {
Collection<T> containedElements = Sets.newLinkedHashSet();
if (root instanceof IntentSection) {
for (IntentSection section : ((IntentSection)root).getSubSections()) {
containedElements.addAll(getAllContainedElements(clazz, section));
}
for (DescriptionUnit descriptionUnit : ((IntentSection)root).getDescriptionUnits()) {
containedElements.addAll(getAllContainedElements(clazz, descriptionUnit));
}
for (ModelingUnit unit : ((IntentSection)root).getModelingUnits()) {
containedElements.addAll(getAllContainedElements(clazz, unit));
}
}
if (root instanceof ModelingUnit) {
containedElements.addAll(Sets.newLinkedHashSet(Iterables.filter(
((ModelingUnit)root).getInstructions(), clazz)));
}
if (root instanceof DescriptionUnit) {
for (UnitInstruction bloc : ((DescriptionUnit)root).getInstructions()) {
if (bloc instanceof DescriptionBloc) {
for (Paragraph paragraph : Iterables.filter(((DescriptionBloc)bloc).getDescriptionBloc()
.getContent(), Paragraph.class)) {
containedElements.addAll(Sets.newLinkedHashSet(Iterables.filter(
((Paragraph)paragraph).getContent(), clazz)));
}
}
}
}
return containedElements;
}
}