Commit fe94798f authored by Philip Makedonski's avatar Philip Makedonski
Browse files

- factored out common functionality to ResourceHandler, decoupled TDLHelper, #145

parent 204f8a2f
Loading
Loading
Loading
Loading
+46 −4
Original line number Diff line number Diff line
@@ -6,18 +6,14 @@ import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.eclipse.core.resources.IFile;
@@ -32,6 +28,7 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.resource.IResourceServiceProvider;
@@ -88,6 +85,51 @@ public class ResourceHandler {
		return create(getResourceSet(), filename);
	}

	/**
	 * Loads an existing resource from a file.
	 * @param filename location of the resource to be loaded.
	 * @return A resource loaded from the file.
	 */
	public static Resource load(String filename) {
		Resource resource = getResourceSet().getResource(org.eclipse.emf.common.util.URI.createURI(filename), true);
		return resource;
	}
	
	/**
	 * Link / resolve all loaded resources.
	 */
	public static void link() {
		EcoreUtil.resolveAll(getResourceSet());
	}

	/**
	 * Check all resources in the shared resourceSet. 
	 */
	public static void check() {
		//TODO: check automatically? make optional in case of performance or redundancy concerns?
//		TDLHelper.link();
		getResourceSet().getResources().forEach(ResourceHandler::check);
	}

	/**
	 * Check resource in the shared resourceSet. Load if needed.
	 * @param filename location of the resource to be checked.
	 */
	public static void check(String filename) {
		Resource r = ResourceHandler.load(filename);
		check(r);
	}

	/**
	 * Check resource.
	 * @param r the resource to be checked.
	 */
	public static void check(Resource r) {
		r.getErrors().forEach(e -> System.out.println("Error: "+r.getURI().lastSegment()+": "+e.getLine()+": "+e.getMessage()));
		r.getWarnings().forEach(e -> System.out.println("Warning: "+r.getURI().lastSegment()+": "+e.getLine()+": "+e.getMessage()));
	}

	
	/**
	 * Store resource contents in a file.  
	 * @param resource A resource to be saved.
+6 −27
Original line number Diff line number Diff line
@@ -2,31 +2,18 @@ package org.etsi.mts.tdl.helper;



import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.mwe.utils.StandaloneSetup;
import org.eclipse.ocl.common.OCLConstants;
import org.eclipse.ocl.pivot.internal.delegate.OCLInvocationDelegateFactory;
@@ -38,8 +25,6 @@ import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.resource.IResourceServiceProvider;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.serializer.impl.Serializer;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.TDLan2StandaloneSetup;
import org.etsi.mts.tdl.TDLtxStandaloneSetup;
import org.etsi.mts.tdl.TDLtxiStandaloneSetup;
@@ -47,7 +32,6 @@ import org.etsi.mts.tdl.TPLan2StandaloneSetup;
import org.etsi.mts.tdl.impl.tdlPackageImpl;
import org.etsi.mts.tdl.resources.ResourceHandler;
import org.etsi.mts.tdl.structuredobjectives.impl.StructuredObjectivesPackageImpl;
import org.osgi.framework.Bundle;

import com.google.inject.Injector;

@@ -84,15 +68,14 @@ public class TDLHelper {
	 * @return A resource loaded from the file.
	 */
	public static Resource load(String filename) {
		Resource resource = resourceSet.getResource(org.eclipse.emf.common.util.URI.createURI(filename), true);
		return resource;
		return ResourceHandler.load(filename);
	}
	
	/**
	 * Link / resolve all loaded resources.
	 */
	public static void link() {
		EcoreUtil.resolveAll(resourceSet);
		ResourceHandler.link();
	}

	/**
@@ -100,8 +83,7 @@ public class TDLHelper {
	 */
	public static void check() {
		//TODO: check automatically? make optional in case of performance or redundancy concerns?
//		TDLHelper.link();
		resourceSet.getResources().forEach(TDLHelper::check);
		ResourceHandler.check();
	}

	/**
@@ -109,20 +91,17 @@ public class TDLHelper {
	 * @param filename location of the resource to be checked.
	 */
	public static void check(String filename) {
		Resource r = TDLHelper.load(filename);
		check(r);
		ResourceHandler.check(filename);
	}

	/**
	 * Check resource.
	 * @param r the resource to be checked.
	 */
	private static void check(Resource r) {
		r.getErrors().forEach(e -> System.out.println("Error: "+r.getURI().lastSegment()+": "+e.getLine()+": "+e.getMessage()));
		r.getWarnings().forEach(e -> System.out.println("Warning: "+r.getURI().lastSegment()+": "+e.getLine()+": "+e.getMessage()));
	public static void check(Resource r) {
		ResourceHandler.check(r);
	}
	
	
	/**
	 * Creates a new resource at the specified location.
	 * @param filename Location of the resource to be loaded.
+33 −42
Original line number Diff line number Diff line
package org.etsi.mts.tdl.standalone;

import de.ugoe.cs.swe.TTCN3StandaloneSetup;
import java.io.File;
import java.io.FilenameFilter;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -29,19 +22,14 @@ import org.eclipse.ocl.pivot.utilities.ParserException;
import org.eclipse.ocl.pivot.utilities.Query;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.ComponentInstance;
import org.etsi.mts.tdl.ComponentInstanceRole;
import org.etsi.mts.tdl.CompoundBehaviour;
import org.etsi.mts.tdl.Extension;
import org.etsi.mts.tdl.GateType;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.CompoundBehaviour;
import org.etsi.mts.tdl.BoundedLoopBehaviour;
import org.etsi.mts.tdl.AlternativeBehaviour;
import org.etsi.mts.tdl.ConditionalBehaviour;
import org.etsi.mts.tdl.ProcedureCall;
import org.etsi.mts.tdl.Interaction;
import org.etsi.mts.tdl.Message;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.StructuredDataType;
import org.etsi.mts.tdl.TestConfiguration;
import org.etsi.mts.tdl.TestDescription;
@@ -49,16 +37,18 @@ import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.asn2tdl.ASN2TDLTranslator;
import org.etsi.mts.tdl.constraints.evl.Validator;
import org.etsi.mts.tdl.helper.TDLHelper;
import org.etsi.mts.tdl.impl.CompoundBehaviourImpl;
import org.etsi.mts.tdl.json2tdl.JSON2TDLTranslator;
import org.etsi.mts.tdl.json2tdl.TDL2JSONTranslator;
import org.etsi.mts.tdl.openapi2tdl.next.OpenAPI2TDLTranslatorNext;
import org.etsi.mts.tdl.openapi2tdl.next.doc.Doc;
import org.etsi.mts.tdl.resources.ResourceHandler;
import org.etsi.mts.tdl.tools.to.docx.poi.Generator;
import org.etsi.mts.tdl.transform.AbstractTranslator;
import org.etsi.mts.tdl.ttcn3.Transform;
import org.etsi.mts.tdl.yang2tdl.Yang2TDLTranslator;

import de.ugoe.cs.swe.TTCN3StandaloneSetup;

public class Standalone {
	static String sourceExtension = "tdltx";
	static String targetExtension = "tdltx";
@@ -80,6 +70,7 @@ public class Standalone {
	}
	
	public static void main(String[] args) throws Exception {
		TDLHelper.init();
		Standalone app = new Standalone();
		//TODO: expose as arguments
		
@@ -230,7 +221,7 @@ public class Standalone {
	}

	private void processElements(String path, Consumer<String> operation) throws Exception {
		TDLHelper.resetResourceSet();
//		TDLHelper.resetResourceSet();
		processElements(path, sourceExtension, operation);
	}
	
@@ -247,9 +238,9 @@ public class Standalone {
		if (extension.contains("tdl")) {
			Files.walk(Path.of(path))
				.filter(e->e.getFileName().toString().endsWith(extension))
				.forEach(e->TDLHelper.load(e.toAbsolutePath().toString()));
			TDLHelper.link();
			TDLHelper.check();
				.forEach(e->ResourceHandler.load(e.toAbsolutePath().toString()));
			ResourceHandler.link();
			ResourceHandler.check();
		}
		Files.walk(Path.of(path))
				.filter(e->e.getFileName().toString().endsWith(extension))
@@ -267,10 +258,10 @@ public class Standalone {
			if (extension.contains("tdl")) {
				for (File f : files) {
					System.out.println("Loading: "+f.getAbsolutePath());
					TDLHelper.load(f.getAbsolutePath());
					ResourceHandler.load(f.getAbsolutePath());
				}
				TDLHelper.link();
				TDLHelper.check();
				ResourceHandler.link();
				ResourceHandler.check();
			}
			for (File f : files) {
				System.out.println("Processing: "+f.getAbsolutePath());
@@ -279,9 +270,9 @@ public class Standalone {
		} else {
			if (extension.contains("tdl")) {
				System.out.println("Loading: "+target.getAbsolutePath());
				TDLHelper.load(target.getAbsolutePath());
				TDLHelper.link();
				TDLHelper.check();
				ResourceHandler.load(target.getAbsolutePath());
				ResourceHandler.link();
				ResourceHandler.check();
			}
			System.out.println("Processing: "+target.getAbsolutePath());
			operation.accept(target.getAbsolutePath());
@@ -289,7 +280,7 @@ public class Standalone {
	}

	private void listElements(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		Package p = (Package) resource.getContents().get(0);
		System.out.println("Package: "+p.getName());
		p.getNestedPackage().forEach(e -> {
@@ -312,7 +303,7 @@ public class Standalone {
	}
	
	private void validate(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		Validator validator = new Validator();
		//TODO: make robust against unresolved imports
		//TODO: report parsing / resolution errors
@@ -325,14 +316,14 @@ public class Standalone {
	}

	private void validateOCL(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		Validator validator = new Validator();
		validator.validateOCL2(resource);
	}
	
	private void evaluateOCLInline(String path) {
		Resource resource = TDLHelper.load(path);
		OCL ocl = OCL.newInstance(TDLHelper.getResourceSet());
		Resource resource = ResourceHandler.load(path);
		OCL ocl = OCL.newInstance(ResourceHandler.getResourceSet());
		EClass contextEClass = tdlPackage.Literals.GATE_TYPE;
		try {
			ExpressionInOCL query = ocl.createQuery(contextEClass,
@@ -350,11 +341,11 @@ public class Standalone {
	}
	
	private void translate(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		try {
			Resource target = TDLHelper.create(resource.getURI().path() + "." + targetExtension);
			Resource target = ResourceHandler.create(resource.getURI().path() + "." + targetExtension);
			target.getContents().addAll(EcoreUtil.copyAll(resource.getContents()));
			TDLHelper.store(target, true);
			ResourceHandler.store(target, true);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
@@ -364,10 +355,10 @@ public class Standalone {
	private void importData(String path, AbstractTranslator translator) {
		File source = new File(path);
		try {
			translator.setTargetResource(TDLHelper.create(source.getAbsolutePath()+"-generated."+targetExtension));
			translator.setTargetResource(ResourceHandler.create(source.getAbsolutePath()+"-generated."+targetExtension));
			translator.initTargetResource(translator.cleanName(source.getName()));
			translator.translate(source.getAbsolutePath());
			TDLHelper.store(translator.getTargetResource(), false);
			ResourceHandler.store(translator.getTargetResource(), false);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
@@ -392,7 +383,7 @@ public class Standalone {
	}

	private void generateDiagrams(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		//export to external generator
		EObject model = resource.getContents().get(0);
		generateConfiguration(path, model);
@@ -582,13 +573,13 @@ public class Standalone {
	}

	private void exportJSON(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		TDL2JSONTranslator translator = new TDL2JSONTranslator();
		translator.transform((Package) resource.getContents().get(0));
	}

	private void exportDoc(String path) {
		Resource resource = TDLHelper.load(path);
		Resource resource = ResourceHandler.load(path);
		Generator generator = new Generator();
		String target = path+".docx";
		try {
@@ -606,13 +597,13 @@ public class Standalone {
	private void exportTTCN3(String path) {
		try {
			new TTCN3StandaloneSetup().createInjectorAndDoEMFRegistration();
			Resource resource = TDLHelper.load(path);
			Resource resource = ResourceHandler.load(path);
			Transform transformer = new Transform();
			Resource ir = TDLHelper.create(path+"-generated.ttcn3m");
			Resource ir = ResourceHandler.create(path+"-generated.ttcn3m");
			transformer.transform(resource, ir);
			//This is important otherwise ghost references may occur
			ir.unload();
			Resource tr = TDLHelper.create(path+"-generated.ttcn3");
			Resource tr = ResourceHandler.create(path+"-generated.ttcn3");
			transformer.transform(resource, tr);
		} catch (Exception e) {
			e.printStackTrace();