blob: dab1fccbc6ed001de1071a3d28236dee24019a1e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.atl.atl2qvtr.utilities;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.m2m.atl.common.ATL.Module;
import org.eclipse.m2m.atl.common.OCL.BooleanType;
import org.eclipse.m2m.atl.common.OCL.IntegerType;
import org.eclipse.m2m.atl.common.OCL.OclModel;
import org.eclipse.m2m.atl.common.OCL.OclModelElement;
import org.eclipse.m2m.atl.common.OCL.OclType;
import org.eclipse.m2m.atl.common.OCL.RealType;
import org.eclipse.m2m.atl.common.OCL.StringType;
import org.eclipse.ocl.pivot.StandardLibrary;
import org.eclipse.ocl.pivot.evaluation.Executor;
public class HelperUtils
{
public static org.eclipse.ocl.pivot.@Nullable Package getPackage(@NonNull Executor executor, @NonNull Module atlModule, @NonNull String packageName) {
for (String comment : atlModule.getCommentsBefore()) {
String trimmedComment = comment.trim();
if (trimmedComment.startsWith("--")) {
trimmedComment = trimmedComment.substring(2).trim();
if (trimmedComment.startsWith("@nsURI")) {
trimmedComment = trimmedComment.substring(6).trim();
int index = trimmedComment.indexOf("=");
if (index >= 0) {
String key = trimmedComment.substring(0, index).trim();
if (key.equals(packageName)) {
String value = trimmedComment.substring(index+1).trim();
}
}
}
else if (trimmedComment.startsWith("@path")) {
trimmedComment = trimmedComment.substring(5).trim();
int index = trimmedComment.indexOf("=");
if (index >= 0) {
String key = trimmedComment.substring(0, index).trim();
if (key.equals(packageName)) {
String value = trimmedComment.substring(index+1).trim();
URI uri = URI.createPlatformResourceURI(value, true);
if (!uri.hasFragment()) {
uri = uri.appendFragment("/");
}
EObject eObject = executor.getEnvironmentFactory().getResourceSet().getEObject(uri, true);
return executor.getEnvironmentFactory().getMetamodelManager().getASOfEcore(org.eclipse.ocl.pivot.Package.class, eObject);
}
}
}
}
}
return null;
}
public static org.eclipse.ocl.pivot.@Nullable Class getClass(@NonNull Executor executor, @NonNull Module atlModule,
@NonNull String packageName, @NonNull String className) {
org.eclipse.ocl.pivot.@Nullable Package asPackage = getPackage(executor, atlModule, packageName);
if (asPackage != null) {
org.eclipse.ocl.pivot.Class asClass = asPackage.getOwnedClass(className);
if (asClass != null) {
return asClass;
}
}
return null;
}
public static org.eclipse.ocl.pivot.@NonNull Class getType(@NonNull Executor executor, @NonNull OclType atlType) {
StandardLibrary standardLibrary = executor.getStandardLibrary();
if (atlType instanceof BooleanType) {
return standardLibrary.getBooleanType();
}
else if (atlType instanceof IntegerType) {
return standardLibrary.getIntegerType();
}
else if (atlType instanceof RealType) {
return standardLibrary.getRealType();
}
else if (atlType instanceof StringType) {
return standardLibrary.getStringType();
}
else if (atlType instanceof OclModelElement) {
OclModelElement oclModelElement = (OclModelElement)atlType;
OclModel metamodel = oclModelElement.getModel();
// OclModel metamodel = model.getMetamodel();
Module atlModule = (Module) EcoreUtil.getRootContainer(oclModelElement);
assert atlModule != null;
String packageName = metamodel.getName();
assert packageName != null;
String className = oclModelElement.getName();
assert className != null;
org.eclipse.ocl.pivot.Class asClass = HelperUtils.getClass(executor, atlModule, packageName, className);
if (asClass != null) {
return asClass;
}
return standardLibrary.getOclInvalidType();
}
else {
return standardLibrary.getOclInvalidType();
}
}
}