package org.eclipse.emf.ecore.xcore.generator; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenClassGeneratorAdapter; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenEnumGeneratorAdapter; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapter; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenPackageGeneratorAdapter; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.generator.IFileSystemAccess; public class XcoreGenModelGeneratorAdapterFactory extends GenModelGeneratorAdapterFactory { private IFileSystemAccess fsa; public void setFileSystemAccess(IFileSystemAccess fsa) { this.fsa = fsa; } protected OutputStream createOutputStream(URI workspacePath) { String string = workspacePath.toString(); final String targetFile = string.substring(string.indexOf(XcoreGeneratorImpl.OUTPUT_DIR_MARKER) + XcoreGeneratorImpl.OUTPUT_DIR_MARKER.length()+1); return new ByteArrayOutputStream() { @Override public void close() throws IOException { fsa.generateFile(targetFile, new String(this.toByteArray())); super.close(); } }; } /** * Returns a singleton {@link GenModelGeneratorAdapter}. */ @Override public Adapter createGenModelAdapter() { if (genModelGeneratorAdapter == null) { genModelGeneratorAdapter = new GenModelGeneratorAdapter(this){ @Override protected OutputStream createOutputStream(URI workspacePath) throws Exception { return XcoreGenModelGeneratorAdapterFactory.this.createOutputStream(workspacePath); } }; } return genModelGeneratorAdapter; } /** * Returns a singleton {@link GenPackageGeneratorAdapter}. */ @Override public Adapter createGenPackageAdapter() { if (genPackageGeneratorAdapter == null) { genPackageGeneratorAdapter = new GenPackageGeneratorAdapter(this) { @Override protected OutputStream createOutputStream(URI workspacePath) throws Exception { return XcoreGenModelGeneratorAdapterFactory.this.createOutputStream(workspacePath); } }; } return genPackageGeneratorAdapter; } /** * Returns a singleton {@link GenClassGeneratorAdapter}. */ @Override public Adapter createGenClassAdapter() { if (genClassGeneratorAdapter == null) { genClassGeneratorAdapter = new GenClassGeneratorAdapter(this){ @Override protected OutputStream createOutputStream(URI workspacePath) throws Exception { return XcoreGenModelGeneratorAdapterFactory.this.createOutputStream(workspacePath); } }; } return genClassGeneratorAdapter; } /** * Returns a singleton {@link GenEnumGeneratorAdapter}. */ @Override public Adapter createGenEnumAdapter() { if (genEnumGeneratorAdapter == null) { genEnumGeneratorAdapter = new GenEnumGeneratorAdapter(this){ @Override protected OutputStream createOutputStream(URI workspacePath) throws Exception { return XcoreGenModelGeneratorAdapterFactory.this.createOutputStream(workspacePath); } }; } return genEnumGeneratorAdapter; } }