/**
* Copyright (c) 2008 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.xpand.migration;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.gmf.internal.xpand.expression.ast.FeatureCall;
import org.eclipse.gmf.internal.xpand.expression.ast.OperationCall;
import org.eclipse.ocl.Environment;
public class ModelManager {
private StandardLibraryImports stdLibraryImports;
private OclKeywordManager oclKeywordManager;
private Set<String> selfVariableAliases = new HashSet<String>();
public ModelManager(StandardLibraryImports libraryImports) {
this(libraryImports, new OclKeywordManager());
}
public ModelManager(StandardLibraryImports libraryImports, OclKeywordManager keywordManager) {
stdLibraryImports = libraryImports;
oclKeywordManager = keywordManager;
}
public String getName(OperationCall operationCall, OperationCallTrace trace) {
if (trace.getType() == OperationCallTrace.Type.OPERATION_REF || trace.getType() == OperationCallTrace.Type.IMPLICIT_COLLECT_OPERATION_REF) {
String operationName = stdLibraryImports.getOperationName(trace.getEOperation());
if (operationName != null) {
return operationName;
}
}
if (trace.getType() == OperationCallTrace.Type.STATIC_EXTENSION_REF || trace.getType() == OperationCallTrace.Type.EXTENSION_REF
|| trace.getType() == OperationCallTrace.Type.IMPLICIT_COLLECT_EXTENSION_REF) {
if (trace.getNativeLibraryName() != null) {
stdLibraryImports.registerNativeLibrary(trace.getNativeLibraryName());
}
}
return trace.getType() == OperationCallTrace.Type.OPERATION_REF || trace.getType() == OperationCallTrace.Type.IMPLICIT_COLLECT_OPERATION_REF ? oclKeywordManager.getValidIdentifierValue(trace
.getEOperation().getName()) : oclKeywordManager.getValidIdentifierValue(operationCall.getName());
}
public String getName(FeatureCall featureCall, FeatureCallTrace trace) {
// Only env. var. references with name "this" should be substituted with
// "self"
if (trace.getType() == FeatureCallTrace.Type.ENV_VAR_REF && selfVariableAliases.contains(featureCall.getName().getValue())) {
return Environment.SELF_VARIABLE_NAME;
}
if (trace.getType() == FeatureCallTrace.Type.FEATURE_REF) {
EStructuralFeature feature = trace.getFeature();
if (EcorePackage.eINSTANCE.getETypedElement().isSuperTypeOf(feature.getEContainingClass())
&& EcorePackage.eINSTANCE.getETypedElement_UpperBound().getFeatureID() == EcorePackage.eINSTANCE.getETypedElement().getFeatureID(feature)) {
return oclKeywordManager.getValidIdentifierValue(feature.getName()) + ".oclAsType(Integer)";
}
}
return trace.getType() == FeatureCallTrace.Type.FEATURE_REF ? oclKeywordManager.getValidIdentifierValue(trace.getFeature().getName()) : oclKeywordManager.getValidIdentifierValue(featureCall
.getName());
}
public OclKeywordManager getOclKeywordManager() {
return oclKeywordManager;
}
public void registerSelfAlias(String selfVariableAlias) {
selfVariableAliases.add(selfVariableAlias);
}
public void unregisterSelfAlias(String selfVariableAlias) {
selfVariableAliases.remove(selfVariableAlias);
}
}