/* * Copyright (c) 2016. Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file 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 com.amazonaws.log; import com.amazonaws.annotation.ThreadSafe; /** * Can be used to configure the default log factory for the AWSJavaClientCore * and AWSJavaClientSigners. Default to JUL, unless AWSJavaClientRuntime is * present which will default it to Jakarta Commons Logging. */ @ThreadSafe public abstract class InternalLogFactory { private static volatile InternalLogFactory factory = new JulLogFactory(); /** True if the log factory has been explicitly configured; false otherwise. */ private static volatile boolean factoryConfigured; /** * Returns an SDK logger that logs using the currently configured default * log factory, given the class. */ public static InternalLogApi getLog(Class<?> clazz) { return factoryConfigured ? factory.doGetLog(clazz) : new InternalLog(clazz.getName()); // will look up actual logger per log } /** * Returns an SDK logger that logs using the currently configured default * log factory, given the name. */ public static InternalLogApi getLog(String name) { return factoryConfigured ? factory.doGetLog(name) : new InternalLog(name); // will look up actual logger per log } /** * SPI to return a logger given a class. */ protected abstract InternalLogApi doGetLog(Class<?> clazz); /** * SPI to return a logger given a name. */ protected abstract InternalLogApi doGetLog(String name); /** * Returns the current default log factory. */ public static InternalLogFactory getFactory() { return factory; } /** * Used to explicitly configure the log factory. The log factory can only be * configured at most once. All subsequent configurations will have no * effect. * * Note explicitly configuring the log factory will have positive * performance impact on all subsequent logging, since the specific logger * can be directly referenced instead of being searched every time. * * @param factory * the log factory to be used internally by the SDK * * @return true if the log factory is successfully configured; false * otherwise (ie the log factory is not allowed to be configured * more than once for performance reasons.) */ public synchronized static boolean configureFactory( InternalLogFactory factory) { if (factory == null) throw new IllegalArgumentException(); if (factoryConfigured) return false; InternalLogFactory.factory = factory; factoryConfigured = true; return true; } }