| /** |
| * <copyright> |
| * |
| * Copyright (c) 2009-2010 Thales Corporate Services S.A.S. |
| * 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 |
| * https://www.eclipse.org/legal/epl-v2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Thales Corporate Services S.A.S - initial API and implementation |
| * |
| * </copyright> |
| */ |
| |
| package org.eclipse.egf.emf.pattern.codegen; |
| |
| import org.eclipse.egf.emf.pattern.codegen.model.JetSubPatternInfo; |
| import org.eclipse.egf.emf.pattern.codegen.model.MethodInfo; |
| import org.eclipse.egf.emf.pattern.codegen.model.PatternInfo; |
| import org.eclipse.egf.emf.pattern.codegen.model.VariableInfo; |
| import org.eclipse.egf.emf.pattern.codegen.model.MethodInfo.MethodInfoType; |
| import org.eclipse.egf.model.pattern.BackCall; |
| import org.eclipse.egf.model.pattern.Call; |
| import org.eclipse.egf.model.pattern.MethodCall; |
| import org.eclipse.egf.model.pattern.Pattern; |
| import org.eclipse.egf.model.pattern.PatternCall; |
| import org.eclipse.egf.model.pattern.PatternLibrary; |
| import org.eclipse.egf.model.pattern.PatternMethod; |
| import org.eclipse.egf.model.pattern.PatternParameter; |
| import org.eclipse.egf.pattern.extension.PatternFactory; |
| import org.eclipse.emf.ecore.resource.Resource; |
| |
| /** |
| * @author Matthieu Helleboid |
| * |
| */ |
| public class CodegenPatternFactory { |
| |
| protected PatternInfo patternInfo; |
| |
| protected Resource emfPatternBaseResource; |
| |
| protected CodegenEGFHelper codegenEGFHelper; |
| |
| protected PatternFactory patternFactory; |
| |
| protected CodegenPatternHelper codegenPatternHelper; |
| |
| public CodegenPatternFactory(PatternFactory patternFactory, Resource emfPatternBaseResource, CodegenEGFHelper codegenEGFHelper, PatternInfo patternInfo, CodegenPatternHelper codegenPatternHelper) { |
| this.patternFactory = patternFactory; |
| this.emfPatternBaseResource = emfPatternBaseResource; |
| this.codegenEGFHelper = codegenEGFHelper; |
| this.patternInfo = patternInfo; |
| this.codegenPatternHelper = codegenPatternHelper; |
| } |
| |
| public Pattern createPattern() { |
| PatternLibrary library = codegenEGFHelper.getPatternLibrary(patternInfo.getPartType(), patternInfo.getLibraryName()); |
| Pattern pattern = patternFactory.createPattern(library, patternInfo.getName()); |
| pattern.setDescription(patternInfo.getDescription()); |
| codegenEGFHelper.fixXmiId(pattern, patternInfo.getPartType()); |
| |
| removeBodyMethod(pattern); |
| |
| if (patternInfo instanceof JetSubPatternInfo) { |
| JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo; |
| for (VariableInfo variableInfo : jetSubPatternInfo.getVariableInfos()) { |
| PatternParameter parameter = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createPatternParameter(); |
| parameter.setName(variableInfo.getName()); |
| parameter.setType(variableInfo.getType()); |
| pattern.getParameters().add(parameter); |
| } |
| } else { |
| String superPatternName = codegenPatternHelper.getSuperPatternName(patternInfo); |
| Pattern superPattern = codegenPatternHelper.findPattern(emfPatternBaseResource, superPatternName); |
| pattern.setSuperPattern(superPattern); |
| } |
| |
| for (MethodInfo methodInfo : patternInfo.getMethods()) { |
| if (methodInfo == null) |
| continue; |
| |
| String methodName = methodInfo.getName(); |
| |
| switch (methodInfo.getMethodInfoType()) { |
| case BackCall: |
| BackCall backCall = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createBackCall(); |
| pattern.getOrchestration().add(backCall); |
| break; |
| |
| case SuperMethodCall: |
| PatternMethod superMethod = pattern.getMethod(methodName); |
| if (superMethod == null) |
| throw new IllegalStateException("Could not found superMethod " + methodName); //$NON-NLS-1$ |
| |
| MethodCall superMethodCall = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createMethodCall(); |
| superMethodCall.setCalled(superMethod); |
| pattern.getOrchestration().add(superMethodCall); |
| break; |
| |
| case Method: |
| case MethodCall: |
| PatternMethod method = null; |
| |
| for (PatternMethod patternMethod : pattern.getMethods()) { |
| if (patternMethod.getName().equals(methodName)) |
| method = patternMethod; |
| } |
| |
| if (method == null) { |
| method = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createPatternMethod(); |
| pattern.getMethods().add(method); |
| method.setName(methodName); |
| } |
| |
| if (MethodInfoType.MethodCall == methodInfo.getMethodInfoType() && !isMethodCalledInOrchestration(pattern, method)) { |
| MethodCall methodCall = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createMethodCall(); |
| methodCall.setCalled(method); |
| pattern.getOrchestration().add(methodCall); |
| } |
| break; |
| |
| case PatternCall: |
| PatternCall patternCall = org.eclipse.egf.model.pattern.PatternFactory.eINSTANCE.createPatternCall(); |
| Pattern calledPattern = codegenPatternHelper.findPattern(emfPatternBaseResource, methodName); |
| patternCall.setCalled(calledPattern); |
| |
| PatternParameter parameter = pattern.getParameter("parameter"); //$NON-NLS-1$ |
| PatternParameter argument = calledPattern.getParameter("argument"); //$NON-NLS-1$ |
| |
| patternCall.getParameterMatching().put(argument, parameter); |
| pattern.getOrchestration().add(patternCall); |
| break; |
| |
| default: |
| throw new IllegalStateException("Unknown methodInfoType"); //$NON-NLS-1$ |
| } |
| } |
| |
| for (PatternMethod patternMethod : pattern.getMethods()) { |
| codegenEGFHelper.fixXmiId(patternMethod, patternInfo.getPartType()); |
| patternMethod.setPatternFilePath(patternFactory.createURI(patternMethod)); |
| } |
| |
| return pattern; |
| } |
| |
| protected void removeBodyMethod(Pattern pattern) { |
| PatternMethod bodyMethod = null; |
| for (PatternMethod patternMethod : pattern.getMethods()) { |
| if (PatternFactory.BODY_METHOD_NAME.equals(patternMethod.getName())) |
| bodyMethod = patternMethod; |
| } |
| if (bodyMethod != null) |
| pattern.getMethods().remove(bodyMethod); |
| } |
| |
| protected boolean isMethodCalledInOrchestration(Pattern pattern, PatternMethod method) { |
| while (pattern != null) { |
| for (Call call : pattern.getOrchestration()) { |
| if (call instanceof MethodCall) { |
| MethodCall methodCall = (MethodCall) call; |
| if (methodCall.getCalled().getName().equals(method.getName())) |
| return true; |
| } |
| } |
| pattern = pattern.getSuperPattern(); |
| } |
| return false; |
| |
| } |
| } |