Commit 34fa0973 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* refined file wizards, #141, #38, #36

parent 1a0c4781
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@
			category="org.etsi.mts.tdl.ui.category"
			class="org.etsi.mts.tdl.ui.TDLtxExecutableExtensionFactory:org.eclipse.xtext.ui.wizard.template.TemplateNewFileWizard"
			id="org.etsi.mts.tdl.ui.wizard.TDLtxNewFileWizard"
			name="TDL Textual File (from Template)"
			name="TDL Textual File"
			icon="icons/new_TDLtx_file.png">
		</wizard>
	</extension>
+12 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.ui.wizard

import org.eclipse.xtext.ui.wizard.template.IFileGenerator

class LibraryHandler {
	static def void addLibraries(IFileGenerator generator, String library, String folder) {
		val target = '''«folder»/«library».tdltx'''
		if (!TemplateHelper.checkIfFileExists(target, generator)) {
			generator.generate(target, TemplateHelper.getLibrary("TDL"))
		}
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ public class Messages extends NLS {
	public static String TDLtxProjectBaseTPD_Description;
	public static String TDLtxProjectExecutable_Label;
	public static String TDLtxProjectExecutable_Description;
	public static String TDLtxFileWithStandardLibrary_Label;
	public static String TDLtxFileWithStandardLibrary_Description;
	
	static {
	// initialize resource bundle
+103 −43
Original line number Diff line number Diff line
@@ -11,6 +11,14 @@ import org.eclipse.core.runtime.preferences.InstanceScope
import org.eclipse.ui.preferences.ScopedPreferenceStore
import org.etsi.mts.tdl.ui.wizard.TemplateHelper.Libraries
import org.etsi.mts.tdl.transform.Converter
import java.io.File
import org.eclipse.xtext.ui.wizard.template.WorkspaceFileGenerator
import org.eclipse.core.internal.resources.WorkspaceRoot
import org.eclipse.core.runtime.Path
import org.eclipse.xtext.ui.wizard.template.AbstractFileTemplate
import org.eclipse.xtext.ui.wizard.template.AbstractTemplate

import static extension org.etsi.mts.tdl.ui.wizard.LibraryHandler.*;

/**
 * Create a list with all file templates to be shown in the template new file wizard.
@@ -21,24 +29,26 @@ class TDLtxFileTemplateProvider implements IFileTemplateProvider {
	override getFileTemplates() {
		#[
			new TDLtxFile, 
			new TDLtxFileFromOpenAPI,
			new TDLtxLibrary
			new TDLtxFileWithStandardLibrary,
			new TDLtxFileFromOpenAPI
		]
	}
}

@FileTemplate(label="TDL Textual", icon="file_template.png", description="Create a new package for TDL.")

@FileTemplate(label="TDL Textual", icon="file_template.png", description="Create a new textual file for TDL.")
final class TDLtxFile {
	//TODO: make it more sensible
	val packageName = text("Package Name:", "EmptyPackage", "The name of the package")

//	val packageName = text("Package Name:", "", "The name of the package")
//	val packageName = name
    //TODO: reuse?
    
	override generateFiles(IFileGenerator generator) {
		generator.generate('''«folder»/«name».tdltx''', '''
			/*
			 * This is an example model
			 */
			Package «packageName» {
			Package «name» {
			    
			}
		''')
@@ -46,58 +56,108 @@ final class TDLtxFile {
	}
}

@FileTemplate(label="TDL Textual Library", icon="file_template.png", description="Add library for TDL.")
final class TDLtxLibrary {
	//TODO: make it more sensible
	//TODO: name should not be asked for...
	val name = text("Name:", "TDL")
	val packageName = combo("Library:", #["TDL", "HTTP"], "The library to be added.")
	var validated = false

@FileTemplate(label="TDL Textual with Standard TDL Libraries", icon="file_template.png", description="Create a new textual file for TDL importing standard libraries for TDL.")
final class TDLtxFileWithStandardLibrary {
	protected val libraries = group("Select libraries to import:")
	protected val includeTDL = check("TDL Standard Library", true, "Include TDL Standard Library (recommended)", libraries)
	protected val includeHTTP = check("HTTP Protocol Library", true, "Include HTTP Protocol Library", libraries)
	protected var validated = false

	override protected updateVariables() {
		validated = true
		super.updateVariables()
	}

	protected def String addLibraries(IFileGenerator generator) {
		var imports = ""
		if (includeTDL.value) {
			generator.addLibraries("TDL", folder)
			imports += "Import all from TDL\n"
		}
		if (includeHTTP.value) {
			generator.addLibraries("HTTP", folder)
			imports += "Import all from HTTP\n"
		}
		return imports
	}
	
    //TODO: reuse?
	override generateFiles(IFileGenerator generator) {
		//TODO: use enum values?
		if (validated) {
			generator.generate('''«folder»/«name».tdltx''', TemplateHelper.getLibrary(packageName.value))
			var imports = addLibraries(generator)
			generator.generate('''«folder»/«name».tdltx''', '''
				/*
				 * This is an example model
				 */
				Package «name» {
					 «imports»
				    
				}
			''')
			
		}		
	}
}


@FileTemplate(label="Data definitions import from OpenAPI", icon="file_template.png", description="Create a new package for TDL from OpenAPI data definitions.")
@FileTemplate(label="TDL Textual with Standard TDL Libraries and Test Purpose Description Example", icon="file_template.png", description="Create a new textual file for TDL importing standard libraries for TDL and including a Test Purpose Description Example.")
final class TDLtxFileFromOpenAPI {
    //TODO: more modern way?
	val s = new ScopedPreferenceStore(new InstanceScope(), "org.etsi.mts.tdl.tx.ui.template.data.openapi")
    val lastUsed = "LAST_USED"
    //TODO: file prompt?
    val dataDefinitionsPath = text("Data Definitions Path:", s.getString(lastUsed), "The data definitions path to import from")
    val sourceMapping = text("Source mapping tag:", "SOURCE_MAPPING", "The source mapping tag to be used for the data mappings")
    val targetMapping = text("Target mapping tag:", "TARGET_MAPPING", "The target mapping tag to be used for the data mappings")

	var validated = false
    //TODO: reuse?
	override generateFiles(IFileGenerator generator) {
		generator.addLibraries("TDL", folder)
		//TODO: add possibility to reuse library selection
		var imports = "Import all from TDL\n"
		//TODO: extract for reuse?
		generator.generate('''«folder»/«name».tdltx''', '''
			/*
			 * This is an example package
			 */
			Package «name» {
			    «imports»
				//Example definitions to get started    
			    Message Gate api accepts String
			
	override protected updateVariables() {
		validated = true
		s.setValue(lastUsed, dataDefinitionsPath.value)
		s.save()
		super.updateVariables()
			    Component node {
			    	gate api http
			    }
			
    override generateFiles(IFileGenerator generator) {
		//NOTE: this is triggered on every key stroke.. -> lock until second screen
		if (validated) {
			generator.generate('''«folder»/«name».tdltx''', 
				Converter.getConverter("org.etsi.mts.tdl.openapi2tdl.next").processToString(dataDefinitionsPath.value, 
					folder+"/"+name+".tdltx", 
					sourceMapping.value, 
					targetMapping.value
			))
			    Configuration nodeTC { 
			    	node sut as SUT,
			    	node tester as Tester,
			    	connect server=sut::http to client=tester::http
			    } 

				@PICS Boolean F1
				@PICS Boolean F2
			
			    Objective TO_01 {
			    	Description: "Test document generation"
			    	References: "Epic #xy"
			    }  
			
				Test Purpose Description TP_01 {
					Objective: TO_01
					Configuration: nodeTC
					PICS: (F1 or F2) on tester
					Initial conditions
					with {
					    client sends "initiate" to server
					} 		
					
					Expected behaviour
					ensure that {
						when {
						    client sends "request" to server
						}
						then {
						    client receives "response" from server
						}
					}
				}
			}
		''')
    }
}
+13 −2
Original line number Diff line number Diff line
@@ -8,19 +8,30 @@ import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;

import org.eclipse.core.internal.resources.WorkspaceRoot;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.xtext.ui.wizard.template.IFileGenerator;
import org.eclipse.xtext.ui.wizard.template.WorkspaceFileGenerator;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.etsi.mts.tdl.resources.ResourceHandler;
import org.osgi.framework.Bundle;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.Path;

public class TemplateHelper {
	enum Libraries {
		Standard, HTTP 
	}
	
	public static boolean checkIfFileExists(String path, IFileGenerator generator) {
		WorkspaceFileGenerator gen = (WorkspaceFileGenerator) generator;
		WorkspaceRoot root = (WorkspaceRoot) gen.getRule();
		Path target = new Path(path);
		return root.exists(target);
	}
	
	public static String getLibrary(String name) {
		String library = "//NOT AVAILABLE\n";
		try {
@@ -52,7 +63,7 @@ public class TemplateHelper {
						.getLocation().getPath();
				String projectPath = new File(binPath).getParent();
				uri = new File(((projectPath + "/") + libraryPath)).toURI();
				library = Files.readString(Path.of(uri));
				library = Files.readString(java.nio.file.Path.of(uri));
			}
		} catch (Throwable _e) {
			throw Exceptions.sneakyThrow(_e);
Loading