Removed IAcceleoEnvironment writer and strategy.

Change-Id: I4c8b122cf4156bb355489cfdf5cbdc624f40d9f2
diff --git a/plugins/org.eclipse.acceleo.aql.launcher/src/org/eclipse/acceleo/aql/launcher/AcceleoLauncher.java b/plugins/org.eclipse.acceleo.aql.launcher/src/org/eclipse/acceleo/aql/launcher/AcceleoLauncher.java
index 89e118a..60939ab 100644
--- a/plugins/org.eclipse.acceleo.aql.launcher/src/org/eclipse/acceleo/aql/launcher/AcceleoLauncher.java
+++ b/plugins/org.eclipse.acceleo.aql.launcher/src/org/eclipse/acceleo/aql/launcher/AcceleoLauncher.java
@@ -22,7 +22,6 @@
 import org.eclipse.acceleo.aql.IAcceleoEnvironment;

 import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;

 import org.eclipse.acceleo.aql.evaluation.GenerationResult;

-import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;

 import org.eclipse.acceleo.aql.parser.AcceleoParser;

 import org.eclipse.acceleo.aql.parser.ModuleLoader;

 import org.eclipse.acceleo.query.ide.QueryPlugin;

@@ -219,8 +218,7 @@
 				AcceleoParser.QUALIFIER_SEPARATOR);

 		final QualifiedNameQueryEnvironment queryEnvironment = new QualifiedNameQueryEnvironment(resolver);

 		// TODO generation strategy should be configurable

-		IAcceleoEnvironment acceleoEnvironment = new AcceleoEnvironment(queryEnvironment,

-				new DefaultGenerationStrategy());

+		IAcceleoEnvironment acceleoEnvironment = new AcceleoEnvironment(queryEnvironment);

 		AcceleoEvaluator evaluator = new AcceleoEvaluator(acceleoEnvironment, queryEnvironment

 				.getLookupEngine());

 

diff --git a/plugins/org.eclipse.acceleo.aql.ls.debug/src/org/eclipse/acceleo/aql/ls/debug/AcceleoDebugger.java b/plugins/org.eclipse.acceleo.aql.ls.debug/src/org/eclipse/acceleo/aql/ls/debug/AcceleoDebugger.java
index 8813229..4f04a64 100644
--- a/plugins/org.eclipse.acceleo.aql.ls.debug/src/org/eclipse/acceleo/aql/ls/debug/AcceleoDebugger.java
+++ b/plugins/org.eclipse.acceleo.aql.ls.debug/src/org/eclipse/acceleo/aql/ls/debug/AcceleoDebugger.java
@@ -30,7 +30,6 @@
 import org.eclipse.acceleo.aql.AcceleoUtil;
 import org.eclipse.acceleo.aql.IAcceleoEnvironment;
 import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
-import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
 import org.eclipse.acceleo.aql.ide.AcceleoPlugin;
 import org.eclipse.acceleo.aql.parser.AcceleoAstResult;
 import org.eclipse.acceleo.aql.parser.AcceleoParser;
@@ -234,7 +233,7 @@
 				AcceleoPlugin.getPlugin().getClass().getClassLoader(), project,
 				AcceleoParser.QUALIFIER_SEPARATOR);
 		final IQualifiedNameQueryEnvironment queryEnvironment = new QualifiedNameQueryEnvironment(resolver);
-		environment = new AcceleoEnvironment(queryEnvironment, new DefaultGenerationStrategy());
+		environment = new AcceleoEnvironment(queryEnvironment);
 		for (String nsURI : new ArrayList<String>(EPackage.Registry.INSTANCE.keySet())) {
 			registerEPackage(queryEnvironment, EPackage.Registry.INSTANCE.getEPackage(nsURI));
 		}
diff --git a/plugins/org.eclipse.acceleo.aql.ls/src/org/eclipse/acceleo/aql/ls/services/textdocument/AcceleoTextDocument.java b/plugins/org.eclipse.acceleo.aql.ls/src/org/eclipse/acceleo/aql/ls/services/textdocument/AcceleoTextDocument.java
index 18de02d..ea4d278 100644
--- a/plugins/org.eclipse.acceleo.aql.ls/src/org/eclipse/acceleo/aql/ls/services/textdocument/AcceleoTextDocument.java
+++ b/plugins/org.eclipse.acceleo.aql.ls/src/org/eclipse/acceleo/aql/ls/services/textdocument/AcceleoTextDocument.java
@@ -178,7 +178,7 @@
 
 		final IQualifiedNameQueryEnvironment queryEnvironment = new QualifiedNameQueryEnvironment(getProject()
 				.getResolver());
-		acceleoEnvironment = new AcceleoEnvironment(queryEnvironment, null);
+		acceleoEnvironment = new AcceleoEnvironment(queryEnvironment);
 
 		for (Metamodel metamodel : parsingResult.getModule().getMetamodels()) {
 			if (metamodel.getReferencedPackage() != null) {
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoEnvironment.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoEnvironment.java
index e75c707..e6358f1 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoEnvironment.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoEnvironment.java
@@ -10,17 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.aql;
 
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.ArrayDeque;
-import java.util.Deque;
-
-import org.eclipse.acceleo.OpenModeKind;
 import org.eclipse.acceleo.aql.evaluation.GenerationResult;
-import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoGenerationStrategy;
-import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoWriter;
 import org.eclipse.acceleo.query.runtime.namespace.IQualifiedNameQueryEnvironment;
-import org.eclipse.emf.common.util.URI;
 
 /**
  * This environment will keep track of Acceleo's evaluation context. TODO doc.
@@ -32,12 +23,6 @@
 	/** The AQL environment that will be used to evaluate aql expressions from this Acceleo context. */
 	private IQualifiedNameQueryEnvironment aqlEnvironment;
 
-	/** This will hold the writer stack for the file blocks. */
-	private final Deque<IAcceleoWriter> writers = new ArrayDeque<IAcceleoWriter>();
-
-	/** The current generation strategy. */
-	private final IAcceleoGenerationStrategy generationStrategy;
-
 	/**
 	 * The {@link GenerationResult}.
 	 */
@@ -48,13 +33,8 @@
 	 * 
 	 * @param aqlEnvironment
 	 *            the {@link IQualifiedNameQueryEnvironment}
-	 * @param generationStrategy
-	 *            the {@link IAcceleoGenerationStrategy}
 	 */
-	public AcceleoEnvironment(IQualifiedNameQueryEnvironment aqlEnvironment,
-			IAcceleoGenerationStrategy generationStrategy) {
-		this.generationStrategy = generationStrategy;
-
+	public AcceleoEnvironment(IQualifiedNameQueryEnvironment aqlEnvironment) {
 		this.aqlEnvironment = aqlEnvironment;
 		/* FIXME we need a cross reference provider, and we need to make it configurable */
 		org.eclipse.acceleo.query.runtime.Query.configureEnvironment(aqlEnvironment, null, null);
@@ -66,27 +46,6 @@
 	}
 
 	@Override
-	public void openWriter(URI uri, OpenModeKind openMode, Charset charset, String lineDelimiter)
-			throws IOException {
-		final IAcceleoWriter writer = generationStrategy.createWriterFor(uri, openMode, charset,
-				lineDelimiter);
-		writers.addLast(writer);
-		generationResult.getGeneratedFiles().add(uri);
-	}
-
-	@Override
-	public void closeWriter() throws IOException {
-		final IAcceleoWriter writer = writers.removeLast();
-		writer.close();
-	}
-
-	@Override
-	public void write(String text) throws IOException {
-		IAcceleoWriter writer = writers.peekLast();
-		writer.append(text);
-	}
-
-	@Override
 	public GenerationResult getGenerationResult() {
 		return generationResult;
 	}
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoUtil.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoUtil.java
index 3d2d412..467d588 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoUtil.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/AcceleoUtil.java
@@ -23,6 +23,7 @@
 import org.eclipse.acceleo.ModuleElement;
 import org.eclipse.acceleo.Template;
 import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
+import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
 import org.eclipse.acceleo.query.ast.EClassifierTypeLiteral;
 import org.eclipse.acceleo.query.runtime.IQueryEnvironment;
 import org.eclipse.acceleo.query.services.EObjectServices;
@@ -153,7 +154,7 @@
 			final Map<String, Object> variables = new HashMap<String, Object>();
 			for (EObject value : values) {
 				variables.put(parameterName, value);
-				evaluator.generate(module, variables, destination);
+				evaluator.generate(module, variables, new DefaultGenerationStrategy(), destination);
 			}
 		}
 	}
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/IAcceleoEnvironment.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/IAcceleoEnvironment.java
index ccb8828..9426285 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/IAcceleoEnvironment.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/IAcceleoEnvironment.java
@@ -10,13 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.aql;
 
-import java.io.IOException;
-import java.nio.charset.Charset;
-
-import org.eclipse.acceleo.OpenModeKind;
 import org.eclipse.acceleo.aql.evaluation.GenerationResult;
 import org.eclipse.acceleo.query.runtime.namespace.IQualifiedNameQueryEnvironment;
-import org.eclipse.emf.common.util.URI;
 
 /**
  * Acceleo environment.
@@ -33,41 +28,6 @@
 	IQualifiedNameQueryEnvironment getQueryEnvironment();
 
 	/**
-	 * Opens a writer for the given file uri.
-	 * 
-	 * @param uri
-	 *            The {@link URI} for which we need a writer.
-	 * @param openMode
-	 *            The mode in which to open the file.
-	 * @param charset
-	 *            The {@link Charset} for the target file.
-	 * @param lineDelimiter
-	 *            Line delimiter that should be used for that file.
-	 * @throws IOException
-	 *             if the writed can't be opened
-	 */
-	void openWriter(URI uri, OpenModeKind openMode, Charset charset, String lineDelimiter) throws IOException;
-
-	/**
-	 * Closes the last {@link #openWriter(String, OpenModeKind, String, String) opened} writer.
-	 * 
-	 * @throws IOException
-	 *             if the writer can't be closed
-	 */
-	void closeWriter() throws IOException;
-
-	/**
-	 * Writes the given {@link String} to the last {@link #openWriter(String, OpenModeKind, String, String)
-	 * opened} writer.
-	 * 
-	 * @param text
-	 *            the text to write
-	 * @throws IOException
-	 *             if the writer can't be written
-	 */
-	void write(String text) throws IOException;
-
-	/**
 	 * Gets the {@link GenerationResult}.
 	 * 
 	 * @return the {@link GenerationResult}
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/AcceleoEvaluator.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/AcceleoEvaluator.java
index a85e9e2..37fcc93 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/AcceleoEvaluator.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/AcceleoEvaluator.java
@@ -46,6 +46,8 @@
 import org.eclipse.acceleo.TextStatement;
 import org.eclipse.acceleo.aql.AcceleoUtil;
 import org.eclipse.acceleo.aql.IAcceleoEnvironment;
+import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoGenerationStrategy;
+import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoWriter;
 import org.eclipse.acceleo.query.parser.AstResult;
 import org.eclipse.acceleo.query.runtime.EvaluationResult;
 import org.eclipse.acceleo.query.runtime.IQueryEnvironment;
@@ -119,6 +121,12 @@
 	 */
 	private URI destination;
 
+	/** This will hold the writer stack for the file blocks. */
+	private final Deque<IAcceleoWriter> writers = new ArrayDeque<IAcceleoWriter>();
+
+	/** The current generation strategy. */
+	private IAcceleoGenerationStrategy generationStrategy;
+
 	/**
 	 * Constructor.
 	 * 
@@ -128,6 +136,7 @@
 	public AcceleoEvaluator(AcceleoEvaluator other) {
 		this(other.environment, other.lookupEngine);
 		destination = other.destination;
+		generationStrategy = other.generationStrategy;
 	}
 
 	/**
@@ -152,15 +161,19 @@
 	 *            the {@link ASTNode} to generate
 	 * @param variables
 	 *            the variables
+	 * @param strategy
+	 *            the IAcceleoGenerationStrategy
 	 * @param destinationURI
 	 *            the destination {@link URI}
 	 * @return the generated {@link Object}, can be <code>null</code>
 	 */
-	public Object generate(ASTNode node, Map<String, Object> variables, URI destinationURI) {
+	public Object generate(ASTNode node, Map<String, Object> variables, IAcceleoGenerationStrategy strategy,
+			URI destinationURI) {
 
 		final Object res;
 
 		destination = destinationURI;
+		generationStrategy = strategy;
 		lastLineOfLastStatement = "";
 		pushVariables(variables);
 		try {
@@ -511,15 +524,15 @@
 			final URI uri = URI.createURI(toString(uriObject), true).resolve(destination);
 			try {
 				// FIXME line delimiter
-				environment.openWriter(uri, mode, charset, NEW_LINE);
+				openWriter(uri, mode, charset, NEW_LINE);
 				lastLineOfLastStatement = "";
 				pushIndentation(fileStatement.getBody(), lastLineOfLastStatement);
 				try {
 					final String content = (String)doSwitch(fileStatement.getBody());
-					environment.write(content);
+					write(content);
 				} finally {
 					popIndentation();
-					environment.closeWriter();
+					closeWriter();
 				}
 			} catch (IOException e) {
 				final BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.ERROR, ID, 0, e
@@ -535,6 +548,53 @@
 	}
 
 	/**
+	 * Opens a writer for the given file uri.
+	 * 
+	 * @param uri
+	 *            The {@link URI} for which we need a writer.
+	 * @param openMode
+	 *            The mode in which to open the file.
+	 * @param charset
+	 *            The {@link Charset} for the target file.
+	 * @param lineDelimiter
+	 *            Line delimiter that should be used for that file.
+	 * @throws IOException
+	 *             if the writed can't be opened
+	 */
+	private void openWriter(URI uri, OpenModeKind openMode, Charset charset, String lineDelimiter)
+			throws IOException {
+		final IAcceleoWriter writer = generationStrategy.createWriterFor(uri, openMode, charset,
+				lineDelimiter);
+		writers.addLast(writer);
+		environment.getGenerationResult().getGeneratedFiles().add(uri);
+	}
+
+	/**
+	 * Closes the last {@link #openWriter(String, OpenModeKind, String, String) opened} writer.
+	 * 
+	 * @throws IOException
+	 *             if the writer can't be closed
+	 */
+	private void closeWriter() throws IOException {
+		final IAcceleoWriter writer = writers.removeLast();
+		writer.close();
+	}
+
+	/**
+	 * Writes the given {@link String} to the last {@link #openWriter(String, OpenModeKind, String, String)
+	 * opened} writer.
+	 * 
+	 * @param text
+	 *            the text to write
+	 * @throws IOException
+	 *             if the writer can't be written
+	 */
+	private void write(String text) throws IOException {
+		IAcceleoWriter writer = writers.peekLast();
+		writer.append(text);
+	}
+
+	/**
 	 * Gets the {@link Charset} of the given {@link FileStatement}.
 	 * 
 	 * @param fileStatement
@@ -692,4 +752,13 @@
 		return destination;
 	}
 
+	/**
+	 * Gets the {@link IAcceleoGenerationStrategy}.
+	 * 
+	 * @return the {@link IAcceleoGenerationStrategy}
+	 */
+	public IAcceleoGenerationStrategy getGenerationStrategy() {
+		return generationStrategy;
+	}
+
 }
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java
index 18b02bf..3a6449a 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java
@@ -102,7 +102,8 @@
 		}
 
 		final AcceleoEvaluator evaluator = getEvaluator();
-		return evaluator.generate(getOrigin(), variables, evaluator.getDestination());
+		return evaluator.generate(getOrigin(), variables, evaluator.getGenerationStrategy(), evaluator
+				.getDestination());
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java
index 664fe09..146c963 100644
--- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java
+++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java
@@ -100,7 +100,8 @@
 		}
 
 		final AcceleoEvaluator evaluator = getEvaluator();
-		return evaluator.generate(getOrigin(), variables, evaluator.getDestination());
+		return evaluator.generate(getOrigin(), variables, evaluator.getGenerationStrategy(), evaluator
+				.getDestination());
 	}
 
 	@Override
diff --git a/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/completion/CompletionTests.java b/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/completion/CompletionTests.java
index e6c0ff4..900b638 100644
--- a/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/completion/CompletionTests.java
+++ b/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/completion/CompletionTests.java
@@ -35,7 +35,6 @@
 import org.eclipse.acceleo.aql.completion.AcceleoCompletor;
 import org.eclipse.acceleo.aql.completion.proposals.AcceleoCompletionProposal;
 import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
-import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
 import org.eclipse.acceleo.aql.parser.AcceleoAstResult;
 import org.eclipse.acceleo.aql.parser.AcceleoParser;
 import org.eclipse.acceleo.aql.parser.ModuleLoader;
@@ -122,8 +121,7 @@
 		final IQualifiedNameResolver resolver = new ClassLoaderQualifiedNameResolver(getClass()
 				.getClassLoader(), AcceleoParser.QUALIFIER_SEPARATOR);
 		final IQualifiedNameQueryEnvironment queryEnvironment = new QualifiedNameQueryEnvironment(resolver);
-		final IAcceleoEnvironment acceleoEnvironment = new AcceleoEnvironment(queryEnvironment,
-				new DefaultGenerationStrategy());
+		final IAcceleoEnvironment acceleoEnvironment = new AcceleoEnvironment(queryEnvironment);
 
 		final AcceleoEvaluator evaluator = new AcceleoEvaluator(acceleoEnvironment, queryEnvironment
 				.getLookupEngine());
diff --git a/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/utils/AbstractLanguageTestSuite.java b/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/utils/AbstractLanguageTestSuite.java
index b6d2cf8..41d4759 100644
--- a/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/utils/AbstractLanguageTestSuite.java
+++ b/tests/org.eclipse.acceleo.aql.tests/src/org/eclipse/acceleo/tests/utils/AbstractLanguageTestSuite.java
@@ -37,7 +37,6 @@
 import org.eclipse.acceleo.aql.AcceleoEnvironment;
 import org.eclipse.acceleo.aql.IAcceleoEnvironment;
 import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
-import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
 import org.eclipse.acceleo.aql.parser.AcceleoAstResult;
 import org.eclipse.acceleo.aql.parser.AcceleoParser;
 import org.eclipse.acceleo.aql.parser.ModuleLoader;
@@ -144,7 +143,7 @@
 		final IQualifiedNameResolver resolver = new ClassLoaderQualifiedNameResolver(classLoader,
 				AcceleoParser.QUALIFIER_SEPARATOR);
 		final IQualifiedNameQueryEnvironment queryEnvironment = new QualifiedNameQueryEnvironment(resolver);
-		this.environment = new AcceleoEnvironment(queryEnvironment, new DefaultGenerationStrategy());
+		this.environment = new AcceleoEnvironment(queryEnvironment);
 
 		evaluator = new AcceleoEvaluator(this.environment, queryEnvironment.getLookupEngine());
 		resolver.addLoader(new ModuleLoader(new AcceleoParser(), evaluator));