/*******************************************************************************
 * Copyright (c) 2010, 2012 Sean Muir and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sean Muir (JKM Software) - initial API and implementation
 *     IBM Corporation - updated use of MDHT validation APIs
 *     Christian W. Damus - refactored CDAResource, CDAUtil, CDARegistry on the new flexible XML resource (artf3367)
 *
 *******************************************************************************/
package org.eclipse.mdht.uml.cda.validate;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.mdht.uml.cda.DocumentRoot;
import org.eclipse.mdht.uml.cda.util.CDAUtil;
import org.eclipse.mdht.uml.cda.util.ValidationResult;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * Simple main validate routine used by the workspace xml instance validation in
 * the cda xml ui plugin
 *
 * Step 1 Index XML Instance Step 2 Validation Instance Step 3 write results to
 * temp file
 *
 */
public class Validate {

	public static String getPath(EObject eObject) {
		String path = "";
		while (eObject != null && !(eObject instanceof DocumentRoot)) {
			EStructuralFeature feature = eObject.eContainingFeature();
			EObject container = eObject.eContainer();
			Object value = container.eGet(feature);
			if (feature.isMany()) {
				List<?> list = (List<?>) value;
				int index = list.indexOf(eObject) + 1;
				path = "/" + feature.getName() + "[" + index + "]" + path;
			} else {
				path = "/" + feature.getName() + "[1]" + path;
			}
			eObject = eObject.eContainer();
		}
		return path;
	}

	/**
	 * arg0 = CDA input URI
	 * arg1 = output file for validation results
	 * arg3 = model qualified name for document type class, or null
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		final String DELIMITER = "~";

		CDAUtil.loadPackages();

		try {

			URI cdaURI = URI.createURI(args[0]);

			if (cdaURI.isFile()) {

				OutputStream fout = new FileOutputStream(args[1]);

				OutputStream bout = new BufferedOutputStream(fout);

				final OutputStreamWriter out = new OutputStreamWriter(bout);

				XMLReader parser = XMLReaderFactory.createXMLReader();

				// Install the Content Handler
				final XPathIndexer xpathIndexer = new XPathIndexer();

				parser.setContentHandler(xpathIndexer);

				// set the document type class, or null to discover from templateId
				String documentClassQName = null;
				if (args.length >= 3) {
					documentClassQName = args[2];
				}

				try {

					parser.parse(cdaURI.path());

					ValidationResult result = new ValidationResult();

					ResourceSet rset = CDAUtil.createResourceSet(documentClassQName);
					CDAUtil.load(rset, cdaURI, result);

					// handleError
					for (Diagnostic diagnostic : result.getErrorDiagnostics()) {
						String path = "";
						if (diagnostic.getData().size() > 0 && diagnostic.getData().get(0) instanceof EObject) {
							path = getPath((EObject) diagnostic.getData().get(0));
						}

						XPathIndexer.ElementLocationData eld = xpathIndexer.getElementLocationByPath(
							path.toUpperCase());

						try {
							if (eld != null) {
								out.write(
									"error" + DELIMITER + eld.line + DELIMITER + eld.column + DELIMITER +
											diagnostic.getMessage() + "\n");
							} else {
								out.write(
									"error" + DELIMITER + 0 + DELIMITER + 0 + DELIMITER + diagnostic.getMessage() +
											"(" + path + ")" + "\n");
							}

						} catch (IOException e) {
							e.printStackTrace();
						}
					}

					// handleInfo

					// handleWarning
					for (Diagnostic diagnostic : result.getWarningDiagnostics()) {
						String path = "";
						if (diagnostic.getData().size() > 0 && diagnostic.getData().get(0) instanceof EObject) {
							path = getPath((EObject) diagnostic.getData().get(0));

						}

						XPathIndexer.ElementLocationData eld = xpathIndexer.getElementLocationByPath(
							path.toUpperCase());

						try {
							if (eld != null) {
								out.write(
									"warning" + DELIMITER + eld.line + DELIMITER + eld.column + DELIMITER +
											diagnostic.getMessage() + "\n");
							} else {
								out.write(
									"warning" + DELIMITER + 0 + DELIMITER + 0 + DELIMITER + diagnostic.getMessage() +
											"(" + path + ")" + "\n");
							}
						} catch (IOException e) {
							e.printStackTrace();
						}
					}

				}

				catch (SAXParseException spe) {
					// Do not process because XML validation will highlight
					// issue
				} catch (Throwable t) {

					List<Throwable> list = new ArrayList<Throwable>();

					Throwable throwable = t;
					while (throwable != null && list.contains(throwable) == false) {
						list.add(throwable);
						throwable = throwable.getCause();
					}

					String rootMessage = list.get(list.size() - 1).getMessage();

					XPathIndexer.ElementLocationData eld = null;
					for (String value : rootMessage.split("'")) {

						eld = xpathIndexer.getAttributeLocationByValue(value);
						if (eld != null) {
							break;
						}
					}

					if (eld != null) {
						out.write(
							"error" + DELIMITER + eld.line + DELIMITER + eld.column + DELIMITER +
									"CDA document load error : " + rootMessage + "\n");
					} else {
						out.write(
							"error" + DELIMITER + 1 + DELIMITER + 1 + DELIMITER + "CDA document load error : " +
									rootMessage + "\n");
					}

				}

				out.flush();
				out.close();

			}

		} catch (Exception e1) {
		}

	}

}
