/*******************************************************************************
* Copyright (c) 2010-2015 Henshin developers. 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:
* TU Berlin, University of Luxembourg, SES S.A.
*******************************************************************************/
/**
*
*/
package de.tub.tfs.henshin.editor.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.henshin.model.ConditionalUnit;
import org.eclipse.emf.henshin.model.HenshinPackage;
import org.eclipse.emf.henshin.model.IndependentUnit;
import org.eclipse.emf.henshin.model.LoopUnit;
import org.eclipse.emf.henshin.model.PriorityUnit;
import org.eclipse.emf.henshin.model.SequentialUnit;
import org.eclipse.emf.henshin.model.Unit;
import de.tub.tfs.henshin.editor.internal.ConditionalUnitPart;
import de.tub.tfs.henshin.editor.internal.TransformationUnitPart;
/**
* The Class TransformationUnitUtil.
*/
public class TransformationUnitUtil {
/**
* Gets the sub units.
*
* @param tUnit
* the t unit
* @return the sub units
*/
@SuppressWarnings("unchecked")
public static List<Unit> getSubUnits(Unit tUnit) {
EStructuralFeature feature = getSubUnitsFeature(tUnit);
List<Unit> list = new Vector<Unit>();
if (feature != null) {
if (feature.isMany()) {
return (List<Unit>) tUnit.eGet(feature);
} else {
Object object = null;
if (tUnit instanceof TransformationUnitPart<?>) {
object = ((TransformationUnitPart<?>) tUnit).getModel()
.eGet(feature);
} else {
object = tUnit.eGet(feature);
}
if (object != null) {
list.add((Unit) object);
}
}
}
if (tUnit instanceof ConditionalUnit) {
ConditionalUnit cUnit = (ConditionalUnit) tUnit;
if (cUnit.getIf() != null) {
list.add(cUnit.getIf());
}
if (cUnit.getThen() != null) {
list.add(cUnit.getThen());
}
if (cUnit.getElse() != null) {
list.add(cUnit.getElse());
}
}
return list;
}
/**
* Gets the sub units feature.
*
* @param tUnit
* the t unit
* @return the sub units feature
*/
public static EStructuralFeature getSubUnitsFeature(Unit tUnit) {
if (tUnit instanceof SequentialUnit) {
return tUnit.eClass().getEStructuralFeature(
HenshinPackage.SEQUENTIAL_UNIT__SUB_UNITS);
}
if (tUnit instanceof IndependentUnit) {
return tUnit.eClass().getEStructuralFeature(
HenshinPackage.INDEPENDENT_UNIT__SUB_UNITS);
}
if (tUnit instanceof PriorityUnit) {
return tUnit.eClass().getEStructuralFeature(
HenshinPackage.PRIORITY_UNIT__SUB_UNITS);
}
if (tUnit instanceof ConditionalUnitPart) {
return ((ConditionalUnitPart) tUnit).getFeature();
}
if (tUnit instanceof LoopUnit) {
return HenshinPackage.Literals.UNARY_UNIT__SUB_UNIT;
}
return null;
}
/**
* Creates the conditional unit parts.
*
* @param conditionalUnit
* the conditional unit
* @return the list
*/
public static List<ConditionalUnitPart> createConditionalUnitParts(
ConditionalUnit conditionalUnit) {
List<ConditionalUnitPart> list = new ArrayList<ConditionalUnitPart>();
list.add(new ConditionalUnitPart(conditionalUnit, "IF", conditionalUnit
.eClass().getEStructuralFeature(
HenshinPackage.CONDITIONAL_UNIT__IF)));
list.add(new ConditionalUnitPart(conditionalUnit, "THEN",
conditionalUnit.eClass().getEStructuralFeature(
HenshinPackage.CONDITIONAL_UNIT__THEN)));
list.add(new ConditionalUnitPart(conditionalUnit, "ELSE",
conditionalUnit.eClass().getEStructuralFeature(
HenshinPackage.CONDITIONAL_UNIT__ELSE)));
return list;
}
}