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
018import 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        /**
044         * デバッグレベルを新規に定義します。
045         */
046        private static final class LEVEL_DEBUG extends Level {
047                private static final long serialVersionUID = 681020170714L ;            // 6.8.1.0 (2017/07/14)
048                /**
049                 * デバッグレベルのコンストラクター
050                 */
051                public LEVEL_DEBUG() { super( "600",600 ); }
052        };
053
054        private static final Level DEBUG = new LEVEL_DEBUG();
055
056        private final Logger LOGGER;
057
058        /**
059         * 名前を指定して、XLoggerオブジェクトを作成します。
060         *
061         * @og.rev 6.8.1.5 (2017/09/08) logフォルダの存在チェックと作成
062         *
063         * @param       name     ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。
064         */
065        private XLogger( final String name ) {
066                FileUtil.mkdirs( Paths.get( "log" ) );          // Logger の log フォルダが無ければ作成します。
067
068                LOGGER = Logger.getLogger( name );
069        }
070
071        /**
072         * 名前を指定して、XLoggerオブジェクトを作成します。
073         *
074         * @param       name     ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。
075         * @return      XLoggerオブジェクト
076         */
077        public static XLogger getLogger( final String name ) {
078                return new XLogger( name );                             // 今は、個別に作成していますが、本来は、同じオブジェクトを返すようにすべき。
079        }
080
081        /**
082         * INFO レベルのログをとります。
083         *
084         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
085         * @see         Logger#info( Supplier )
086         */
087        public void info( final Supplier<String> msgSupplier ) {
088                LOGGER.info( msgSupplier );
089        }
090
091        /**
092         * WARNING レベルのログをとります。
093         *
094         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
095         * @see         Logger#warning( Supplier )
096         */
097        public void warning( final Supplier<String> msgSupplier ) {
098                LOGGER.warning( msgSupplier );
099        }
100
101        /**
102         * WARNING レベルのログをとります。
103         *
104         * これは、Throwable を引数に取る拡張されたメソッドです。
105         *
106         * @param       thrown  ログ・メッセージに関連したThrowable。
107         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
108         * @see         Logger#log( Level,Throwable,Supplier )
109         */
110        public void warning( final Throwable thrown , final Supplier<String> msgSupplier ) {
111                LOGGER.log( Level.WARNING , thrown , msgSupplier );
112        }
113
114        /**
115         * 600 レベルのログをとります。
116         *
117         * Supplierを引数に、Level = 600 のログをとります。
118         *
119         * @param       msgSupplier     呼び出されると、目的のログ・メッセージを生成する関数
120         * @see         Logger#log( Level,Supplier )
121         */
122        public void debug( final Supplier<String> msgSupplier ) {
123                LOGGER.log( DEBUG , msgSupplier );
124        }
125}