    001/*
    002 * Copyright (c) 2017 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.fileexec;
    017
    018//      import java.nio.file.Paths;                                                             // 6.8.1.5 (2017/09/08)
    019
    020import java.util.logging.Logger;
    021import java.util.logging.Level;
    022import java.util.function.Supplier;                                             // 6.8.1.0 (2017/07/14)
    023
    024/**
    025 * XLoggerは、Throwable を引数に取るwarningと、Level 600 の debug メソッドを
    026 * 持つ、Logger の拡張クラスです。
    027 * ここでは、継承するのではなく、委譲で、最低限のメソッドだけに対応しています。
    028 * (LogManager とか、色々とややこしそうなので、調査する暇が無い)
    029 *
    030 * WARNING(900) → INFO(800) → CONFIG(700) → XXXX(600) → FINE(500) → ALL(Integer.MIN_VALUE)
    031 * となっていますが、FINE では、多すぎ、INFO は、通常使用、間に、DEBUG的な、
    032 * ロギングが欲しい場合に使用します。
    033 * CONFIG を使いたいところですが、｢CONFIGは静的な構成メッセージのメッセージ・レベルです。｣と
    034 * JavaDocにわざわざ、書かれていることから、使用を避けます。
    035 *
    036 * @og.rev 7.0.0.0 (2017/07/07) 新規作成
    037 *
    038 * @version  7.0
    039 * @author   Kazuhiko Hasegawa
    040 * @since    JDK1.8,
    041 */
    042public class XLogger {
    043        /** 初期設定されているリソースバンドルのbaseName {@value} */
    044        public static final String OMIT_NAME = "org.opengion.fukurou." ;                // fileexec は残す
    045
    046        /**
    047         * デバッグレベルを新規に定義します。
    048         *
    049         * OFF:Integer.MAX_VALUE , SEVERE:1000 , WARNING:900 , INFO:800 , CONFIG:700 , FINE:500 , FINER:400 , FINEST:300 , ALL:Integer.MIN_VALUE
    050         * LEVEL_DEBUG:600 で定義することで、INFO より細かいが、FINE より荒いログ出力が可能です。
    051         * 他のアプリケーションで、INFO は許せても、FINE は許せない場合があるので、独自のログ出力が、可能です。
    052         */
    053        private static final class LEVEL_DEBUG extends Level {
    054                private static final long serialVersionUID = 681020170714L ;            // 6.8.1.0 (2017/07/14)
    055                /**
    056                 * デバッグレベルのコンストラクター
    057                 */
    058                public LEVEL_DEBUG() { super( "DEBUG",600 ); }
    059        };
    060
    061//      private static final Level DEBUG = new LEVEL_DEBUG();
    062        public static final Level L_DEBUG = new LEVEL_DEBUG();                                  // 6.9.7.0 (2018/05/14) PMD Field DEBUG has the same name as a method
    063
    064        private final Logger LOGGER;
    065
    066        /**
    067         * 名前を指定して、XLoggerオブジェクトを作成します。
    068         *
    069         * @og.rev 6.8.1.5 (2017/09/08) logフォルダの存在チェックと作成
    070         *
    071         * @param       name     ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。
    072         */
    073        private XLogger( final String name ) {
    074//              FileUtil.mkdirs( Paths.get( "log" ) );          // Logger の log フォルダが無ければ作成します。
    075
    076                LOGGER = Logger.getLogger( name );
    077        }
    078
    079        /**
    080         * 名前を指定して、XLoggerオブジェクトを作成します。
    081         *
    082         * @og.rev 7.2.1.0 (2020/03/13) ロガーの名前から、共通部分を削除します。
    083         *
    084         * @param       name     ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。
    085         * @return      XLoggerオブジェクト
    086         */
    087        public static XLogger getLogger( final String name ) {
    088                String key = name ;
    089                if( key.startsWith( OMIT_NAME ) ) {
    090                        key = name.substring( OMIT_NAME.length() );
    091                }
    092
    093//              return new XLogger( name );                             // 今は、個別に作成していますが、本来は、同じオブジェクトを返すようにすべき。
    094                return new XLogger( key );                              // 今は、個別に作成していますが、本来は、同じオブジェクトを返すようにすべき。
    095        }
    096
    097        /**
    098         * INFO レベルのログをとります。
    099         *
    100         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
    101         * @see         Logger#info( Supplier )
    102         */
    103        public void info( final Supplier<String> msgSupplier ) {
    104                LOGGER.info( msgSupplier );
    105        }
    106
    107        /**
    108         * WARNING レベルのログをとります。
    109         *
    110         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
    111         * @see         Logger#warning( Supplier )
    112         */
    113        public void warning( final Supplier<String> msgSupplier ) {
    114                LOGGER.warning( msgSupplier );
    115        }
    116
    117        /**
    118         * WARNING レベルのログをとります。
    119         *
    120         * これは、Throwable を引数に取る拡張されたメソッドです。
    121         *
    122         * @param       thrown  ログ・メッセージに関連したThrowable。
    123         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
    124         * @see         Logger#log( Level,Throwable,Supplier )
    125         */
    126        public void warning( final Throwable thrown , final Supplier<String> msgSupplier ) {
    127                LOGGER.log( Level.WARNING , thrown , msgSupplier );
    128        }
    129
    130        /**
    131         * 600 レベルのログをとります。
    132         *
    133         * Supplierを引数に、Level = 600 のログをとります。
    134         *
    135         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
    136         * @see         Logger#log( Level,Supplier )
    137         */
    138        public void debug( final Supplier<String> msgSupplier ) {
    139//              LOGGER.log( DEBUG , msgSupplier );
    140                LOGGER.log( L_DEBUG , msgSupplier );
    141        }
    142}