All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.poshi.runner.logger.XMLLoggerHandler Maven / Gradle / Ivy

There is a newer version: 1.0.496
Show newest version
/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.poshi.runner.logger;

import com.liferay.poshi.runner.PoshiRunnerContext;
import com.liferay.poshi.runner.PoshiRunnerGetterUtil;
import com.liferay.poshi.runner.PoshiRunnerStackTraceUtil;
import com.liferay.poshi.runner.exception.PoshiRunnerLoggerException;
import com.liferay.poshi.runner.util.HtmlUtil;
import com.liferay.poshi.runner.util.PropsValues;
import com.liferay.poshi.runner.util.Validator;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Element;

/**
 * @author Michael Hashimoto
 */
public final class XMLLoggerHandler {

	public static void generateXMLLog(String classCommandName)
		throws PoshiRunnerLoggerException {

		try {
			_xmlLogLoggerElement = new LoggerElement("xmlLogContainer");

			_xmlLogLoggerElement.setClassName("xml-log-container");
			_xmlLogLoggerElement.setName("ul");

			LoggerElement headerLoggerElement = new LoggerElement();

			headerLoggerElement.setClassName("header");
			headerLoggerElement.setName("li");

			LoggerElement lineContainerLoggerElement = new LoggerElement();

			lineContainerLoggerElement.setClassName("line-container");
			lineContainerLoggerElement.setID(null);
			lineContainerLoggerElement.setName("div");

			LoggerElement lineLoggerElement = new LoggerElement();

			lineLoggerElement.setClassName("test-case-command");
			lineLoggerElement.setID(null);
			lineLoggerElement.setName("h3");
			lineLoggerElement.setText(classCommandName);

			lineContainerLoggerElement.addChildLoggerElement(lineLoggerElement);

			headerLoggerElement.addChildLoggerElement(
				lineContainerLoggerElement);

			LoggerElement childContainerLoggerElement = new LoggerElement();

			childContainerLoggerElement.setClassName("child-container");
			childContainerLoggerElement.setID(null);
			childContainerLoggerElement.setName("ul");

			String className =
				PoshiRunnerGetterUtil.getClassNameFromClassCommandName(
					classCommandName);

			Element setUpElement = PoshiRunnerContext.getTestCaseCommandElement(
				className + "#set-up");

			if (setUpElement != null) {
				PoshiRunnerStackTraceUtil.startStackTrace(
					className + "#set-up", "test-case");

				childContainerLoggerElement.addChildLoggerElement(
					_getLoggerElementFromElement(setUpElement));

				PoshiRunnerStackTraceUtil.emptyStackTrace();
			}

			PoshiRunnerStackTraceUtil.startStackTrace(
				classCommandName, "test-case");

			childContainerLoggerElement.addChildLoggerElement(
				_getLoggerElementFromElement(
					PoshiRunnerContext.getTestCaseCommandElement(
						classCommandName)));

			PoshiRunnerStackTraceUtil.emptyStackTrace();

			Element tearDownElement =
				PoshiRunnerContext.getTestCaseCommandElement(
					className + "#tear-down");

			if (tearDownElement != null) {
				PoshiRunnerStackTraceUtil.startStackTrace(
					className + "#tear-down", "test-case");

				childContainerLoggerElement.addChildLoggerElement(
					_getLoggerElementFromElement(tearDownElement));

				PoshiRunnerStackTraceUtil.emptyStackTrace();
			}

			headerLoggerElement.addChildLoggerElement(
				childContainerLoggerElement);

			_xmlLogLoggerElement.addChildLoggerElement(headerLoggerElement);
		}
		catch (Throwable t) {
			throw new PoshiRunnerLoggerException(t.getMessage(), t);
		}
	}

	public static LoggerElement getXMLLoggerElement(String stackTrace) {
		return _loggerElements.get(stackTrace);
	}

	public static String getXMLLogText() {
		return _xmlLogLoggerElement.toString();
	}

	public static void updateStatus(Element element, String status) {
		PoshiRunnerStackTraceUtil.setCurrentElement(element);

		String stackTrace = PoshiRunnerStackTraceUtil.getSimpleStackTrace();

		if (stackTrace.contains(".function")) {
			return;
		}

		LoggerElement loggerElement = getXMLLoggerElement(stackTrace);

		loggerElement.setAttribute("data-status01", status);

		if (status.equals("conditional-fail") || status.equals("fail") ||
			status.equals("pass")) {

			LoggerUtil.executeJavaScript(
				"loggerInterface.fire('line-trigger', '" +
					loggerElement.getID() + "', false)");
		}
		else if (status.equals("pending")) {
			LoggerUtil.executeJavaScript(
				"loggerInterface.fire('line-trigger', '" +
					loggerElement.getID() + "', true)");
		}
	}

	private static LoggerElement _getBtnContainerLoggerElement(
		Element element) {

		LoggerElement btnContainerLoggerElement = new LoggerElement();

		btnContainerLoggerElement.setClassName("btn-container");
		btnContainerLoggerElement.setName("div");

		StringBuilder sb = new StringBuilder();

		sb.append(
			_getLineNumberItemText(element.attributeValue("line-number")));

		List childElements = element.elements();

		if ((!childElements.isEmpty() && !_isExecutingFunction(element) &&
			 !_isExecutingGroovyScript(element) &&
			 !_isExecutingMethod(element)) ||
			_isExecutingMacro(element) || _isExecutingTestCase(element)) {

			sb.append(_getBtnItemText("btn-collapse"));
		}

		if (!childElements.isEmpty() &&
			(_isExecutingFunction(element) ||
			 _isExecutingGroovyScript(element) ||
			 _isExecutingMacro(element) || _isExecutingTestCase(element) ||
			 _isExecutingMethod(element))) {

			sb.append(_getBtnItemText("btn-var"));
		}

		btnContainerLoggerElement.setText(sb.toString());

		return btnContainerLoggerElement;
	}

	private static String _getBtnItemText(String className) {
		LoggerElement loggerElement = new LoggerElement();

		if (className.equals("btn-collapse")) {
			loggerElement.setAttribute(
				"data-btnlinkid", "collapse-" + _btnLinkCollapseId);
		}
		else if (className.equals("btn-var")) {
			loggerElement.setAttribute(
				"data-btnlinkid", "var-" + _btnLinkVarId);
		}

		loggerElement.setClassName("btn " + className);
		loggerElement.setID(null);
		loggerElement.setName("button");

		return loggerElement.toString();
	}

	private static LoggerElement _getChildContainerLoggerElement()
		throws Exception {

		return _getChildContainerLoggerElement(null, null);
	}

	private static LoggerElement _getChildContainerLoggerElement(
			Element element)
		throws Exception {

		return _getChildContainerLoggerElement(element, null);
	}

	private static LoggerElement _getChildContainerLoggerElement(
			Element element, Element rootElement)
		throws Exception {

		LoggerElement loggerElement = new LoggerElement();

		loggerElement.setAttribute(
			"data-btnlinkid", "collapse-" + _btnLinkCollapseId);

		loggerElement.setClassName("child-container collapse collapsible");
		loggerElement.setName("ul");

		if (rootElement != null) {
			List rootVarElements = rootElement.elements("var");

			for (Element rootVarElement : rootVarElements) {
				loggerElement.addChildLoggerElement(
					_getVarLoggerElement(rootVarElement));
			}
		}

		if (element != null) {
			List childElements = element.elements();

			for (Element childElement : childElements) {
				String childElementName = childElement.getName();

				if (childElementName.equals("description") ||
					childElementName.equals("echo")) {

					loggerElement.addChildLoggerElement(
						_getEchoLoggerElement(childElement));
				}
				else if (childElementName.equals("execute")) {
					if (childElement.attributeValue("function") != null) {
						loggerElement.addChildLoggerElement(
							_getFunctionExecuteLoggerElement(childElement));
					}
					else if (childElement.attributeValue("groovy-script") !=
								null) {

						loggerElement.addChildLoggerElement(
							_getGroovyScriptLoggerElement(childElement));
					}
					else if (childElement.attributeValue("macro") != null) {
						loggerElement.addChildLoggerElement(
							_getMacroExecuteLoggerElement(
								childElement, "macro"));
					}
					else if (Validator.isNotNull(
								childElement.attributeValue("macro-desktop")) &&
							 !PropsValues.MOBILE_BROWSER) {

						loggerElement.addChildLoggerElement(
							_getMacroExecuteLoggerElement(
								childElement, "macro-desktop"));
					}
					else if (Validator.isNotNull(
								childElement.attributeValue("macro-mobile")) &&
							 PropsValues.MOBILE_BROWSER) {

						loggerElement.addChildLoggerElement(
							_getMacroExecuteLoggerElement(
								childElement, "macro-mobile"));
					}
					else if (childElement.attributeValue("method") != null) {
						loggerElement.addChildLoggerElement(
							_getMethodExecuteLoggerElement(childElement));
					}
					else if (childElement.attributeValue("test-case") != null) {
						loggerElement.addChildLoggerElement(
							_getTestCaseExecuteLoggerElement(childElement));
					}
				}
				else if (childElementName.equals("fail")) {
					loggerElement.addChildLoggerElement(
						_getFailLoggerElement(childElement));
				}
				else if (childElementName.equals("for") ||
						 childElementName.equals("task")) {

					loggerElement.addChildLoggerElement(
						_getForLoggerElement(childElement));
				}
				else if (childElementName.equals("if")) {
					loggerElement.addChildLoggerElement(
						_getIfLoggerElement(childElement));
				}
				else if (childElementName.equals("return")) {
					loggerElement.addChildLoggerElement(
						_getReturnLoggerElement(childElement));
				}
				else if (childElementName.equals("var")) {
					loggerElement.addChildLoggerElement(
						_getVarLoggerElement(childElement));
				}
				else if (childElementName.equals("while")) {
					loggerElement.addChildLoggerElement(
						_getWhileLoggerElement(childElement));
				}
			}
		}

		return loggerElement;
	}

	private static LoggerElement _getClosingLineContainerLoggerElement(
		Element element) {

		LoggerElement closingLineContainerLoggerElement = new LoggerElement();

		closingLineContainerLoggerElement.setClassName("line-container");
		closingLineContainerLoggerElement.setName("div");

		StringBuilder sb = new StringBuilder();

		sb.append(_getLineItemText("misc", "</"));
		sb.append(_getLineItemText("action-type", element.getName()));
		sb.append(_getLineItemText("misc", ">"));

		closingLineContainerLoggerElement.setText(sb.toString());

		return closingLineContainerLoggerElement;
	}

	private static LoggerElement _getConditionalLoggerElement(Element element)
		throws Exception {

		LoggerElement loggerElement = null;

		if (_isExecutingFunction(element)) {
			loggerElement = _getLineGroupLoggerElement(
				"conditional-function", element);
		}
		else {
			loggerElement = _getLineGroupLoggerElement("conditional", element);
		}

		List childElements = element.elements();

		if (!childElements.isEmpty()) {
			LoggerElement childContainerLoggerElement =
				_getChildContainerLoggerElement();

			for (Element childElement : childElements) {
				childContainerLoggerElement.addChildLoggerElement(
					_getConditionalLoggerElement(childElement));
			}

			loggerElement.addChildLoggerElement(childContainerLoggerElement);
			loggerElement.addChildLoggerElement(
				_getClosingLineContainerLoggerElement(element));
		}

		return loggerElement;
	}

	private static LoggerElement _getEchoLoggerElement(Element element) {
		return _getLineGroupLoggerElement("echo", element);
	}

	private static LoggerElement _getFailLoggerElement(Element element) {
		return _getLineGroupLoggerElement(element);
	}

	private static LoggerElement _getForLoggerElement(Element element)
		throws Exception {

		return _getLoggerElementFromElement(element);
	}

	private static LoggerElement _getFunctionExecuteLoggerElement(
		Element element) {

		return _getLineGroupLoggerElement("function", element);
	}

	private static LoggerElement _getGroovyScriptLoggerElement(
		Element element) {

		return _getLineGroupLoggerElement("groovy-script", element);
	}

	private static LoggerElement _getIfChildContainerLoggerElement(
			Element element)
		throws Exception {

		LoggerElement loggerElement = _getChildContainerLoggerElement();

		List childElements = element.elements();

		Element conditionElement = childElements.get(0);

		loggerElement.addChildLoggerElement(
			_getConditionalLoggerElement(conditionElement));

		Element thenElement = element.element("then");

		loggerElement.addChildLoggerElement(
			_getLoggerElementFromElement(thenElement));

		List elseIfElements = element.elements("elseif");

		for (Element elseIfElement : elseIfElements) {
			loggerElement.addChildLoggerElement(
				_getIfLoggerElement(elseIfElement));
		}

		Element elseElement = element.element("else");

		if (elseElement != null) {
			loggerElement.addChildLoggerElement(
				_getLoggerElementFromElement(elseElement));
		}

		return loggerElement;
	}

	private static LoggerElement _getIfLoggerElement(Element element)
		throws Exception {

		LoggerElement loggerElement = _getLineGroupLoggerElement(
			"conditional", element);

		loggerElement.addChildLoggerElement(
			_getIfChildContainerLoggerElement(element));
		loggerElement.addChildLoggerElement(
			_getClosingLineContainerLoggerElement(element));

		return loggerElement;
	}

	private static LoggerElement _getLineContainerLoggerElement(
		Element element) {

		LoggerElement lineContainerLoggerElement = new LoggerElement();

		lineContainerLoggerElement.setClassName("line-container");
		lineContainerLoggerElement.setName("div");

		if (element.attributeValue("macro") != null) {
			lineContainerLoggerElement.setAttribute(
				"onmouseover", "macroHover(this, true)");
			lineContainerLoggerElement.setAttribute(
				"onmouseout", "macroHover(this, false)");
		}

		StringBuilder sb = new StringBuilder();

		sb.append(_getLineItemText("misc", "<"));
		sb.append(_getLineItemText("action-type", element.getName()));

		List attributes = element.attributes();

		for (Attribute attribute : attributes) {
			String attributeName = attribute.getName();

			if (attributeName.equals("line-number")) {
				continue;
			}

			sb.append(_getLineItemText("tag-type", attributeName));
			sb.append(_getLineItemText("misc", "="));
			sb.append(_getLineItemText("misc quote", "\""));
			sb.append(_getLineItemText("name", attribute.getValue()));
			sb.append(_getLineItemText("misc quote", "\""));
		}

		List elements = element.elements();

		String innerText = element.getText();

		innerText = innerText.trim();

		if (elements.isEmpty() && Validator.isNull(innerText)) {
			sb.append(_getLineItemText("misc", "/>"));
		}
		else {
			sb.append(_getLineItemText("misc", ">"));
		}

		if (Validator.isNotNull(innerText)) {
			sb.append(_getLineItemText("name", HtmlUtil.escape(innerText)));
			sb.append(_getLineItemText("misc", "</"));
			sb.append(_getLineItemText("action-type", element.getName()));
			sb.append(_getLineItemText("misc", ">"));
		}

		lineContainerLoggerElement.setText(sb.toString());

		String elementName = element.getName();

		if (elementName.equals("execute") && !elements.isEmpty()) {
			lineContainerLoggerElement.addChildLoggerElement(
				_getParameterContainerLoggerElement(element));
		}

		return lineContainerLoggerElement;
	}

	private static LoggerElement _getLineGroupLoggerElement(Element element) {
		return _getLineGroupLoggerElement(null, element);
	}

	private static LoggerElement _getLineGroupLoggerElement(
		String className, Element element) {

		_btnLinkCollapseId++;
		_btnLinkVarId++;

		PoshiRunnerStackTraceUtil.setCurrentElement(element);

		LoggerElement loggerElement = new LoggerElement();

		loggerElement.setClassName("line-group");
		loggerElement.setName("li");

		if (Validator.isNotNull(className)) {
			loggerElement.addClassName(className);
		}

		loggerElement.addChildLoggerElement(
			_getBtnContainerLoggerElement(element));
		loggerElement.addChildLoggerElement(
			_getLineContainerLoggerElement(element));

		loggerElement.setWrittenToLogger(true);

		_loggerElements.put(
			PoshiRunnerStackTraceUtil.getSimpleStackTrace(), loggerElement);

		return loggerElement;
	}

	private static String _getLineItemText(String className, String text) {
		LoggerElement loggerElement = new LoggerElement();

		loggerElement.setClassName(className);
		loggerElement.setID(null);
		loggerElement.setName("span");
		loggerElement.setText(text);

		return loggerElement.toString();
	}

	private static LoggerElement _getLineNumberItem(String lineNumber) {
		LoggerElement loggerElement = new LoggerElement();

		loggerElement.setClassName("line-number");
		loggerElement.setID(null);
		loggerElement.setName("div");
		loggerElement.setText(lineNumber);

		return loggerElement;
	}

	private static String _getLineNumberItemText(String lineNumber) {
		LoggerElement loggerElement = _getLineNumberItem(lineNumber);

		return loggerElement.toString();
	}

	private static LoggerElement _getLoggerElementFromElement(Element element)
		throws Exception {

		LoggerElement loggerElement = _getLineGroupLoggerElement(element);

		loggerElement.addChildLoggerElement(
			_getChildContainerLoggerElement(element));
		loggerElement.addChildLoggerElement(
			_getClosingLineContainerLoggerElement(element));

		return loggerElement;
	}

	private static LoggerElement _getMacroCommandLoggerElement(
			String classCommandName)
		throws Exception {

		Element commandElement = PoshiRunnerContext.getMacroCommandElement(
			classCommandName);

		String className =
			PoshiRunnerGetterUtil.getClassNameFromClassCommandName(
				classCommandName);

		Element rootElement = PoshiRunnerContext.getMacroRootElement(className);

		return _getChildContainerLoggerElement(commandElement, rootElement);
	}

	private static LoggerElement _getMacroExecuteLoggerElement(
			Element executeElement, String macroType)
		throws Exception {

		LoggerElement loggerElement = _getLineGroupLoggerElement(
			"macro", executeElement);

		String classCommandName = executeElement.attributeValue(macroType);

		PoshiRunnerStackTraceUtil.pushStackTrace(executeElement);

		loggerElement.addChildLoggerElement(
			_getMacroCommandLoggerElement(classCommandName));

		PoshiRunnerStackTraceUtil.popStackTrace();

		loggerElement.addChildLoggerElement(
			_getClosingLineContainerLoggerElement(executeElement));

		return loggerElement;
	}

	private static LoggerElement _getMethodExecuteLoggerElement(
			Element executeElement)
		throws Exception {

		return _getLineGroupLoggerElement("method", executeElement);
	}

	private static LoggerElement _getParameterContainerLoggerElement(
		Element element) {

		LoggerElement loggerElement = new LoggerElement();

		loggerElement.setAttribute("data-btnlinkid", "var-" + _btnLinkVarId);
		loggerElement.setClassName(
			"child-container collapse parameter-container");
		loggerElement.setID(null);
		loggerElement.setName("div");

		List childElements = element.elements();

		for (Element childElement : childElements) {
			loggerElement.addChildLoggerElement(
				_getLineNumberItem(childElement.attributeValue("line-number")));
			loggerElement.addChildLoggerElement(
				_getLineContainerLoggerElement(childElement));
		}

		return loggerElement;
	}

	private static LoggerElement _getReturnLoggerElement(Element element) {
		return _getLineGroupLoggerElement("return", element);
	}

	private static LoggerElement _getTestCaseCommandLoggerElement(
			String classCommandName)
		throws Exception {

		String className =
			PoshiRunnerGetterUtil.getClassNameFromClassCommandName(
				classCommandName);

		if (className.equals("super")) {
			className = PoshiRunnerGetterUtil.getExtendedTestCaseName();

			classCommandName = classCommandName.replaceFirst(
				"super", className);
		}

		Element commandElement = PoshiRunnerContext.getTestCaseCommandElement(
			classCommandName);

		Element rootElement = PoshiRunnerContext.getTestCaseRootElement(
			className);

		return _getChildContainerLoggerElement(commandElement, rootElement);
	}

	private static LoggerElement _getTestCaseExecuteLoggerElement(
			Element executeElement)
		throws Exception {

		LoggerElement loggerElement = _getLineGroupLoggerElement(
			"test-case", executeElement);

		String classCommandName = executeElement.attributeValue("test-case");

		PoshiRunnerStackTraceUtil.pushStackTrace(executeElement);

		loggerElement.addChildLoggerElement(
			_getTestCaseCommandLoggerElement(classCommandName));

		PoshiRunnerStackTraceUtil.popStackTrace();

		loggerElement.addChildLoggerElement(
			_getClosingLineContainerLoggerElement(executeElement));

		return loggerElement;
	}

	private static LoggerElement _getVarLoggerElement(Element element) {
		return _getLineGroupLoggerElement("var", element);
	}

	private static LoggerElement _getWhileLoggerElement(Element element)
		throws Exception {

		LoggerElement loggerElement = _getLineGroupLoggerElement(element);

		loggerElement.addChildLoggerElement(
			_getIfChildContainerLoggerElement(element));
		loggerElement.addChildLoggerElement(
			_getClosingLineContainerLoggerElement(element));

		return loggerElement;
	}

	private static boolean _isExecutingFunction(Element element) {
		if (element.attributeValue("function") != null) {
			return true;
		}

		return false;
	}

	private static boolean _isExecutingGroovyScript(Element element) {
		if (element.attributeValue("groovy-script") != null) {
			return true;
		}

		return false;
	}

	private static boolean _isExecutingMacro(Element element) {
		if ((element.attributeValue("macro") != null) ||
			(element.attributeValue("macro-desktop") != null) ||
			(element.attributeValue("macro-mobile") != null)) {

			return true;
		}

		return false;
	}

	private static boolean _isExecutingMethod(Element element) {
		if (element.attributeValue("method") != null) {
			return true;
		}

		return false;
	}

	private static boolean _isExecutingTestCase(Element element) {
		if (element.attributeValue("test-case") != null) {
			return true;
		}

		return false;
	}

	private static int _btnLinkCollapseId;
	private static int _btnLinkVarId;
	private static final Map _loggerElements =
		new HashMap<>();
	private static LoggerElement _xmlLogLoggerElement;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy