فهرست منبع

Initial Implementation of Generic Xpand Generator

holger.willebrandt@gmail.com 14 سال پیش
والد
کامیت
56b8a5f4fd
22فایلهای تغییر یافته به همراه628 افزوده شده و 75 حذف شده
  1. 4 1
      plugins/org.yakindu.sct.generator.core/META-INF/MANIFEST.MF
  2. 0 0
      plugins/org.yakindu.sct.generator.core/library/CoreFeatureTypeLibrary.xmi
  3. 7 0
      plugins/org.yakindu.sct.generator.core/library/XpandFeatureTypeLibrary.xmi
  4. 15 1
      plugins/org.yakindu.sct.generator.core/plugin.xml
  5. 22 2
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/AbstractDefaultFeatureValueProvider.java
  6. 14 0
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/IXpandFeatureConstants.java
  7. 26 2
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/impl/CoreLibraryDefaultFeatureValueProvider.java
  8. 62 0
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/impl/XpandLibraryDefaultFeatureValueProvider.java
  9. 57 0
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractSExecModelGenerator.java
  10. 32 13
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractXpandBasedCodeGenerator.java
  11. 71 0
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/GenericXPandCodeGenerator.java
  12. 121 0
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/WorkspaceClassLoaderFactory.java
  13. 3 1
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/validation/SGenJavaValidator.java
  14. 53 51
      plugins/org.yakindu.sct.model.sgen/model/emf/sgen.ecore
  15. 1 0
      plugins/org.yakindu.sct.model.sgen/model/emf/sgen.genmodel
  16. 3 1
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/FeatureConfiguration.java
  17. 18 0
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/FeatureParameterValue.java
  18. 29 1
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/SGenPackage.java
  19. 17 1
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/FeatureConfigurationImpl.java
  20. 61 0
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/FeatureParameterValueImpl.java
  21. 9 0
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/SGenPackageImpl.java
  22. 3 1
      plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/sgen.ecore

+ 4 - 1
plugins/org.yakindu.sct.generator.core/META-INF/MANIFEST.MF

@@ -13,7 +13,10 @@ Require-Bundle: org.eclipse.ui,
  org.eclipse.core.resources;bundle-version="3.7.100";visibility:=reexport,
  org.eclipse.xtend;bundle-version="1.1.0",
  org.eclipse.xtend.typesystem.emf;bundle-version="1.0.1",
- org.yakindu.sct.model.stext;bundle-version="1.0.0"
+ org.yakindu.sct.model.stext;bundle-version="1.0.0",
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.launching,
+ org.eclipse.ui.console
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.yakindu.sct.generator.core,

plugins/org.yakindu.sct.generator.core/library/FeatureTypeLibrary.xmi → plugins/org.yakindu.sct.generator.core/library/CoreFeatureTypeLibrary.xmi


+ 7 - 0
plugins/org.yakindu.sct.generator.core/library/XpandFeatureTypeLibrary.xmi

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="ASCII"?>
+<sgen:FeatureTypeLibrary xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sgen="http://www.yakindu.org/sct/statechart/SGen" xsi:schemaLocation="http://www.yakindu.org/sct/statechart/SGen ../../org.yakindu.sct.model.sgen/model/emf/sgen.ecore" name="Xpand">
+  <types name="Template">
+    <parameters name="templateProject"/>
+    <parameters name="templatePath"/>
+  </types>
+</sgen:FeatureTypeLibrary>

+ 15 - 1
plugins/org.yakindu.sct.generator.core/plugin.xml

@@ -8,7 +8,21 @@
       <FeatureLibrary
             defaultProvider="org.yakindu.sct.generator.core.features.impl.CoreLibraryDefaultFeatureValueProvider"
             generatorId="ALL"
-            uri="platform:/plugin/org.yakindu.sct.generator.core/library/FeatureTypeLibrary.xmi">
+            uri="platform:/plugin/org.yakindu.sct.generator.core/library/CoreFeatureTypeLibrary.xmi">
+      </FeatureLibrary>
+      <FeatureLibrary
+            defaultProvider="org.yakindu.sct.generator.core.features.impl.XpandLibraryDefaultFeatureValueProvider"
+            generatorId="yakindu::xpand"
+            uri="platform:/plugin/org.yakindu.sct.generator.core/library/XpandFeatureTypeLibrary.xmi">
       </FeatureLibrary>
    </extension>
+ <extension
+       point="org.yakindu.sct.generator.core.generator">
+    <SCTGenerator
+          class="org.yakindu.sct.generator.core.impl.GenericXPandCodeGenerator"
+          description="Generate Code using Xpand Templates"
+          id="yakindu::xpand"
+          name="YAKINDU Generic Xpand Generator">
+    </SCTGenerator>
+ </extension>
 </plugin>

+ 22 - 2
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/AbstractDefaultFeatureValueProvider.java

@@ -34,7 +34,9 @@ public abstract class AbstractDefaultFeatureValueProvider implements
 		for (FeatureParameter parameter : parameters) {
 			FeatureParameterValue parameterValue = createParameterValue(
 					parameter, statechart);
-			config.getParameterValues().add(parameterValue);
+			if (parameterValue != null) {
+				config.getParameterValues().add(parameterValue);
+			}
 		}
 		return config;
 	}
@@ -45,7 +47,10 @@ public abstract class AbstractDefaultFeatureValueProvider implements
 				.createFeatureParameterValue();
 		parameterValue.setParameter(parameter);
 		setDefaultValue(parameterValue, statechart);
-		return parameterValue;
+		if (parameterValue.getValue() != null) {
+			return parameterValue;
+		}
+		return null;
 	}
 
 	protected FeatureConfiguration createConfiguration(FeatureType type) {
@@ -70,7 +75,22 @@ public abstract class AbstractDefaultFeatureValueProvider implements
 	protected IStatus error(String msg) {
 		return new Status(IStatus.ERROR, GeneratorActivator.PLUGIN_ID, msg);
 	}
+
 	protected IStatus warning(String msg) {
 		return new Status(IStatus.WARNING, GeneratorActivator.PLUGIN_ID, msg);
 	}
+
+	protected boolean projectExists(String value) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(value)
+				.exists();
+	}
+
+	protected boolean folderExists(String projectName, String folderPath) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)
+				.getFolder(new Path(folderPath)).exists();
+	}
+	protected boolean fileExists(String projectName, String folderPath) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)
+				.getFile(new Path(folderPath)).exists();
+	}
 }

+ 14 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/IXpandFeatureConstants.java

@@ -0,0 +1,14 @@
+package org.yakindu.sct.generator.core.features;
+
+/**
+ * 
+ * @author holger willebrandt - Initial contribution and API
+ */
+public interface IXpandFeatureConstants extends ICoreFeatureConstants {
+
+	public static final String LIBRARY_NAME = "Xpand";
+	public static final String TEMPLATE_FEATURE = "Template";
+	public static final String TEMPLATE_FEATURE_TEMPLATE_PATH = "templatePath";
+	public static final String TEMPLATE_FEATURE_TEMPLATE_PROJECT = "templateProject";
+
+}

+ 26 - 2
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/impl/CoreLibraryDefaultFeatureValueProvider.java

@@ -10,10 +10,10 @@
  */
 package org.yakindu.sct.generator.core.features.impl;
 
+import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.DEBUG_FEATURE_DUMP_SEXEC;
 import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.LIBRARY_NAME;
 import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.OUTLET_FEATURE_TARGET_FOLDER;
 import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.OUTLET_FEATURE_TARGET_PROJECT;
-import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.DEBUG_FEATURE_DUMP_SEXEC;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -46,7 +46,31 @@ public class CoreLibraryDefaultFeatureValueProvider extends
 		}
 	}
 
-	public IStatus validateParameterValue(FeatureParameterValue value) {
+	public IStatus validateParameterValue(FeatureParameterValue parameterValue) {
+		String parameterName = parameterValue.getParameter().getName();
+		if (OUTLET_FEATURE_TARGET_PROJECT.equals(parameterName)
+				&& !projectExists(parameterValue.getValue()))
+			return warning(String.format("The Project %s does not exist",
+					parameterValue.getValue()));
+		if (OUTLET_FEATURE_TARGET_FOLDER.equals(parameterName)) {
+			FeatureParameterValue targetProjectParam = parameterValue
+					.getFeatureConfiguration().getParameterValue(
+							OUTLET_FEATURE_TARGET_PROJECT);
+			String targetProjectName = targetProjectParam != null ? targetProjectParam
+					.getValue() : null;
+			if (targetProjectName != null
+					&& !folderExists(targetProjectName,
+							parameterValue.getValue())) {
+				return warning(String.format(
+						"The Folder %s does not exist in Project %s",
+						parameterValue.getValue(), targetProjectName));
+			}
+		}
+		if (DEBUG_FEATURE_DUMP_SEXEC.equals(parameterName)
+				&& !(parameterValue.getValue().equalsIgnoreCase("true") || parameterValue
+						.getValue().equalsIgnoreCase("false"))) {
+			return error("Illegal Value. Must be 'true' or 'false'");
+		}
 		return Status.OK_STATUS;
 	}
 }

+ 62 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/features/impl/XpandLibraryDefaultFeatureValueProvider.java

@@ -0,0 +1,62 @@
+package org.yakindu.sct.generator.core.features.impl;
+
+/**
+ * Copyright (c) 2011 committers of YAKINDU 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+import static org.yakindu.sct.generator.core.features.IXpandFeatureConstants.LIBRARY_NAME;
+import static org.yakindu.sct.generator.core.features.IXpandFeatureConstants.TEMPLATE_FEATURE_TEMPLATE_PATH;
+import static org.yakindu.sct.generator.core.features.IXpandFeatureConstants.TEMPLATE_FEATURE_TEMPLATE_PROJECT;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.yakindu.sct.generator.core.features.AbstractDefaultFeatureValueProvider;
+import org.yakindu.sct.model.sgen.FeatureParameterValue;
+import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
+import org.yakindu.sct.model.sgraph.Statechart;
+
+/**
+ * 
+ * 
+ * @author holger willebrandt - Initial contribution and API
+ */
+public class XpandLibraryDefaultFeatureValueProvider extends
+		AbstractDefaultFeatureValueProvider {
+
+	private static final String XPAND_TEMPLATE_PATH_REGEX = "([a-zA-Z$_][a-zA-Z0-9$_.]*::)+[a-zA-Z$_][a-zA-Z0-9$_.]*";
+
+	public boolean isProviderFor(final FeatureTypeLibrary library) {
+		return LIBRARY_NAME.equals(library.getName());
+	}
+
+	@Override
+	protected void setDefaultValue(final FeatureParameterValue parameterValue,
+			final Statechart statechart) {
+		String parameterName = parameterValue.getParameter().getName();
+		if (TEMPLATE_FEATURE_TEMPLATE_PATH.equals(parameterName)) {
+			parameterValue
+					.setValue("org::yakindu::sct::example::templates::Main::main");
+		}
+	}
+
+	public IStatus validateParameterValue(FeatureParameterValue parameterValue) {
+		String parameterName = parameterValue.getParameter().getName();
+		String value = parameterValue.getValue();
+		if (TEMPLATE_FEATURE_TEMPLATE_PATH.equals(parameterName)
+				&& !parameterValue.getValue()
+						.matches(XPAND_TEMPLATE_PATH_REGEX))
+			return error("Xpand Template Path Syntax Error");
+		if (TEMPLATE_FEATURE_TEMPLATE_PROJECT.equals(parameterName)
+				&& !projectExists(value)) {
+			return error(String.format("The Project %s does not exist", value));
+		}
+		return Status.OK_STATUS;
+	}
+	
+}

+ 57 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractSExecModelGenerator.java

@@ -10,7 +10,22 @@
  */
 package org.yakindu.sct.generator.core.impl;
 
+import java.io.PrintWriter;
+
 import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleManager;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+import org.yakindu.sct.generator.core.GeneratorActivator;
 import org.yakindu.sct.generator.core.ISCTGenerator;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
@@ -30,6 +45,8 @@ import com.google.inject.Injector;
  */
 public abstract class AbstractSExecModelGenerator implements ISCTGenerator {
 
+	private static final String SCT_GENERATOR_CONSOLE = "SCT Generator Console";
+
 	protected abstract void generate(ExecutionFlow flow, GeneratorEntry entry);
 
 	public final void generate(GeneratorEntry entry) {
@@ -47,4 +64,44 @@ public abstract class AbstractSExecModelGenerator implements ISCTGenerator {
 		return flow;
 	}
 
+	protected void showErrorDialog(Throwable t) {
+		Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+				.getShell();
+		ErrorDialog.openError(shell, "Generator Error",
+				"Error executing generator", new Status(IStatus.ERROR,
+						GeneratorActivator.PLUGIN_ID, t.getMessage()));
+	}
+
+	private MessageConsole findConsole(String name) {
+		ConsolePlugin plugin = ConsolePlugin.getDefault();
+		IConsoleManager conMan = plugin.getConsoleManager();
+		IConsole[] existing = conMan.getConsoles();
+		for (int i = 0; i < existing.length; i++)
+			if (name.equals(existing[i].getName()))
+				return (MessageConsole) existing[i];
+		// no console found, so create a new one
+		MessageConsole myConsole = new MessageConsole(name, null);
+		conMan.addConsoles(new IConsole[] { myConsole });
+		return myConsole;
+	}
+
+	private MessageConsoleStream createConsoleStream() {
+		MessageConsole console = findConsole(SCT_GENERATOR_CONSOLE);
+		MessageConsoleStream out = console.newMessageStream();
+		return out;
+	}
+
+	protected void writeToConsole(Throwable t) {
+		MessageConsoleStream createConsoleStream = createConsoleStream();
+		createConsoleStream.setColor(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+		PrintWriter printWriter = new PrintWriter(createConsoleStream);
+		t.printStackTrace(printWriter);
+		printWriter.flush();
+		printWriter.close();
+	}
+
+	protected void writeToConsole(String line) {
+		createConsoleStream().println(line);
+	};
+
 }

+ 32 - 13
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractXpandBasedCodeGenerator.java

@@ -62,24 +62,44 @@ public abstract class AbstractXpandBasedCodeGenerator extends
 	 */
 	@Override
 	protected final void generate(ExecutionFlow flow, GeneratorEntry entry) {
-		Output output = createOutput(entry);
-		
-		if (isDumpSexec(entry))
-			dumpSexec(entry, flow, output);
-
-		XpandExecutionContext context = createXpandContext(output);
-		XpandFacade facade = XpandFacade.create(context);
-		facade.evaluate(getTemplatePath(), flow, entry);
-		// refresh the project to get external updates:
-		IProject project = getTargetProject(entry);
+		writeToConsole("Generating "+entry.getStatechart().getName()+"...");
 		try {
+			prepareGenerator(entry);
+			Output output = createOutput(entry);
+
+			if (isDumpSexec(entry))
+				dumpSexec(entry, flow, output);
+
+			XpandExecutionContext context = createXpandContext(output);
+			XpandFacade facade = XpandFacade.create(context);
+			facade.evaluate(getTemplatePath(), flow, entry);
+
+			// refresh the project to get external updates:
+			IProject project = getTargetProject(entry);
 			project.refreshLocal(IResource.DEPTH_INFINITE,
 					new NullProgressMonitor());
-		} catch (CoreException e) {
-			e.printStackTrace();
+			writeToConsole("Done.");
+		} catch (Exception e) {
+			writeToConsole(e);
+		} finally {
+			finishGenerator(entry);
 		}
 	}
 
+	/**
+	 * override this method to do any setup needed before generation
+	 */
+	protected void prepareGenerator(GeneratorEntry entry) {
+		// override if needed
+	}
+
+	/**
+	 * override this method to do any cleanup needed after generation
+	 */
+	protected void finishGenerator(GeneratorEntry entry) {
+		// override if needed
+	}
+
 	private IProject getTargetProject(GeneratorEntry entry) {
 		FeatureConfiguration outletConfig = getOutletFeatureConfiguration(entry);
 		String projectName = outletConfig.getParameterValue(
@@ -180,7 +200,6 @@ public abstract class AbstractXpandBasedCodeGenerator extends
 		// URI fileURI = URI.createFileURI(new
 		// File("mylibrary.xmi").getAbsolutePath());
 
-		System.out.println(fileURI.toString());
 		Resource resource = resourceSet.createResource(fileURI);
 		resource.getContents().add(flow);
 

+ 71 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/GenericXPandCodeGenerator.java

@@ -0,0 +1,71 @@
+package org.yakindu.sct.generator.core.impl;
+
+import static org.yakindu.sct.generator.core.features.IXpandFeatureConstants.TEMPLATE_FEATURE;
+import static org.yakindu.sct.generator.core.features.IXpandFeatureConstants.TEMPLATE_FEATURE_TEMPLATE_PATH;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.mwe.core.resources.ResourceLoader;
+import org.eclipse.emf.mwe.core.resources.ResourceLoaderFactory;
+import org.eclipse.emf.mwe.core.resources.ResourceLoaderImpl;
+import org.yakindu.sct.generator.core.features.IXpandFeatureConstants;
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.FeatureParameterValue;
+import org.yakindu.sct.model.sgen.GeneratorEntry;
+
+public class GenericXPandCodeGenerator extends AbstractXpandBasedCodeGenerator {
+
+	private String templatePath;
+
+	@Override
+	protected void prepareGenerator(GeneratorEntry entry) {
+		templatePath = entry.getFeatureConfiguration(TEMPLATE_FEATURE)
+				.getParameterValue(TEMPLATE_FEATURE_TEMPLATE_PATH).getValue();
+		ResourceLoaderFactory
+				.setCurrentThreadResourceLoader(createResourceLoader(entry));
+	}
+
+	@Override
+	protected void finishGenerator(GeneratorEntry entry) {
+		ResourceLoaderFactory.setCurrentThreadResourceLoader(null);
+	}
+
+	/**
+	 * create a {@link ResourceLoader} for the XPandFacade
+	 */
+	protected ResourceLoader createResourceLoader(final GeneratorEntry entry) {
+		IProject project = getLookupRoot(entry);
+		final ClassLoader classLoader = new WorkspaceClassLoaderFactory()
+				.createClassLoader(project);
+		return new ResourceLoaderImpl(classLoader);
+	}
+
+	/**
+	 * resolve the project that defines the lookup path for the XpandFacade
+	 * 
+	 */
+	protected IProject getLookupRoot(GeneratorEntry entry) {
+		IProject project = null;
+		FeatureConfiguration templateConfig = entry
+				.getFeatureConfiguration(IXpandFeatureConstants.TEMPLATE_FEATURE);
+		FeatureParameterValue projectName = templateConfig
+				.getParameterValue(IXpandFeatureConstants.TEMPLATE_FEATURE_TEMPLATE_PROJECT);
+		if (projectName != null) {
+			project = ResourcesPlugin.getWorkspace().getRoot()
+					.getProject(projectName.getValue());
+		} else {
+			URI uri = entry.getStatechart().eResource().getURI();
+			project = ResourcesPlugin.getWorkspace().getRoot()
+					.getFile(new Path(uri.toPlatformString(true))).getProject();
+		}
+		return project;
+	}
+
+	@Override
+	public String getTemplatePath() {
+		return templatePath;
+	}
+
+}

+ 121 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/WorkspaceClassLoaderFactory.java

@@ -0,0 +1,121 @@
+package org.yakindu.sct.generator.core.impl;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.JavaRuntime;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Factory for {@link ClassLoader}s based on {@link IProject}s inside the
+ * workspace
+ * 
+ * @author koenemann - Initial contribution and API
+ * @author holger willebrandt
+ */
+public class WorkspaceClassLoaderFactory {
+
+	/**
+	 * Creates a {@link ClassLoader} that can be used to load resources from the
+	 * workspace.
+	 */
+	public ClassLoader createClassLoader(IProject project) {
+		final List<URL> urls = Lists.newArrayList();
+
+		addClasspathEntries(project, urls);
+
+		return URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]),
+				WorkspaceClassLoaderFactory.class.getClassLoader());
+	}
+
+	protected void addClasspathEntries(IProject project, List<URL> urls) {
+		IJavaProject javaProject = toJavaProject(project);
+		if (javaProject != null) {
+			addJavaClasspathEntries(javaProject, urls);
+		} else {
+			try {
+				urls.add(getFileSystemFile(project).toURI().toURL());
+			} catch (MalformedURLException e1) {
+				// TODO Auto-generated catch block
+				e1.printStackTrace();
+			}
+			addReferencedProjectsClasspaths(project, urls);
+		}
+	}
+
+	protected void addReferencedProjectsClasspaths(IProject project,
+			List<URL> urls) {
+		try {
+			IProject[] referencedProjects = project.getReferencedProjects();
+			for (IProject iProject : referencedProjects) {
+				addClasspathEntries(iProject, urls);
+			}
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	protected File getFileSystemFile(IResource resource) {
+		return new File(resource.getWorkspace().getRoot().getRawLocation()
+				.toFile().getAbsolutePath()
+				+ File.separator
+				+ resource.getFullPath().toFile().getAbsolutePath());
+	}
+
+	protected IJavaProject toJavaProject(IProject project) {
+		IJavaProject javaProject = null;
+		try {
+			javaProject = JavaCore.create(project);
+//			javaProject.e
+			// access children to decide whether we have a java project or not
+			javaProject.getChildren();
+		} catch (JavaModelException jme) {
+			return null;
+		}
+		return javaProject;
+	}
+
+	protected void addJavaClasspathEntries(IJavaProject project, List<URL> urls) {
+		try {
+			urls.addAll(Lists.newArrayList(convertClassPath(JavaRuntime
+					.computeDefaultRuntimeClassPath(project))));
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Converting string classpath to {@link URL}s.
+	 */
+	private static URL[] convertClassPath(String[] classPath) {
+		final URL[] urls = new URL[classPath.length];
+		for (int i = 0; i < classPath.length; i++) {
+			final String entry = classPath[i];
+			final IPath path = new Path(entry);
+			try {
+				final URL url = path.toFile().toURI().toURL();
+				urls[i] = url;
+			} catch (MalformedURLException e) {
+				throw new RuntimeException(
+						"Could not convert classpath entry to URL: "
+								+ path.toString(), e);
+			}
+		}
+		return urls;
+	}
+
+}

+ 3 - 1
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/validation/SGenJavaValidator.java

@@ -23,6 +23,8 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 
 	@Check
 	public void checkParameterValue(final FeatureParameterValue value) {
+		if (value.getValue() == null)
+			return;
 		GeneratorModel model = (GeneratorModel) EcoreUtil2
 				.getRootContainer(value);
 		IDefaultFeatureValueProvider provider = LibraryExtensions
@@ -33,7 +35,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 	}
 
 	private void createMarker(IStatus status) {
-		switch (status.getCode()) {
+		switch (status.getSeverity()) {
 		case IStatus.ERROR:
 			super.error(status.getMessage(),
 					SGenPackage.Literals.FEATURE_PARAMETER_VALUE__VALUE);

+ 53 - 51
plugins/org.yakindu.sct.model.sgen/model/emf/sgen.ecore

@@ -1,51 +1,53 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="sgen"
-    nsURI="http://www.yakindu.org/sct/statechart/SGen" nsPrefix="sgen">
-  <eClassifiers xsi:type="ecore:EClass" name="GeneratorModel">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
-        eType="#//GeneratorEntry" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="generatorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GeneratorConfiguration">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="configurations" upperBound="-1"
-        eType="#//FeatureConfiguration" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FeatureType" eSuperTypes="../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//NamedElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
-        eType="#//FeatureParameter" containment="true" eOpposite="#//FeatureParameter/featureType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="library" lowerBound="1"
-        eType="#//FeatureTypeLibrary" changeable="false" volatile="true" transient="true"
-        derived="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FeatureParameter" eSuperTypes="../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//NamedElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="featureType" eType="#//FeatureType"
-        eOpposite="#//FeatureType/parameters"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FeatureConfiguration">
-    <eOperations name="getParameterValue" eType="#//FeatureParameterValue">
-      <eParameters name="parameterName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//FeatureType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameterValues" upperBound="-1"
-        eType="#//FeatureParameterValue" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GeneratorEntry">
-    <eOperations name="getFeatureConfiguration" eType="#//FeatureConfiguration">
-      <eParameters name="featureName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="statechart" eType="ecore:EClass ../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//Statechart"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="features" upperBound="-1"
-        eType="#//FeatureConfiguration" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FeatureParameterValue">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" eType="#//FeatureParameter"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FeatureTypeLibrary">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="types" upperBound="-1"
-        eType="#//FeatureType" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="sgen"
+    nsURI="http://www.yakindu.org/sct/statechart/SGen" nsPrefix="sgen">
+  <eClassifiers xsi:type="ecore:EClass" name="GeneratorModel">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
+        eType="#//GeneratorEntry" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="generatorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="GeneratorConfiguration">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="configurations" upperBound="-1"
+        eType="#//FeatureConfiguration" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureType" eSuperTypes="../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//NamedElement">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
+        eType="#//FeatureParameter" containment="true" eOpposite="#//FeatureParameter/featureType"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="library" lowerBound="1"
+        eType="#//FeatureTypeLibrary" changeable="false" volatile="true" transient="true"
+        derived="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureParameter" eSuperTypes="../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//NamedElement">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="featureType" eType="#//FeatureType"
+        eOpposite="#//FeatureType/parameters"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureConfiguration">
+    <eOperations name="getParameterValue" eType="#//FeatureParameterValue">
+      <eParameters name="parameterName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//FeatureType"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parameterValues" upperBound="-1"
+        eType="#//FeatureParameterValue" containment="true" eOpposite="#//FeatureParameterValue/featureConfiguration"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="GeneratorEntry">
+    <eOperations name="getFeatureConfiguration" eType="#//FeatureConfiguration">
+      <eParameters name="featureName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="statechart" eType="ecore:EClass ../../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//Statechart"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="features" upperBound="-1"
+        eType="#//FeatureConfiguration" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureParameterValue">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" eType="#//FeatureParameter"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="featureConfiguration" eType="#//FeatureConfiguration"
+        changeable="false" eOpposite="#//FeatureConfiguration/parameterValues"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureTypeLibrary">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="types" upperBound="-1"
+        eType="#//FeatureType" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+</ecore:EPackage>

+ 1 - 0
plugins/org.yakindu.sct.model.sgen/model/emf/sgen.genmodel

@@ -38,6 +38,7 @@
     <genClasses ecoreClass="sgen.ecore#//FeatureParameterValue">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference sgen.ecore#//FeatureParameterValue/parameter"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sgen.ecore#//FeatureParameterValue/value"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference sgen.ecore#//FeatureParameterValue/featureConfiguration"/>
     </genClasses>
     <genClasses ecoreClass="sgen.ecore#//FeatureTypeLibrary">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sgen.ecore#//FeatureTypeLibrary/types"/>

+ 3 - 1
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/FeatureConfiguration.java

@@ -57,6 +57,7 @@ public interface FeatureConfiguration extends EObject {
 	/**
 	 * Returns the value of the '<em><b>Parameter Values</b></em>' containment reference list.
 	 * The list contents are of type {@link org.yakindu.sct.model.sgen.FeatureParameterValue}.
+	 * It is bidirectional and its opposite is '{@link org.yakindu.sct.model.sgen.FeatureParameterValue#getFeatureConfiguration <em>Feature Configuration</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Parameter Values</em>' containment reference list isn't clear,
@@ -65,7 +66,8 @@ public interface FeatureConfiguration extends EObject {
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Parameter Values</em>' containment reference list.
 	 * @see org.yakindu.sct.model.sgen.SGenPackage#getFeatureConfiguration_ParameterValues()
-	 * @model containment="true"
+	 * @see org.yakindu.sct.model.sgen.FeatureParameterValue#getFeatureConfiguration
+	 * @model opposite="featureConfiguration" containment="true"
 	 * @generated
 	 */
 	EList<FeatureParameterValue> getParameterValues();

+ 18 - 0
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/FeatureParameterValue.java

@@ -18,6 +18,7 @@ import org.eclipse.emf.ecore.EObject;
  * <ul>
  *   <li>{@link org.yakindu.sct.model.sgen.FeatureParameterValue#getParameter <em>Parameter</em>}</li>
  *   <li>{@link org.yakindu.sct.model.sgen.FeatureParameterValue#getValue <em>Value</em>}</li>
+ *   <li>{@link org.yakindu.sct.model.sgen.FeatureParameterValue#getFeatureConfiguration <em>Feature Configuration</em>}</li>
  * </ul>
  * </p>
  *
@@ -78,4 +79,21 @@ public interface FeatureParameterValue extends EObject {
 	 */
 	void setValue(String value);
 
+	/**
+	 * Returns the value of the '<em><b>Feature Configuration</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.yakindu.sct.model.sgen.FeatureConfiguration#getParameterValues <em>Parameter Values</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Feature Configuration</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Feature Configuration</em>' container reference.
+	 * @see org.yakindu.sct.model.sgen.SGenPackage#getFeatureParameterValue_FeatureConfiguration()
+	 * @see org.yakindu.sct.model.sgen.FeatureConfiguration#getParameterValues
+	 * @model opposite="parameterValues" transient="false" changeable="false"
+	 * @generated
+	 */
+	FeatureConfiguration getFeatureConfiguration();
+
 } // FeatureParameterValue

+ 29 - 1
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/SGenPackage.java

@@ -311,6 +311,15 @@ public interface SGenPackage extends EPackage {
 	 */
 	int FEATURE_PARAMETER_VALUE__VALUE = 1;
 
+	/**
+	 * The feature id for the '<em><b>Feature Configuration</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION = 2;
+
 	/**
 	 * The number of structural features of the '<em>Feature Parameter Value</em>' class.
 	 * <!-- begin-user-doc -->
@@ -318,7 +327,7 @@ public interface SGenPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int FEATURE_PARAMETER_VALUE_FEATURE_COUNT = 2;
+	int FEATURE_PARAMETER_VALUE_FEATURE_COUNT = 3;
 
 	/**
 	 * The meta object id for the '{@link org.yakindu.sct.model.sgen.impl.FeatureTypeLibraryImpl <em>Feature Type Library</em>}' class.
@@ -560,6 +569,17 @@ public interface SGenPackage extends EPackage {
 	 */
 	EAttribute getFeatureParameterValue_Value();
 
+	/**
+	 * Returns the meta object for the container reference '{@link org.yakindu.sct.model.sgen.FeatureParameterValue#getFeatureConfiguration <em>Feature Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the container reference '<em>Feature Configuration</em>'.
+	 * @see org.yakindu.sct.model.sgen.FeatureParameterValue#getFeatureConfiguration()
+	 * @see #getFeatureParameterValue()
+	 * @generated
+	 */
+	EReference getFeatureParameterValue_FeatureConfiguration();
+
 	/**
 	 * Returns the meta object for class '{@link org.yakindu.sct.model.sgen.FeatureTypeLibrary <em>Feature Type Library</em>}'.
 	 * <!-- begin-user-doc -->
@@ -780,6 +800,14 @@ public interface SGenPackage extends EPackage {
 		 */
 		EAttribute FEATURE_PARAMETER_VALUE__VALUE = eINSTANCE.getFeatureParameterValue_Value();
 
+		/**
+		 * The meta object literal for the '<em><b>Feature Configuration</b></em>' container reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION = eINSTANCE.getFeatureParameterValue_FeatureConfiguration();
+
 		/**
 		 * The meta object literal for the '{@link org.yakindu.sct.model.sgen.impl.FeatureTypeLibraryImpl <em>Feature Type Library</em>}' class.
 		 * <!-- begin-user-doc -->

+ 17 - 1
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/FeatureConfigurationImpl.java

@@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.EObjectImpl;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -120,7 +121,7 @@ public class FeatureConfigurationImpl extends EObjectImpl implements
 	 */
 	public EList<FeatureParameterValue> getParameterValues() {
 		if (parameterValues == null) {
-			parameterValues = new EObjectContainmentEList<FeatureParameterValue>(FeatureParameterValue.class, this, SGenPackage.FEATURE_CONFIGURATION__PARAMETER_VALUES);
+			parameterValues = new EObjectContainmentWithInverseEList<FeatureParameterValue>(FeatureParameterValue.class, this, SGenPackage.FEATURE_CONFIGURATION__PARAMETER_VALUES, SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION);
 		}
 		return parameterValues;
 	}
@@ -140,6 +141,21 @@ public class FeatureConfigurationImpl extends EObjectImpl implements
 		return null;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SGenPackage.FEATURE_CONFIGURATION__PARAMETER_VALUES:
+				return ((InternalEList<InternalEObject>)(InternalEList<?>)getParameterValues()).basicAdd(otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated

+ 61 - 0
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/FeatureParameterValueImpl.java

@@ -8,12 +8,14 @@ package org.yakindu.sct.model.sgen.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.EObjectImpl;
 
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
 import org.yakindu.sct.model.sgen.FeatureParameter;
 import org.yakindu.sct.model.sgen.FeatureParameterValue;
 import org.yakindu.sct.model.sgen.SGenPackage;
@@ -27,6 +29,7 @@ import org.yakindu.sct.model.sgen.SGenPackage;
  * <ul>
  *   <li>{@link org.yakindu.sct.model.sgen.impl.FeatureParameterValueImpl#getParameter <em>Parameter</em>}</li>
  *   <li>{@link org.yakindu.sct.model.sgen.impl.FeatureParameterValueImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.yakindu.sct.model.sgen.impl.FeatureParameterValueImpl#getFeatureConfiguration <em>Feature Configuration</em>}</li>
  * </ul>
  * </p>
  *
@@ -140,6 +143,60 @@ public class FeatureParameterValueImpl extends EObjectImpl implements FeaturePar
 			eNotify(new ENotificationImpl(this, Notification.SET, SGenPackage.FEATURE_PARAMETER_VALUE__VALUE, oldValue, value));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FeatureConfiguration getFeatureConfiguration() {
+		if (eContainerFeatureID() != SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION) return null;
+		return (FeatureConfiguration)eContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return eBasicSetContainer(otherEnd, SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION:
+				return eBasicSetContainer(null, SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION:
+				return eInternalContainer().eInverseRemove(this, SGenPackage.FEATURE_CONFIGURATION__PARAMETER_VALUES, FeatureConfiguration.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -153,6 +210,8 @@ public class FeatureParameterValueImpl extends EObjectImpl implements FeaturePar
 				return basicGetParameter();
 			case SGenPackage.FEATURE_PARAMETER_VALUE__VALUE:
 				return getValue();
+			case SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION:
+				return getFeatureConfiguration();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -205,6 +264,8 @@ public class FeatureParameterValueImpl extends EObjectImpl implements FeaturePar
 				return parameter != null;
 			case SGenPackage.FEATURE_PARAMETER_VALUE__VALUE:
 				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+			case SGenPackage.FEATURE_PARAMETER_VALUE__FEATURE_CONFIGURATION:
+				return getFeatureConfiguration() != null;
 		}
 		return super.eIsSet(featureID);
 	}

+ 9 - 0
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/SGenPackageImpl.java

@@ -347,6 +347,15 @@ public class SGenPackageImpl extends EPackageImpl implements SGenPackage {
         return (EAttribute)getFeatureParameterValue().getEStructuralFeatures().get(1);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFeatureParameterValue_FeatureConfiguration() {
+        return (EReference)getFeatureParameterValue().getEStructuralFeatures().get(2);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->

+ 3 - 1
plugins/org.yakindu.sct.model.sgen/src/org/yakindu/sct/model/sgen/impl/sgen.ecore

@@ -29,7 +29,7 @@
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//FeatureType"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameterValues" upperBound="-1"
-        eType="#//FeatureParameterValue" containment="true"/>
+        eType="#//FeatureParameterValue" containment="true" eOpposite="#//FeatureParameterValue/featureConfiguration"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="GeneratorEntry">
     <eOperations name="getFeatureConfiguration" eType="#//FeatureConfiguration">
@@ -42,6 +42,8 @@
   <eClassifiers xsi:type="ecore:EClass" name="FeatureParameterValue">
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" eType="#//FeatureParameter"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="featureConfiguration" eType="#//FeatureConfiguration"
+        changeable="false" eOpposite="#//FeatureConfiguration/parameterValues"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FeatureTypeLibrary">
     <eStructuralFeatures xsi:type="ecore:EReference" name="types" upperBound="-1"