#!/usr/bin/env --split-string=${JDK_HOME}/bin/java @Makeshift/java_arguments @Makeshift/java_javac_arguments \c [SS]

// This command runs directly from the present source file, it needs no compiling.

import java.util.logging.Level;
import java.util.logging.Logger;

import static java.util.logging.Level.*;


/** A shell command to issue test messages to a runtime event logger.
  *
  *     @see <a href='http://reluk.ca/project/Java/bin/test-logging.brec.xht'>
  *       The `test-logging` command</a>
  */
public final class LoggingTestCommand { // [AFN]



    private LoggingTestCommand( final String loggerName ) { logger = Logger.getLogger( loggerName ); }



    /** Takes a `test-logging` command from the shell and executes it.
      */
    public static void main( final String[] arguments ) {
        if( arguments.length != 1 ) abortWithUsage();
        final String a = arguments[0];
        if( a.startsWith( "-" )) abortWithUsage(); // Allowing e.g. for a deliberate `-?`.
        new LoggingTestCommand( a ).run(); }



////  P r i v a t e  ////////////////////////////////////////////////////////////////////////////////////


    private static void abortWithUsage() {
        System.err.println( "Usage: test-logging <logger-name>" );
        System.exit( 1 ); }



    private final Logger logger;



    private void run() {
        logger.log( OFF, "Logging at levels `OFF`, `SEVERE`, `WARNING`, `INFO`, `CONFIG`, "
          + "`FINE`, `FINER`, `FINEST` and `ALL`:" );
        test( OFF );
        test( SEVERE );
        test( WARNING );
        test( INFO );
        test( CONFIG );
        test( FINE );
        test( FINER );
        test( FINEST );
        test( ALL ); }



    /** Logs a test message at the given level.
      */
    private void test( final Level level ) { logger.log( level, () -> "Testing at level " + level ); }}



// NOTES
// ─────
//   AFN  Atypical file naming is allowed here.  ‘The compiler does not enforce the optional restriction
//        defined at the end of JLS §7.6, that a type in a named package should exist in a file whose
//        name is composed from the type name followed by the .java extension.’
//        <https://openjdk.org/jeps/330>
//        <https://docs.oracle.com/javase/specs/jls/se11/html/jls-7.html#jls-7.6>
//
//        No longer, however, does this allowance extend to the package name.  While in JDK releases
//        prior to 22 “the launcher's source-file mode was permissive about which package, if any,
//        was declared”, current releases enforce a correspondence between the declared package name
//        and the file path.  Failing this, the launcher aborts with “end of path to source file
//        does not match its package name”.  <https://openjdk.org/jeps/458>
//
//   SS · Here the long form `--split-string` (as opposed to `-S`) enables Emacs to recognize this file
//        as Java source code.  See the note apropos of ‘source-launch files encoded with a shebang’ at
//        `http://reluk.ca/project/Java/Emacs/jmt-mode.el`.



                                             // Copyright © 2020-2022, 2024  Michael Allan.  Licence MIT.