Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit 2a4f6e7

Browse files
committed
report invalid JVM requirement pattern in Plist key 'JVMVersion' as ERROR // resolves #50
1 parent 7b9057a commit 2a4f6e7

2 files changed

Lines changed: 205 additions & 1 deletion

File tree

src/universalJavaApplicationStub

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,9 @@ stub_logger "[Language] $LANG"
274274

275275
# French localization
276276
if [[ $LANG == fr* ]] ; then
277-
MSG_ERROR_LAUNCHING="Erreur au lancement de '${CFBundleName}'."
277+
MSG_ERROR_LAUNCHING="ERREUR au lancement de '${CFBundleName}'."
278278
MSG_MISSING_MAINCLASS="'MainClass' n'est pas spécifié.\nL'application Java ne peut pas être lancée."
279+
MSG_JVMVERSION_REQ_INVALID="La syntaxe de la version Java demandée est invalide: '%s'\nVeuillez contacter le développeur de l'application."
279280
MSG_NO_SUITABLE_JAVA="La version de Java installée sur votre système ne convient pas.\nCe programme nécessite Java %s."
280281
MSG_JAVA_VERSION_OR_LATER="ou ultérieur"
281282
MSG_JAVA_VERSION_LATEST="(dernière mise à jour)"
@@ -288,6 +289,7 @@ if [[ $LANG == fr* ]] ; then
288289
elif [[ $LANG == de* ]] ; then
289290
MSG_ERROR_LAUNCHING="FEHLER beim Starten von '${CFBundleName}'."
290291
MSG_MISSING_MAINCLASS="Die 'MainClass' ist nicht spezifiziert!\nDie Java-Anwendung kann nicht gestartet werden!"
292+
MSG_JVMVERSION_REQ_INVALID="Die Syntax der angeforderten Java-Version ist ungültig: %s\nBitte kontaktieren Sie den Entwickler der App."
291293
MSG_NO_SUITABLE_JAVA="Es wurde keine passende Java-Version auf Ihrem System gefunden!\nDieses Programm benötigt Java %s."
292294
MSG_JAVA_VERSION_OR_LATER="oder neuer"
293295
MSG_JAVA_VERSION_LATEST="(neuste Unterversion)"
@@ -300,6 +302,7 @@ elif [[ $LANG == de* ]] ; then
300302
else
301303
MSG_ERROR_LAUNCHING="ERROR launching '${CFBundleName}'."
302304
MSG_MISSING_MAINCLASS="'MainClass' isn't specified!\nJava application cannot be started!"
305+
MSG_JVMVERSION_REQ_INVALID="The syntax of the required Java version is invalid: '%s'\nPlease contact the App developer."
303306
MSG_NO_SUITABLE_JAVA="No suitable Java version found on your system!\nThis program requires Java %s."
304307
MSG_JAVA_VERSION_OR_LATER="or later"
305308
MSG_JAVA_VERSION_LATEST="(latest update)"
@@ -354,6 +357,51 @@ function get_comparable_java_version() {
354357
}
355358

356359

360+
# function 'is_valid_requirement_pattern()'
361+
#
362+
# check whether the Java requirement is a valid requirement pattern
363+
#
364+
# supported requirements are for example:
365+
# - 1.6 requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
366+
# - 1.6* requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
367+
# - 1.6+ requires Java 6 or higher [1.6, 1.6.0_45, 1.8, 9, etc.]
368+
# - 1.6.0 requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
369+
# - 1.6.0_45 requires Java 6u45 [1.6.0_45]
370+
# - 1.6.0_45+ requires Java 6u45 or higher [1.6.0_45, 1.6.0_88, 1.8, etc.]
371+
# - 9 requires Java 9 (any update) [9.0.*, 9.1, 9.3, etc.]
372+
# - 9* requires Java 9 (any update) [9.0.*, 9.1, 9.3, etc.]
373+
# - 9+ requires Java 9 or higher [9.0, 9.1, 10, etc.]
374+
# - 9.1 requires Java 9.1 (any update) [9.1.*, 9.1.2, 9.1.13, etc.]
375+
# - 9.1* requires Java 9.1 (any update) [9.1.*, 9.1.2, 9.1.13, etc.]
376+
# - 9.1+ requires Java 9.1 or higher [9.1, 9.2, 10, etc.]
377+
# - 9.1.3 requires Java 9.1.3 [9.1.3]
378+
# - 9.1.3* requires Java 9.1.3 (any update) [9.1.3]
379+
# - 9.1.3+ requires Java 9.1.3 or higher [9.1.3, 9.1.4, 9.2.*, 10, etc.]
380+
# - 10-ea requires Java 10 (early access release)
381+
#
382+
# unsupported requirement patterns are for example:
383+
# - 1.2, 1.3, 1.9 Java 2, 3 are not supported
384+
# - 1.9 Java 9 introduced a new versioning scheme
385+
# - 6u45 known versioning syntax, but unsupported
386+
# - 9-ea*, 9-ea+ early access releases paired with */+
387+
# - 9., 9.*, 9.+ version ending with a .
388+
# - 9.1., 9.1.*, 9.1.+ version ending with a .
389+
# - 9.3.5.6 4 part version number is unsupported
390+
#
391+
# @param1 a Java requirement string ('1.8+')
392+
# @return boolean exit code: 0 (is valid), 1 (is not valid)
393+
################################################################################
394+
function is_valid_requirement_pattern() {
395+
local java_req=$1
396+
# first test matches old Java versioning scheme (up to 1.8), second test matches new scheme (starting with 9)
397+
if [[ ${java_req} =~ ^1\.[4-8](\.0)?(\.0_[0-9]+)?[*+]?$ ]] || [[ ${java_req} =~ ^(9|1[0-9])(-ea|[*+]|(\.[0-9]+){1,2}[*+]?)?$ ]]; then
398+
return 0
399+
else
400+
return 1
401+
fi
402+
}
403+
404+
357405
# function 'does_java_version_satisfy_requirement()'
358406
#
359407
# this function checks whether a given java version number
@@ -433,6 +481,17 @@ if [ -n "$JAVA_HOME" ] ; then
433481
elif [ ! -z ${JVMVersion} ] ; then
434482
stub_logger "[JavaSearch] Checking for specific Java version '${JVMVersion}'"
435483

484+
# first check whether JVMVersion string is a valid requirement string
485+
if ! is_valid_requirement_pattern ${JVMVersion} ; then
486+
MSG_JVMVERSION_REQ_INVALID_EXPANDED=$(printf "${MSG_JVMVERSION_REQ_INVALID}" "${JVMVersion}")
487+
# log exit cause
488+
stub_logger "[EXIT 4] ${MSG_JVMVERSION_REQ_INVALID_EXPANDED}"
489+
# display error message with AppleScript
490+
osascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_JVMVERSION_REQ_INVALID_EXPANDED}\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1 with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"
491+
# exit with error
492+
exit 4
493+
fi
494+
436495
# first check "/usr/libexec/java_home" symlinks
437496
if [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F -v ${JVMVersion} > /dev/null 2>&1 ; then
438497
JAVACMD="`/usr/libexec/java_home -F -v ${JVMVersion} 2> /dev/null`/bin/java"

test/java-version-tester.sh

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,51 @@ function get_comparable_java_version() {
4848
}
4949

5050

51+
# function 'is_valid_requirement_pattern()'
52+
#
53+
# check whether the Java requirement is a valid requirement pattern
54+
#
55+
# supported requirements are for example:
56+
# - 1.6 requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
57+
# - 1.6* requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
58+
# - 1.6+ requires Java 6 or higher [1.6, 1.6.0_45, 1.8, 9, etc.]
59+
# - 1.6.0 requires Java 6 (any update) [1.6, 1.6.0_45, 1.6.0_88]
60+
# - 1.6.0_45 requires Java 6u45 [1.6.0_45]
61+
# - 1.6.0_45+ requires Java 6u45 or higher [1.6.0_45, 1.6.0_88, 1.8, etc.]
62+
# - 9 requires Java 9 (any update) [9.0.*, 9.1, 9.3, etc.]
63+
# - 9* requires Java 9 (any update) [9.0.*, 9.1, 9.3, etc.]
64+
# - 9+ requires Java 9 or higher [9.0, 9.1, 10, etc.]
65+
# - 9.1 requires Java 9.1 (any update) [9.1.*, 9.1.2, 9.1.13, etc.]
66+
# - 9.1* requires Java 9.1 (any update) [9.1.*, 9.1.2, 9.1.13, etc.]
67+
# - 9.1+ requires Java 9.1 or higher [9.1, 9.2, 10, etc.]
68+
# - 9.1.3 requires Java 9.1.3 [9.1.3]
69+
# - 9.1.3* requires Java 9.1.3 (any update) [9.1.3]
70+
# - 9.1.3+ requires Java 9.1.3 or higher [9.1.3, 9.1.4, 9.2.*, 10, etc.]
71+
# - 10-ea requires Java 10 (early access release)
72+
#
73+
# unsupported requirement patterns are for example:
74+
# - 1.2, 1.3, 1.9 Java 2, 3 are not supported
75+
# - 1.9 Java 9 introduced a new versioning scheme
76+
# - 6u45 known versioning syntax, but unsupported
77+
# - 9-ea*, 9-ea+ early access releases paired with */+
78+
# - 9., 9.*, 9.+ version ending with a .
79+
# - 9.1., 9.1.*, 9.1.+ version ending with a .
80+
# - 9.3.5.6 4 part version number is unsupported
81+
#
82+
# @param1 a Java requirement string ('1.8+')
83+
# @return boolean exit code: 0 (is valid), 1 (is not valid)
84+
################################################################################
85+
function is_valid_requirement_pattern() {
86+
local java_req=$1
87+
# first test matches old Java versioning scheme (up to 1.8), second test matches new scheme (starting with 9)
88+
if [[ ${java_req} =~ ^1\.[4-8](\.0)?(\.0_[0-9]+)?[*+]?$ ]] || [[ ${java_req} =~ ^(9|1[0-9])(-ea|[*+]|(\.[0-9]+){1,2}[*+]?)?$ ]]; then
89+
return 0
90+
else
91+
return 1
92+
fi
93+
}
94+
95+
5196
# function 'does_java_version_satisfy_requirement()'
5297
#
5398
# this function checks whether a given java version number
@@ -232,6 +277,106 @@ testComparable "10.10.23" "10010023"
232277
testComparable "10.10.113" "10010113"
233278

234279

280+
281+
# test function:
282+
# tests the is_valid_requirement_pattern() function
283+
##########################################################
284+
function testValidReqPattern() {
285+
local pattern=$1
286+
local expected=$2
287+
local actual=$(is_valid_requirement_pattern "$pattern" ; echo $?)
288+
if [ "$expected" == "$actual" ] ; then
289+
case $expected in
290+
0)
291+
echo "[TEST OK] [${expected}==${actual}] Requirement pattern '$pattern' is valid"
292+
;;
293+
1)
294+
echo "[TEST OK] [${expected}==${actual}] Requirement pattern '$pattern' is not valid"
295+
;;
296+
esac
297+
else
298+
echo "[TEST FAILED] [${expected}!=${actual}] Requirement ${pattern} ; Expected: ${expected} ; Actual: ${actual}"
299+
fi
300+
}
301+
302+
303+
echo ""
304+
echo ""
305+
echo "########################################################"
306+
echo "Testing function is_valid_requirement_pattern()"
307+
echo ""
308+
echo "Tests with old version scheme (valid requirements):"
309+
testValidReqPattern "1.4" "0"
310+
testValidReqPattern "1.5" "0"
311+
testValidReqPattern "1.6" "0"
312+
testValidReqPattern "1.6*" "0"
313+
testValidReqPattern "1.6+" "0"
314+
testValidReqPattern "1.6.0" "0"
315+
testValidReqPattern "1.6.0*" "0"
316+
testValidReqPattern "1.6.0+" "0"
317+
testValidReqPattern "1.6.0_45" "0"
318+
testValidReqPattern "1.6.0_45+" "0"
319+
testValidReqPattern "1.6.0_100" "0"
320+
testValidReqPattern "1.6.0_100+" "0"
321+
echo ""
322+
echo "Tests with old version scheme (invalid requirements):"
323+
testValidReqPattern "1.2" "1"
324+
testValidReqPattern "1.3" "1"
325+
testValidReqPattern "1.9" "1"
326+
testValidReqPattern "1.9*" "1"
327+
testValidReqPattern "1.9+" "1"
328+
testValidReqPattern "1.9.0_20" "1"
329+
testValidReqPattern "1.9.0_20*" "1"
330+
testValidReqPattern "1.9.0_20+" "1"
331+
testValidReqPattern "6u45" "1"
332+
echo ""
333+
echo "Tests with new version scheme (valid requirements):"
334+
testValidReqPattern "9" "0"
335+
testValidReqPattern "9*" "0"
336+
testValidReqPattern "9+" "0"
337+
testValidReqPattern "9-ea" "0"
338+
testValidReqPattern "9.1" "0"
339+
testValidReqPattern "9.1*" "0"
340+
testValidReqPattern "9.1+" "0"
341+
testValidReqPattern "9.1.3" "0"
342+
testValidReqPattern "9.1.3*" "0"
343+
testValidReqPattern "9.1.3+" "0"
344+
testValidReqPattern "9.0.13" "0"
345+
testValidReqPattern "9.11" "0"
346+
testValidReqPattern "9.11*" "0"
347+
testValidReqPattern "9.11+" "0"
348+
testValidReqPattern "9.10.23" "0"
349+
testValidReqPattern "9.10.101" "0"
350+
testValidReqPattern "10" "0"
351+
testValidReqPattern "10*" "0"
352+
testValidReqPattern "10-ea" "0"
353+
testValidReqPattern "10.1" "0"
354+
testValidReqPattern "10.1*" "0"
355+
testValidReqPattern "10.1+" "0"
356+
testValidReqPattern "10.0.1" "0"
357+
testValidReqPattern "10.0.1*" "0"
358+
testValidReqPattern "10.0.1+" "0"
359+
testValidReqPattern "10.0.13" "0"
360+
testValidReqPattern "10.1.3" "0"
361+
testValidReqPattern "10.12" "0"
362+
testValidReqPattern "10.10.23" "0"
363+
testValidReqPattern "10.10.113" "0"
364+
echo ""
365+
echo "Tests with new version scheme (invalid requirements):"
366+
testValidReqPattern "9-ea*" "1"
367+
testValidReqPattern "9-ea+" "1"
368+
testValidReqPattern "9." "1"
369+
testValidReqPattern "9.*" "1"
370+
testValidReqPattern "9.+" "1"
371+
testValidReqPattern "9.1." "1"
372+
testValidReqPattern "9.1.*" "1"
373+
testValidReqPattern "9.1.+" "1"
374+
testValidReqPattern "9.2.15." "1"
375+
testValidReqPattern "9.2.15.*" "1"
376+
testValidReqPattern "9.2.15.+" "1"
377+
testValidReqPattern "9.3.5.6" "1"
378+
379+
235380
# test function:
236381
# tests the does_java_version_satisfy_requirement() function
237382
##########################################################

0 commit comments

Comments
 (0)