#-------------------------------------------------------------------------------
# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------

#FindPlantuml
#-----------
#PlantUML is a diagram generation tool. It can generate various UML and non-UML
#diagrams. See: http://plantuml.com/
#
#This module checks PlantUML availability and checks if the Java runtime is
#available.
#For Windows PlantUML is distributed as a jar archive and thus there is no
#standard install location where it could be searched for.
#Most Linux distributions come with a proper PlantUML package which installs
#a shell script to easy starting PlantUML, but the location of the .jar file
#is hidden.
#Thus there is no standard location to search for the .jar file and this module
#depends on user input.
#
#This module has the following parameters:
#   PLANTUML_JAR_PATH   = variable specifying where the PlantUML java archive
#                         (plantuml.jar) can be found. If it is not defined,
#                         the environment variable with the same name is used.
#                         If both is missing, that is an error.
#
#This module defines the following variables:
#   PLANTUML_VERSION        = The version reported by "plantuml.jar -version"
#   PLANTUML_FOUND          = Was the .jar file found and sucesfuly executed.
#

include(Utils)

find_package(Java 1.8 COMPONENTS Runtime)
if(Java_Runtime_FOUND)
	#Check if the jar file is at the user defined location.
	#Prefer the cmake variable to the environment setting.
	if (NOT DEFINED PLANTUML_JAR_PATH)
		if (DEFINED ENV{PLANTUML_JAR_PATH})
			set(PLANTUML_JAR_PATH "$ENV{PLANTUML_JAR_PATH}" CACHE STRING "PLANTUML location." )
		endif()
	endif()

	if (NOT DEFINED PLANTUML_JAR_PATH)
		message(STATUS "PLANTUML_JAR_PATH variable is missing, PlantUML jar location is unknown.")
	else()
		win_fix_dir_sep(PATH PLANTUML_JAR_PATH)
		#Get plantuml version
		execute_process(COMMAND "${Java_JAVA_EXECUTABLE}" "-jar" "${PLANTUML_JAR_PATH}" "-version" OUTPUT_VARIABLE _PLANTUML_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
		#Parse plantuml output
		if(_PLANTUML_VERSION)
			if(_PLANTUML_VERSION MATCHES ".*PlantUML version ([0-9.]+).*")
				string(REGEX REPLACE ".*PlantUML version ([0-9.]+).*" "\\1" PLANTUML_VERSION "${_PLANTUML_VERSION}")
			endif()
		endif()
	endif()
endif()

#Set "standard" find module return values
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Plantuml REQUIRED_VARS PLANTUML_JAR_PATH PLANTUML_VERSION VERSION_VAR PLANTUML_VERSION)
