package org.eclipse.emf.emfatic.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Map;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
import org.eclipse.emf.emfatic.core.generator.ecore.Builder;
import org.eclipse.emf.emfatic.core.generator.ecore.Connector;
import org.eclipse.emf.emfatic.core.generator.emfatic.Writer;
import org.eclipse.emf.emfatic.core.lang.gen.parser.EmfaticParserDriver;
import org.eclipse.gymnast.runtime.core.parser.ParseContext;

public class EmfaticResource extends ResourceImpl {

	public EmfaticResource(URI uri) {
		super(uri);
	}
	
	@Override
	protected void doLoad(InputStream inputStream, Map<?, ?> options) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
		EmfaticParserDriver parser = new EmfaticParserDriver(uri);
		ParseContext parseContext = parser.parse(reader);
		Builder builder = new Builder();
		NullProgressMonitor monitor = new NullProgressMonitor();
		builder.build(parseContext, this, monitor);
		if (!parseContext.hasErrors()) {
			Connector connector = new Connector(builder);
			connector.connect(parseContext, this, monitor);
		}
	}
	
	@Override
	protected void doSave(OutputStream outputStream, Map<?, ?> options) throws IOException {
		Writer writer = new Writer();
        String emfaticText = writer.write(this, new NullProgressMonitor(), null);
		outputStream.write(emfaticText.getBytes());
		outputStream.flush();
		outputStream.close();
	}

}
