152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra/*
252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * Copyright (C) 2012 The Android Open Source Project
352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra *
452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * Licensed under the Apache License, Version 2.0 (the "License");
552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * you may not use this file except in compliance with the License.
652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * You may obtain a copy of the License at
752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra *
852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra *      http://www.apache.org/licenses/LICENSE-2.0
952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra *
1052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * Unless required by applicable law or agreed to in writing, software
1152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * distributed under the License is distributed on an "AS IS" BASIS,
1252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * See the License for the specific language governing permissions and
1452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra * limitations under the License.
1552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra */
1652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
1752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condrapackage libcore.io;
1852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
1952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condrapublic final class EventLogger {
2052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
2152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    /**
2252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     * Hook for customizing how events are reported.
2352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     */
2452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    private static volatile Reporter REPORTER = new DefaultReporter();
2552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
2652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    /**
2752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     * Used to replace default Reporter for logging events. Must be non-null.
2852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     */
2952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    public static void setReporter(Reporter reporter) {
3052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        if (reporter == null) {
3152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            throw new NullPointerException("reporter == null");
3252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        }
3352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        REPORTER = reporter;
3452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    }
3552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
3652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    /**
3752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     * Returns non-null Reporter.
3852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     */
3952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    public static Reporter getReporter() {
4052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        return REPORTER;
4152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    }
4252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
4352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    /**
4452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     * Interface to allow customization of reporting behavior.
4552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     */
4652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    public static interface Reporter {
4752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        public void report (int code, Object... list);
4852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    }
4952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
5052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    /**
5152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     * Default Reporter which reports events to the log.
5252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra     */
5352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    private static final class DefaultReporter implements Reporter {
5452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        @Override
5552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        public void report (int code, Object... list) {
5652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            StringBuilder sb = new StringBuilder();
5752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            sb.append(code);
5852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            for (Object o : list) {
5952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra                sb.append(",");
6052dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra                sb.append(o.toString());
6152dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            }
6252dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra            System.out.println(sb);
6352dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        }
6452dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    }
6552dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra
6652dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    public static void writeEvent(int code, Object... list) {
6752dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra        getReporter().report(code, list);
6852dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra    }
6952dc295e93679baa72f95b5b873dd21d5a2ccb32Geremy Condra}
70