package org.occiware.clouddesigner.occi.xtext.ui; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.URIHandlerImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.eclipse.jface.text.IDocument; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider; import org.occiware.clouddesigner.occi.OCCIPackage; import org.occiware.clouddesigner.occi.xtext.OCCIStandaloneSetup; public class OCCIDocumentProvider extends XtextDocumentProvider { static { OCCIStandaloneSetup.doSetup(); } @Override protected void setDocumentContent(IDocument document, InputStream contentStream, String encoding) throws CoreException { ResourceSet resourceSet = createResourceSet(); Resource xmiResource = resourceSet.createResource(URI.createURI("temp.xmi")); Resource xtextResource = resourceSet.createResource(URI.createURI("temp.occi")); ByteArrayOutputStream os = new ByteArrayOutputStream(); try { xmiResource.load(contentStream, Collections.emptyMap()); xtextResource.getContents().addAll(xmiResource.getContents()); xtextResource.save(os, Collections.EMPTY_MAP); } catch (IOException e) { throw new CoreException( new Status(IStatus.ERROR, "org.occiware.clouddesigner.occi.xtext.ui", "Failed to save", e)); } finally { try { os.close(); contentStream.close(); } catch (IOException e) { throw new CoreException( new Status(IStatus.ERROR, "org.occiware.clouddesigner.occi.xtext.ui", "Failed to load", e)); } } document.set(new String(os.toByteArray())); } @Override protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException { try { ResourceSet resourceSet = createResourceSet(); XtextResource xtextResource = (XtextResource) resourceSet.createResource(URI.createURI("temp.occi")); InputStream is = new ByteArrayInputStream(document.get().getBytes()); xtextResource.load(is, Collections.EMPTY_MAP); is.close(); URI uri = URI.createPlatformResourceURI( ((org.eclipse.ui.part.FileEditorInput) element).getFile().getFullPath().toString(), true); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl()); Resource xmiResource = resourceSet.getResource(uri, true); ((XMLResource) xmiResource).getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, new URIHandlerImpl.PlatformSchemeAware()); xmiResource.getContents().clear(); xmiResource.getContents().addAll(xtextResource.getContents()); // SUPER IMPORTANT to avoid to have references to temp.occi EcoreUtil.resolveAll(xmiResource); xmiResource.save(Collections.EMPTY_MAP); } catch (IOException e) { throw new CoreException( new Status(IStatus.ERROR, "org.occiware.clouddesigner.occi.xtext.ui", "Failed to save", e)); } } private ResourceSet createResourceSet() { ResourceSet resourceSet = new ResourceSetImpl(); resourceSet.getPackageRegistry().put(OCCIPackage.eNS_URI, OCCIPackage.eINSTANCE); return resourceSet; } }