Package: javatools
Severity: wishlist
Tags: patch
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu mantic ubuntu-patch
X-Debbugs-Cc: vladimir.pe...@canonical.com

Dear Maintainer,

Java 21 retires release level 7 and requires release level 8. This patch allows
to set release level to 8 if Java is 21 or later.

Changes:
  * jh_build: check Java version to set the minimum release level.
  * d/control: javahelper now depends on jarwrapper to check Java version.
  * d/rules: use release level 8.


Thanks for considering the patch.


-- System Information:
Debian Release: bookworm/sid
  APT prefers lunar-updates
  APT policy: (500, 'lunar-updates'), (500, 'lunar-security'), (500, 'lunar'), 
(100, 'lunar-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 6.2.0-24-generic (SMP w/32 CPU threads; PREEMPT)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru javatools-0.78/debian/control javatools-0.78ubuntu1/debian/control
--- javatools-0.78/debian/control       2021-02-05 00:05:53.000000000 +1300
+++ javatools-0.78ubuntu1/debian/control        2023-05-04 19:27:54.000000000 
+1200
@@ -36,6 +36,7 @@
 Package: javahelper
 Architecture: all
 Depends:
+ jarwrapper,
  bsdextrautils | bsdmainutils,
  dctrl-tools,
  debhelper-compat (= 13),
diff -Nru javatools-0.78/debian/rules javatools-0.78ubuntu1/debian/rules
--- javatools-0.78/debian/rules 2021-02-05 00:05:53.000000000 +1300
+++ javatools-0.78ubuntu1/debian/rules  2023-05-04 19:27:54.000000000 +1200
@@ -14,7 +14,7 @@
 
 override_dh_auto_build: jh_lib.sh
        mkdir -p target/classes
-       javac -d target/classes -source 7 -target 7 
src/main/java/org/debian/javatools/CheckProperty.java
+       javac -d target/classes -source 8 -target 8 
src/main/java/org/debian/javatools/*.java
        jar -cvf target/javatools.jar -C target/classes/ .
 
        mkdir tmp tmp.jarwrapper
diff -Nru javatools-0.78/jh_build javatools-0.78ubuntu1/jh_build
--- javatools-0.78/jh_build     2021-02-05 00:07:26.000000000 +1300
+++ javatools-0.78ubuntu1/jh_build      2023-05-04 19:27:54.000000000 +1200
@@ -10,9 +10,7 @@
 use warnings;
 use Cwd qw(realpath);
 use List::Util qw(any);
-
-# Value to pass to -source/-target by default
-use constant DEFAULT_JAVA_RELEASE => '1.7';
+use File::Temp qw(tempfile);
 
 use Debian::Debhelper::Dh_Lib;
 use Debian::Javahelper::Java qw(write_manifest_fd);
@@ -115,7 +113,7 @@
 my @JH_JAR_EXTRA;
 my $build_javadoc = 1;
 my (@javac_opts, @javadoc_opts, $main_class, $do_clean);
-my (@JAVAC, @JAVADOC, @JAR, @builds);
+my (@JAVAC, @JAVA, @JAVADOC, @JAR, @builds);
 
 $CLASSPATH =~ tr/:/ /;
 @JH_JAR_EXTRA = split(' ', $ENV{'JH_JAR_EXTRA'}) if defined 
$ENV{'JH_JAR_EXTRA'};
@@ -150,6 +148,17 @@
        exit(0);
 }
 
+# Value to pass to -source/-target by default
+sub get_min_release {
+       if (doit_noerror(@JAVA, "-cp", "/usr/share/java/javatools.jar", 
"org.debian.javatools.CheckIntProperty", "java.specification.version", "gte", 
"21")) {
+               warning('Java machine does not support --release 7, using 
--release 8');
+               return "8";
+       }
+       # when the specification version is less than 21 or an error occured
+       # default to 7
+       return "7";
+}
+
 sub _has_java_option {
        my ($opt_ref, $option_name) = @_;
        for my $arg (@{$opt_ref}) {
@@ -171,27 +180,6 @@
        return;
 }
 
-# Use ISO8859-1 as the default encoding to avoid unmappable character errors
-_default_java_option(\@javac_opts, '-encoding', 'ISO8859-1');
-_default_java_option(\@javadoc_opts, '-encoding', 'ISO8859-1');
-
-if (not _has_java_option(\@javac_opts, '--release') and not 
_has_java_option(\@javac_opts, '-source')) {
-       # If neither --release nor -source is set, then set -source (and 
-target if also absent)
-       if (not _has_java_option(\@javac_opts, '-target')) {
-               push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE, '-target', 
DEFAULT_JAVA_RELEASE);
-       } else {
-               push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE);
-       }
-}
-
-if (not _has_java_option(\@javadoc_opts, '--release')) {
-       _default_java_option(\@javadoc_opts, '-source', DEFAULT_JAVA_RELEASE);
-}
-
-_default_java_option(\@javadoc_opts, '-notimestamp');
-_default_java_option(\@javadoc_opts, '-Xdoclint:none');
-
-
 sub do_build {
        my ($jarfile, @sources) = @_;
        my (@srcdirs, @srcfiles);
@@ -275,8 +263,33 @@
                error('Cannot find any JAVA_HOME: aborting');
        }
        @JAVAC = ("${JAVA_HOME}/bin/javac");
+       @JAVA = ("${JAVA_HOME}/bin/java");
+
        @JAVADOC = ("${JAVA_HOME}/bin/javadoc", '-locale', 'en_US');
        @JAR = ("${JAVA_HOME}/bin/jar");
+
+       my $default_java_release = get_min_release();
+
+       # Use ISO8859-1 as the default encoding to avoid unmappable character 
errors
+       _default_java_option(\@javac_opts, '-encoding', 'ISO8859-1');
+       _default_java_option(\@javadoc_opts, '-encoding', 'ISO8859-1');
+
+       if (not _has_java_option(\@javac_opts, '--release') and not 
_has_java_option(\@javac_opts, '-source')) {
+               # If neither --release nor -source is set, then set -source 
(and -target if also absent)
+               if (not _has_java_option(\@javac_opts, '-target')) {
+                       push(@javac_opts, '-source', $default_java_release, 
'-target', $default_java_release);
+               } else {
+                       push(@javac_opts, '-source', $default_java_release);
+               }
+       }
+
+       if (not _has_java_option(\@javadoc_opts, '--release')) {
+               _default_java_option(\@javadoc_opts, '-source', 
$default_java_release);
+       }
+
+       _default_java_option(\@javadoc_opts, '-notimestamp');
+       _default_java_option(\@javadoc_opts, '-Xdoclint:none');
+
        for my $build (@builds) {
                do_build(@{$build});
        }
diff -Nru 
javatools-0.78/src/main/java/org/debian/javatools/CheckIntProperty.java 
javatools-0.78ubuntu1/src/main/java/org/debian/javatools/CheckIntProperty.java
--- javatools-0.78/src/main/java/org/debian/javatools/CheckIntProperty.java     
1970-01-01 12:00:00.000000000 +1200
+++ 
javatools-0.78ubuntu1/src/main/java/org/debian/javatools/CheckIntProperty.java  
    2023-05-04 19:27:54.000000000 +1200
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2023 Canonical Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.javatools;
+
+/**
+ * Check the value of a system property from the command line.
+ *
+ * Syntax:
+ *
+ *   java org.debian.javatools.CheckIntProperty <propertyName> <condition> 
<expectedValue>
+ *
+ *   <condition>:
+ *          - gte - greater or equal 
+ *          - lte - less than or equal
+ *          - gt  - greater than
+ *          - lt  - less than
+ *
+ * The program exits with the status code 0 if the condition is true, and 1 
otherwise.
+ */
+public class CheckIntProperty {
+
+    private static boolean check(String operation, int actualValue, int 
expectedValue){
+        switch (operation) {
+            case "gt": return actualValue > expectedValue;
+            case "gte": return actualValue >= expectedValue;
+            case "lte": return actualValue <= expectedValue;
+            case "lt": return actualValue < expectedValue;
+            default: return false;
+        }
+    }
+
+    private static boolean IsVerbose() {
+        try 
+        {
+            return Integer.parseInt(System.getenv("DH_VERBOSE")) != 0;
+        } 
+        catch (NumberFormatException ex)
+        {
+        }
+        return false;
+    }
+
+    public static void main(String[] args) {
+        boolean verbose = IsVerbose();
+        String propertyName = args[0];
+        String operation = args[1];
+        try {
+            int expectedValue = Integer.parseInt(args[2]);
+            int actualValue = 
Integer.parseInt(System.getProperty(propertyName));
+            if (check(operation, actualValue, expectedValue)) {
+                if (IsVerbose())
+                    System.out.println("OK: " + propertyName + " " + 
actualValue + " " + operation + " " + expectedValue);
+                System.exit(0);
+            }
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (IsVerbose())
+            System.out.println("FAILED: " + propertyName + " " + 
System.getProperty(propertyName) + " " + operation + " " + args[2]);
+        System.exit(1);
+    }
+}

Reply via email to