//Generated on Thu Jan 12 17:22:04 CET 2012 with EGF 0.6.1.qualifier
package org.eclipse.egf.portfolio.ant.javadoc;

import org.eclipse.egf.common.helper.*;
import java.util.*;
import org.eclipse.emf.ecore.*;
import org.eclipse.egf.model.pattern.*;
import org.eclipse.egf.pattern.execution.*;
import org.eclipse.egf.pattern.query.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;

public class ant {
	protected static String nl;

	public static synchronized ant create(String lineSeparator) {
		nl = lineSeparator;
		ant result = new ant();
		nl = null;
		return result;
	}

	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
	protected final String TEXT_1 = "<?xml version=\"1.0\"?>" + NL + "" + NL + "<project name=\"Javadoc Generation\" default=\"main\">" + NL + "\t<target name=\"main\">" + NL;
	protected final String TEXT_2 = "\t\t<delete dir=\"";
	protected final String TEXT_3 = "\" />";
	protected final String TEXT_4 = "\t\t<javadoc" + NL + "\t\t\tdestdir=\"";
	protected final String TEXT_5 = "\"" + NL + "\t\t\tmaxmemory=\"1024m\"" + NL + "\t\t\tsource=\"1.5\"" + NL + "\t\t\tuseexternalfile=\"true\"" + NL + "\t\t\tauthor=\"true\"" + NL + "\t\t\tversion=\"true\"" + NL + "\t\t\tuse=\"true\"" + NL + "\t\t\twindowtitle=\"Javadoc\">";
	protected final String TEXT_6 = "\t\t<link offline=\"false\" href=\"http://download.oracle.com/javase/1.5.0/docs/api/\"/> " + NL + "\t\t<link offline=\"false\" href=\"http://www.osgi.org/javadoc/r4v42/\"/> " + NL + "\t\t<link offline=\"false\" href=\"http://download.eclipse.org/modeling/emf/emf/javadoc/2.5.0/\"/> " + NL + "\t\t<link offline=\"false\" href=\"http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/\"/>";
	protected final String TEXT_7 = NL + "\t\t<fileset dir=\"";
	protected final String TEXT_8 = "\" defaultexcludes=\"true\">" + NL + "\t\t\t<include name=\"**/*.java\"/>" + NL + "\t\t</fileset>";
	protected final String TEXT_9 = NL;
	protected final String TEXT_10 = "\t</javadoc>";
	protected final String TEXT_11 = "\t</target>" + NL + "</project>" + NL + "\t";
	protected final String TEXT_12 = NL;
	protected final String TEXT_13 = NL;

	public ant() {
		//Here is the constructor
		StringBuffer stringBuffer = new StringBuffer();

		// add initialisation of the pattern variables (declaration has been already done).

	}

	public String generate(Object argument) throws Exception {
		final StringBuffer stringBuffer = new StringBuffer();

		InternalPatternContext ctx = (InternalPatternContext) argument;
		Map<String, String> queryCtx = null;
		IQuery.ParameterDescription paramDesc = null;
		Node.Container currentNode = ctx.getNode();

		if (preCondition(ctx)) {
			ctx.setNode(new Node.Container(currentNode, getClass()));
			orchestration(ctx);
		}

		ctx.setNode(currentNode);
		if (ctx.useReporter()) {
			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
		}

		stringBuffer.append(TEXT_12);
		stringBuffer.append(TEXT_13);
		return stringBuffer.toString();
	}

	public String orchestration(PatternContext ctx) throws Exception {
		InternalPatternContext ictx = (InternalPatternContext) ctx;

		method_computeVariables(new StringBuffer(), ictx);

		method_begin(new StringBuffer(), ictx);

		method_additionalBeginXml(new StringBuffer(), ictx);

		method_deleteOutput(new StringBuffer(), ictx);

		method_beginJavadoc(new StringBuffer(), ictx);

		method_javadocLinks(new StringBuffer(), ictx);

		method_javadocInput(new StringBuffer(), ictx);

		method_additionalJavadocXml(new StringBuffer(), ictx);

		method_endJavadoc(new StringBuffer(), ictx);

		method_additionalEndXml(new StringBuffer(), ictx);

		method_end(new StringBuffer(), ictx);

		return null;
	}

	protected java.lang.String outputFolderPath = null;

	public void set_outputFolderPath(java.lang.String object) {
		this.outputFolderPath = object;
	}

	protected java.util.List inputFolderPathsList = null;

	public void set_inputFolderPathsList(java.util.List object) {
		this.inputFolderPathsList = object;
	}

	public Map<String, Object> getParameters() {
		final Map<String, Object> parameters = new HashMap<String, Object>();
		return parameters;
	}

	protected void method_computeVariables(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		String inputFolderPaths = (String) ctx.getValue("inputFolderPaths");
		String outputProjectName = (String) ctx.getValue("outputProjectName");
		String outputFolderName = (String) ctx.getValue("outputFolderName");

		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

		IFolder outFolder = root.getProject(outputProjectName).getFolder(outputFolderName);
		outputFolderPath = outFolder.getLocation().toOSString();

		inputFolderPathsList = new ArrayList<String>();
		String[] split = inputFolderPaths.split(",");
		for (String inputFolderPath : split) {
			IFolder inputFolder = root.getFolder(new Path(inputFolderPath.trim()));
			if (inputFolder.exists() && inputFolder.getLocation() != null)
				inputFolderPathsList.add(inputFolder.getLocation().toOSString());
		}

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "computeVariables", stringBuffer.toString());
	}

	protected void method_begin(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_1);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "begin", stringBuffer.toString());
	}

	protected void method_additionalBeginXml(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "additionalBeginXml", stringBuffer.toString());
	}

	protected void method_deleteOutput(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_2);
		stringBuffer.append(outputFolderPath);
		stringBuffer.append(TEXT_3);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "deleteOutput", stringBuffer.toString());
	}

	protected void method_beginJavadoc(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_4);
		stringBuffer.append(outputFolderPath);
		stringBuffer.append(TEXT_5);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "beginJavadoc", stringBuffer.toString());
	}

	protected void method_javadocLinks(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_6);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "javadocLinks", stringBuffer.toString());
	}

	protected void method_javadocInput(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		for (Iterator iterator = inputFolderPathsList.iterator(); iterator.hasNext();) {
			String inputFolderPath = (String) iterator.next();

			stringBuffer.append(TEXT_7);
			stringBuffer.append(inputFolderPath);
			stringBuffer.append(TEXT_8);
		}
		stringBuffer.append(TEXT_9);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "javadocInput", stringBuffer.toString());
	}

	protected void method_additionalJavadocXml(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "additionalJavadocXml", stringBuffer.toString());
	}

	protected void method_endJavadoc(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_10);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "endJavadoc", stringBuffer.toString());
	}

	protected void method_additionalEndXml(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "additionalEndXml", stringBuffer.toString());
	}

	protected void method_end(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		stringBuffer.append(TEXT_11);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "end", stringBuffer.toString());
	}

	public boolean preCondition(PatternContext ctx) throws Exception {
		return true;
	}
}