blob: d36b0f71e5bfb6d2471b1951e3d6329e028b4d76 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Willink Transformations 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:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.pivot.qvtrelation.utilities;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.OCLExpression;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.Variable;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.qvtd.pivot.qvtbase.Domain;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory;
import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory.CreateStrategy;
import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil;
import org.eclipse.qvtd.pivot.qvtrelation.DomainPattern;
import org.eclipse.qvtd.pivot.qvtrelation.Key;
import org.eclipse.qvtd.pivot.qvtrelation.Relation;
import org.eclipse.qvtd.pivot.qvtrelation.RelationCallExp;
import org.eclipse.qvtd.pivot.qvtrelation.RelationDomain;
import org.eclipse.qvtd.pivot.qvtrelation.RelationModel;
import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation;
import org.eclipse.qvtd.pivot.qvttemplate.CollectionTemplateExp;
import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp;
import org.eclipse.qvtd.pivot.qvttemplate.PropertyTemplateItem;
import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp;
import com.google.common.collect.Iterables;
public class QVTrelationUtil extends QVTbaseUtil
{
public static class Internal extends QVTbaseUtil.Internal
{
public static List<@NonNull OCLExpression> getOwnedArgumentsList(@NonNull RelationCallExp rInvocation) {
return ClassUtil.nullFree(rInvocation.getArgument());
}
}
public static final @NonNull String DUMMY_VARIABLE_NAME = "_";
public static @Nullable Relation getContainingRelation(@Nullable EObject eObject) {
for ( ; eObject != null; eObject = eObject.eContainer()) {
if (eObject instanceof Relation) {
return (Relation) eObject;
}
}
return null;
}
public static org.eclipse.ocl.pivot.@NonNull Class getIdentifies(@NonNull Key rKey) {
return ClassUtil.nonNullState(rKey.getIdentifies());
}
public static @NonNull Iterable<@NonNull OCLExpression> getOwnedArguments(@NonNull RelationCallExp rInvocation) {
return ClassUtil.nullFree(rInvocation.getArgument());
}
public static @NonNull Iterable<@NonNull RelationDomain> getOwnedDomains(@NonNull Relation rRelation) {
return Iterables.filter(ClassUtil.nullFree(rRelation.getDomain()), RelationDomain.class);
}
public static @NonNull Iterable<@NonNull Key> getOwnedKey(@NonNull RelationalTransformation rTransformation) {
return ClassUtil.nullFree(rTransformation.getOwnedKey());
}
public static @NonNull Iterable<@NonNull OCLExpression> getOwnedMembers(@NonNull CollectionTemplateExp rCollectionTemplateExp) {
return ClassUtil.nullFree(rCollectionTemplateExp.getMember());
}
public static @NonNull Iterable<@NonNull PropertyTemplateItem> getOwnedParts(@NonNull ObjectTemplateExp eObject) {
return ClassUtil.nullFree(eObject.getPart());
}
public static @NonNull Iterable<@NonNull DomainPattern> getOwnedPatterns(@NonNull RelationDomain rRelationDomain) {
return ClassUtil.nullFree(rRelationDomain.getPattern());
}
public static @NonNull Iterable<@NonNull Relation> getOwnedRelations(@NonNull RelationalTransformation rTransformation) {
return Iterables.filter(ClassUtil.nullFree(rTransformation.getRule()), Relation.class);
}
public static @NonNull OCLExpression getOwnedValue(@NonNull PropertyTemplateItem rPropertyTemplateItem) {
return ClassUtil.nonNullState(rPropertyTemplateItem.getValue());
}
public static @NonNull Iterable<@NonNull Variable> getOwnedVariable(@NonNull Relation rRelation) {
return ClassUtil.nullFree(rRelation.getVariable());
}
public static @NonNull Property getReferredProperty(@NonNull PropertyTemplateItem rPropertyTemplateItem) {
return ClassUtil.nonNullState(rPropertyTemplateItem.getReferredProperty());
}
public static @NonNull Relation getReferredRelation(@NonNull RelationCallExp rInvocation) {
return ClassUtil.nonNullState(rInvocation.getReferredRelation());
}
/**
* Return the domain of the argumentIndex'th argument of rInvocation
*/
public static @NonNull RelationDomain getRelationCallExpArgumentDomain(@NonNull RelationCallExp rInvocation, int argumentIndex) {
Relation rRelation = rInvocation.getReferredRelation();
assert rRelation != null;
int iFirst = 0;
for (@NonNull Domain rDomain : ClassUtil.nullFree(rRelation.getDomain())) {
RelationDomain rRelationDomain = (RelationDomain)rDomain;
int iNext = iFirst + rRelationDomain.getRootVariable().size();
if (argumentIndex < iNext) {
return rRelationDomain;
}
iFirst = iNext;
}
throw new IndexOutOfBoundsException(argumentIndex + " > " + iFirst + " for " + rRelation);
}
/**
* Return the domain of a given root variable.
* Throws an IllegalStateException if there is no such domain.
*/
public static @NonNull RelationDomain getRootVariableDomain(@NonNull Variable rootVariable) {
Relation relation = ClassUtil.nonNullState(getContainingRelation(rootVariable));
for (@NonNull Domain domain : ClassUtil.nullFree(relation.getDomain())) {
RelationDomain relationDomain = (RelationDomain)domain;
for (@NonNull DomainPattern domainPattern : ClassUtil.nullFree(relationDomain.getPattern())) {
TemplateExp templateExpression = domainPattern.getTemplateExpression();
if (rootVariable == templateExpression.getBindsTo()) {
return relationDomain;
}
}
}
throw new IllegalStateException("No RelationDomain for " + rootVariable);
}
/**
* Return all the root variables of relation in RelationCallExp order.
*/
public static @NonNull List<@NonNull Variable> getRootVariables(@NonNull Relation relation) {
List<@NonNull Variable> rootVariables = new ArrayList<@NonNull Variable>();
for (@NonNull Domain domain : ClassUtil.nullFree(relation.getDomain())) {
for (@NonNull DomainPattern domainPattern : ClassUtil.nullFree(((RelationDomain)domain).getPattern())) {
TemplateExp templateExpression = domainPattern.getTemplateExpression();
Variable rootVariable = templateExpression.getBindsTo();
assert rootVariable != null;
rootVariables.add(rootVariable);
}
}
return rootVariables;
}
/**
* Return all the root variables of relationDomain (in partial RelationCallExp order).
*/
public static @NonNull List<@NonNull Variable> getRootVariables(@NonNull RelationDomain relationDomain) {
List<@NonNull Variable> rootVariables = new ArrayList<@NonNull Variable>();
for (@NonNull DomainPattern domainPattern : ClassUtil.nullFree(relationDomain.getPattern())) {
TemplateExp templateExpression = domainPattern.getTemplateExpression();
Variable rootVariable = templateExpression.getBindsTo();
assert rootVariable != null;
rootVariables.add(rootVariable);
}
return rootVariables;
}
public static @NonNull RelationalTransformation getTransformation(@NonNull Relation rRelation) {
return (RelationalTransformation) ClassUtil.nonNullState(rRelation.getTransformation());
}
public static @NonNull TemplateExp getOwnedTemplateExpression(@NonNull DomainPattern rDomainPattern) {
return ClassUtil.nonNullState(rDomainPattern.getTemplateExpression());
}
public static @NonNull Transformation loadTransformation(@NonNull QVTbaseEnvironmentFactory environmentFactory, @NonNull URI transformationURI, boolean keepDebug) throws IOException {
CreateStrategy savedStrategy = environmentFactory.setCreateStrategy(QVTrEnvironmentFactory.CREATE_STRATEGY);
try {
return loadTransformation(RelationModel.class, environmentFactory, transformationURI, keepDebug);
}
finally {
environmentFactory.setCreateStrategy(savedStrategy);
}
}
public static @NonNull Resource loadTransformations(@NonNull QVTbaseEnvironmentFactory environmentFactory, @NonNull URI transformationURI, boolean keepDebug) throws IOException {
CreateStrategy savedStrategy = environmentFactory.setCreateStrategy(QVTrEnvironmentFactory.CREATE_STRATEGY);
try {
return loadTransformations(RelationModel.class, environmentFactory, transformationURI, keepDebug);
}
finally {
environmentFactory.setCreateStrategy(savedStrategy);
}
}
}