Commit 5ff5b8f6 authored by Martti Käärik's avatar Martti Käärik
Browse files

Helper methods for resolving TDL packages (within project)

parent c7270c09
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -20,5 +20,6 @@ Require-Bundle: org.eclipse.xtext,
 org.eclipse.emf.ecore,
 org.eclipse.core.runtime,
 org.eclipse.emf.mwe.utils,
 org.eclipse.ocl.xtext.completeocl
 org.eclipse.ocl.xtext.completeocl,
 org.eclipse.core.resources
Export-Package: org.etsi.mts.tdl.helper
+90 −0
Original line number Diff line number Diff line
@@ -3,11 +3,20 @@ package org.etsi.mts.tdl.helper;


import java.io.IOException;
import java.net.URISyntaxException;
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.runtime.CoreException;
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;
@@ -27,6 +36,7 @@ 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;
@@ -179,6 +189,86 @@ public class TDLHelper {
		return Collections.EMPTY_SET;
	}

	private static final String TDL_MODEL_NAME = "tdl";
	private static final String HTTP_MODEL_NAME = "http";
	private static final String[] MODEL_FILE_EXTENSIONS = new String[] {
			"tdl", "tdlan2", "tdltx", "tdltxi"
	};
	
	private static IProject getProjectForResource(Resource resource) {
		IWorkspaceRoot ws = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot();
		URI resourceUri = resource.getURI();
		IFile modelFile = null;
		if (resourceUri.isPlatformResource()) {
			modelFile = ws.getFile(new Path(resourceUri.toPlatformString(true)));
		} else if (resourceUri.isFile()) {
			// TODO
//			String uriString = resourceUri.toFileString();
//			java.net.URI uri = new java.net.URI(uriString);
//			IFile[] files = ws.findFilesForLocationURI(uri);
		}
		if (modelFile != null)
			return modelFile.getProject();
		return null;
	}
	
	abstract static class FileFinder implements IResourceVisitor {
		
		public IFile file;

		@Override
		public boolean visit(IResource resource) throws CoreException {
			if (file != null)
				return false;
			if (resource.getType() != IResource.FILE)
				return true;
			if (mathces((IFile) resource)) {
				this.file = (IFile) resource;
			}
			return file == null;
		}
		
		abstract protected boolean mathces(IFile file);
	}
	
	public static Package getTdlPackage(Resource resource) {
		return getKnownPackage(resource, TDL_MODEL_NAME);
	}
	
	public static Package getHttpPackage(Resource resource) {
		return getKnownPackage(resource, HTTP_MODEL_NAME);
	}
	
	private static Package getKnownPackage(Resource resource, String packageName) {
		try {
			IProject prj = getProjectForResource(resource);
			if (prj != null) {
				final Set<String> names = new HashSet<>();
				for (String ext : MODEL_FILE_EXTENSIONS) {
					names.add(packageName + "." + ext);
				}
				FileFinder finder = new FileFinder() {
					@Override
					protected boolean mathces(IFile file) {
						return names.contains(file.getName().toLowerCase());
					}
				};
				prj.accept(finder);
				
				if (finder.file != null) {
					URI uri = URI.createPlatformResourceURI(finder.file.getFullPath().toString(), true);
					Resource tdlResource = resource.getResourceSet().getResource(uri, true);
					return (Package) tdlResource.getContents().get(0);
				}
			}
		} catch (CoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return null;
	}

	/**
	 * Reset the shared resourceSet.
	 */