/*******************************************************************************
* Copyright (c) 2008 Borland Software Corporation 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.ast.parser;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtEnvironmentBase;
import org.eclipse.m2m.internal.qvt.oml.expressions.DirectionKind;
import org.eclipse.m2m.internal.qvt.oml.expressions.ExpressionsFactory;
import org.eclipse.m2m.internal.qvt.oml.expressions.ImperativeOperation;
import org.eclipse.m2m.internal.qvt.oml.expressions.MappingParameter;
import org.eclipse.m2m.internal.qvt.oml.expressions.ModelParameter;
import org.eclipse.m2m.internal.qvt.oml.expressions.ModelType;
import org.eclipse.m2m.internal.qvt.oml.expressions.Module;
import org.eclipse.m2m.internal.qvt.oml.expressions.OperationalTransformation;
import org.eclipse.m2m.internal.qvt.oml.expressions.VarParameter;
public class DeprecatedSignaturelessTransf {
public static void patchModule(Module module) {
ImperativeOperation mainOperation = QvtOperationalParserUtil.getMainOperation(module);
if(mainOperation != null && module instanceof OperationalTransformation) {
OperationalTransformation transformation = (OperationalTransformation) module;
if(!transformation.getModelParameter().isEmpty()) {
return;
}
List<EParameter> parameters = new ArrayList<EParameter>();
parameters.addAll(mainOperation.getEParameters());
parameters.addAll(mainOperation.getResult());
for (EParameter eParameter : parameters) {
ModelParameter modelParam = createModelParam(eParameter);
transformation.getModelParameter().add(modelParam);
EClassifier type = modelParam.getEType();
if(type instanceof ModelType) {
ModelType modelType = (ModelType) type;
transformation.getEClassifiers().add(modelType);
transformation.getUsedModelType().add(modelType);
}
}
}
}
private static ModelParameter createModelParam(EParameter param) {
ModelParameter modelParam = ExpressionsFactory.eINSTANCE.createModelParameter();
modelParam.setName(QvtEnvironmentBase.GENERATED_NAME_SPECIAL_PREFIX + param.getName());
modelParam.setType(createModelType(param.getEType()));
EAnnotation annotation = EcoreFactory.eINSTANCE.createEAnnotation();
annotation.setSource(QvtOperationalParserUtil.QVT_AUTOGEN_MODELPARAM_EXPRESSION_URI);
modelParam.getEAnnotations().add(annotation);
if(param instanceof VarParameter) {
VarParameter varParameter = (VarParameter) param;
modelParam.setKind(varParameter.getKind());
if(varParameter instanceof MappingParameter) {
MappingParameter mappingParameter = (MappingParameter) varParameter;
if(mappingParameter.getExtent() == null) {
mappingParameter.setExtent(modelParam);
}
}
} else {
modelParam.setKind(DirectionKind.IN);
}
return modelParam;
}
private static ModelType createModelType(EClassifier usedType) {
ModelType modelType = ExpressionsFactory.eINSTANCE.createModelType();
modelType.setName("<modeltype>"); //$NON-NLS-1$
if(usedType != null) {
EPackage ePackage = usedType.getEPackage();
if(ePackage != null) {
modelType.setName(String.valueOf(ePackage.getName()));
modelType.getMetamodel().add(ePackage);
}
}
return modelType;
}
}