/*********************************************************************************
 * Copyright (c) 2009,2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Fabien Giquel (Mia-Software) - initial API and implementation
 *    Nicolas Bros (Mia-Software) - adapted to new discovery framework (Bug 335003)
 *    Fabien Giquel (Mia-Software) - upper case files extensions are not supported (Bug 463078)
 *********************************************************************************/
package org.eclipse.modisco.jee.jsp.discoverer;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;
import org.eclipse.core.runtime.Path;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.infra.discovery.core.AbstractModelDiscoverer;
import org.eclipse.modisco.infra.discovery.core.exception.DiscoveryException;
import org.eclipse.modisco.jee.jsp.JspFactory;
import org.eclipse.modisco.jee.jsp.Model;
import org.eclipse.modisco.jee.jsp.discoverer.parser.JSPLexer;
import org.eclipse.modisco.jee.jsp.discoverer.parser.JSPParser;

public abstract class AbstractJspDiscoverer<T> extends AbstractModelDiscoverer<T> {

	public static final String JSP_FILE_EXTENSION = "jsp"; //$NON-NLS-1$
	public static final String[] EXTENSION_LIST = {
			"jsp", "jspf", "jspx", "jtpl", "jsv", "jsw", "tag", "tagf", "tagx", "htm", "html" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$
	private static ArrayList<String> extensionList = null;

	/**
	 * get the JSP Factory
	 *
	 * @return the JSP Factory
	 */
	protected static JspFactory getEFactory() {
		return JspFactory.eINSTANCE;
	}

	/** @return the list of valid extensions for a JSP */
	protected static List<String> getExtensionList() {
		if (AbstractJspDiscoverer.extensionList == null) {
			AbstractJspDiscoverer.extensionList = new ArrayList<String>();
			for (String extension : AbstractJspDiscoverer.EXTENSION_LIST) {
				AbstractJspDiscoverer.extensionList.add(extension);
			}
		}
		return AbstractJspDiscoverer.extensionList;
	}

	public static boolean isJspExtension(final String extension) {
		boolean result = false;
		if (extension != null) {
			result = getExtensionList().contains(extension.toLowerCase());
		}
		return result;
	}

	/** Discovers the given file into the given JSP model. */
	protected static void discoverFile(final File file, final Model model)
			throws DiscoveryException {
		try {
			FileInputStream inputStream = new FileInputStream(file);
			ANTLRInputStream input = new ANTLRInputStream(inputStream);
			JSPLexer lexer = new JSPLexer(input, file.getName());
			CommonTokenStream tokens = new CommonTokenStream(lexer);
			JSPParser parser = new JSPParser(tokens);
			parser.page(file.getPath(), file.getName());
			model.getPages().add(parser.page);
		} catch (OutOfMemoryError e) {
			MoDiscoLogger.logError(e, "Discovery encountered an error on \"" //$NON-NLS-1$
					+ file.getAbsolutePath() + "\".", //$NON-NLS-1$
					JspActivator.getDefault());
		} catch (Exception e) {
			throw new DiscoveryException("Error discovering JSP \"" //$NON-NLS-1$
					+ file.getAbsolutePath() + "\".", e); //$NON-NLS-1$
		}
	}

	/**
	 * Recursively discover all JSP files contained in the given directory into the given JSP model
	 *
	 * @throws DiscoveryException
	 */
	protected static void discoverDirectory(final File directory, final Model model)
			throws DiscoveryException {
		if (!directory.isDirectory()) {
			throw new IllegalArgumentException("not a directory"); //$NON-NLS-1$
		}
		File[] files = directory.listFiles();
		for (File file : files) {
			if (file.isDirectory()) {
				discoverDirectory(file, model);
			} else {
				String fileExtension = new Path(file.getPath()).getFileExtension();
				if (AbstractJspDiscoverer.isJspExtension(fileExtension)) {
					discoverFile(file, model);
				}
			}
		}
	}
}
