Commit 9ec177d5 authored by Martti Käärik's avatar Martti Käärik
Browse files

Xtext serialiser can only work with Xtext resources, copy serializable objects...

Xtext serialiser can only work with Xtext resources, copy serializable objects to temporary Xtext resource.
Use simple cross-reference serializer that returns named element names.

Change-Id: If37ef4e942fbe26ed5379b04ee0ff55563ea4872
parent 164b0a59
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
/*
 * generated by Xtext 2.10.0
 */
package org.etsi.mts.tdl.graphical.labels;

import org.etsi.mts.tdl.graphical.labels.serializer.DataCrossReferenceSerializer;

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
public class DataRuntimeModule extends AbstractDataRuntimeModule {

	public Class<? extends org.eclipse.xtext.serializer.tokens.ICrossReferenceSerializer> bindICrossReferenceSerializer() {
		return DataCrossReferenceSerializer.class;
	}
}
+25 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.graphical.labels.serializer;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic.Acceptor;
import org.etsi.mts.tdl.NamedElement;

public class DataCrossReferenceSerializer implements org.eclipse.xtext.serializer.tokens.ICrossReferenceSerializer {

	@Override
	public boolean isValid(EObject context, CrossReference crossref, EObject target, INode node,
			Acceptor errorAcceptor) {
		return true;
	}

	@Override
	public String serializeCrossRef(EObject context, CrossReference crossref, EObject target, INode node,
			Acceptor errorAcceptor) {
		if (target instanceof NamedElement)
			return ((NamedElement) target).getName();
		return "<unresolved reference>";
	}

}
+47 −7
Original line number Diff line number Diff line
package org.etsi.mts.tdl.graphical.extensions;

import java.io.IOException;
import java.util.List;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.resource.IResourceFactory;
import org.eclipse.xtext.resource.SaveOptions;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.serializer.ISerializer;
import org.eclipse.xtext.serializer.impl.Serializer;
import org.etsi.mts.tdl.ActionReference;
import org.etsi.mts.tdl.Assertion;
import org.etsi.mts.tdl.ComponentInstanceBinding;
import org.etsi.mts.tdl.DataInstanceUse;
import org.etsi.mts.tdl.DataUse;
@@ -95,22 +102,34 @@ public class DataUseLabelProvider {
	public String serialise(EObject o, DataUse u) {
		Injector injector = new DataStandaloneSetup().createInjectorAndDoEMFRegistration();
		String s = "";
		Serializer serializer = injector.getInstance(Serializer.class); 
		ISerializer serializer = injector.getInstance(ISerializer.class);
		
		XtextResource xr = null;
		try {  
			if (u instanceof DataUse) {
				s += serializer.serialize((DataUse)u);  
				
				if (!(u.eResource() instanceof XtextResource)) {
					URI uri = u.eResource().getURI();
					u  = EcoreUtil.copy(u);
					xr = createVirtualXtextResource(uri, u);
				}
				
				SaveOptions options = SaveOptions.newBuilder().noValidation().getOptions();
				s += serializer.serialize((DataUse)u, options);
			}
		} catch (Exception ex) { // fall back:  
			System.out.println("Object could not be serialized"); 
			System.out.println(ex.getMessage());
			System.err.println(ex);
			ex.printStackTrace();
			
		} finally {
			if (xr != null)
				xr.unload();
		}
		
		return s;
	}
	
	
	public String getDataUse(EObject o, DataUse u, String s) {
		String output = ""+u.eClass().getName();
		if (u instanceof DataInstanceUse) {
@@ -131,4 +150,25 @@ public class DataUseLabelProvider {
		return output;
	}


	private XtextResource createVirtualXtextResource(URI uri, EObject semanticElement) throws IOException {
		Injector xtextInjector = new DataStandaloneSetup().createInjectorAndDoEMFRegistration();
		IResourceFactory resourceFactory = xtextInjector.getInstance(IResourceFactory.class);
		XtextResourceSet rs = xtextInjector.getInstance(XtextResourceSet.class);
		rs.setClasspathURIContext(getClass());
		// Create virtual resource
		XtextResource xtextVirtualResource = (XtextResource) resourceFactory
				.createResource(URI.createURI(uri.toString()));
		rs.getResources().add(xtextVirtualResource);

		// Populate virtual resource with the given semantic element to edit
		xtextVirtualResource.getContents().add(semanticElement);

		// Save and reparse in order to initialize virtual Xtext resource
//		ByteArrayOutputStream out = new ByteArrayOutputStream();
//		xtextVirtualResource.save(out, Collections.emptyMap());
//		xtextVirtualResource.reparse(new String(out.toByteArray()));

		return xtextVirtualResource;
	}
}