/**
* Copyright (c) 2016 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
*
*/
package org.yakindu.sct.generator.runner;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.GENERATOR_CLASS;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.GENERATOR_PROJECT;
import static org.yakindu.sct.generator.runner.lib.IGenericJavaFeatureConstants.TEMPLATE_FEATURE;
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.yakindu.sct.commons.WorkspaceClassLoaderFactory;
import org.yakindu.sct.generator.core.IExecutionFlowGenerator;
import org.yakindu.sct.generator.core.ISCTGenerator;
import org.yakindu.sct.generator.core.ISGraphGenerator;
import org.yakindu.sct.generator.core.execution.AbstractGeneratorEntryExecutor;
import org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess;
import org.yakindu.sct.model.sexec.transformation.IModelSequencer;
import org.yakindu.sct.model.sgen.FeatureConfiguration;
import org.yakindu.sct.model.sgen.FeatureParameterValue;
import org.yakindu.sct.model.sgen.GeneratorEntry;
import org.yakindu.sct.model.sgraph.Statechart;
import com.google.inject.Inject;
/**
*
* @author andreas muelder - Initial contribution and API
*
*/
public class WorkspaceGeneratorExecutor extends AbstractGeneratorEntryExecutor {
@Inject(optional = true)
private IModelSequencer sequencer;
@Override
protected void execute(ISCTFileSystemAccess access, GeneratorEntry entry) {
ISCTGenerator codeGenerator = createInstance(entry, getTemplateClassName(entry));
if (codeGenerator instanceof ISGraphGenerator) {
((ISGraphGenerator) codeGenerator).generate((Statechart) entry.getElementRef(), entry, access);
} else if (codeGenerator instanceof IExecutionFlowGenerator) {
((IExecutionFlowGenerator) codeGenerator).generate(sequencer.transform((Statechart) entry.getElementRef()),
entry, access);
}
}
@SuppressWarnings("unchecked")
protected <T> T createInstance(GeneratorEntry entry, String className) {
try {
IProject project = getLookupRoot(entry);
final ClassLoader classLoader = new WorkspaceClassLoaderFactory().createClassLoader(project,
getClass().getClassLoader());
return (T) classLoader.loadClass(className).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
protected String getTemplateClassName(GeneratorEntry entry) {
return entry.getFeatureConfiguration(TEMPLATE_FEATURE).getParameterValue(GENERATOR_CLASS).getStringValue();
}
protected IProject getLookupRoot(GeneratorEntry entry) {
IProject project = null;
FeatureConfiguration templateConfig = entry.getFeatureConfiguration(TEMPLATE_FEATURE);
FeatureParameterValue projectName = templateConfig.getParameterValue(GENERATOR_PROJECT);
if (projectName != null) {
project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName.getStringValue());
} else {
URI uri = entry.getElementRef().eResource().getURI();
project = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true)))
.getProject();
}
return project;
}
}