/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
<<<<<<< Updated upstream
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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
=======
 * 
 *     https://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License 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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.util;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.security.PrivilegedAction;
import java.util.logging.LogManager;
import javax.jdo.JDOFatalInternalException;
import javax.jdo.JDOFatalUserException;
import javax.jdo.LegacyJava;
import org.apache.commons.logging.impl.Jdk14Logger;

/**
 * JDO-specific subclass of the apache commons logging Log implementation that wraps the standard
 * JDK 1.4 logging. This class configures the JDK LogManager using a properties file called
 * logging.properties found via the CLASSPATH.
 *
 * @author Michael Bouschen
 * @since 1.1
 * @version 1.1
 */
public class JDOJdk14Logger extends Jdk14Logger {
  private static final long serialVersionUID = 1L;

  /** Logging properties file name. */
  public static final String PROPERIES_FILE = "logging.properties";

  /** Indicates whether JDK 1.4 logging has been configured by this class. */
  private static boolean configured = false;

  /**
   * Constructor checking whether JDK 1.4 logging should be configuared after calling super
   * constructor.
   *
   * @param name logger name
   */
  public JDOJdk14Logger(String name) {
    super(name);
    if (!configured) {
      configured = true;
      configureJDK14Logger();
    }
  }

  /** Configures JDK 1.4 LogManager. */
  private void configureJDK14Logger() {
    final LogManager logManager = LogManager.getLogManager();
    final ClassLoader cl = getClass().getClassLoader();
    doPrivileged(
        () -> {
          try {
            InputStream config = cl.getResourceAsStream(PROPERIES_FILE);
            logManager.readConfiguration(config);
            return null;
          } catch (IOException ex) {
            throw new JDOFatalUserException(
                "A IOException was thrown when trying to read the "
                    + "logging configuration file "
                    + PROPERIES_FILE
                    + ".",
                ex);
          } catch (SecurityException ex) {
            throw new JDOFatalUserException(
                "A SecurityException was thrown when trying to read "
                    + "the logging configuration file "
                    + PROPERIES_FILE
                    + ". In order to configure JDK 1.4 logging, you must "
                    + "grant java.util.logging.LoggingPermission(control) "
                    + "to the codeBase containing the JDO TCK.",
                ex);
          }
        });
  }

  @SuppressWarnings("unchecked")
  private static <T> T doPrivileged(PrivilegedAction<T> privilegedAction) {
    try {
      return (T) LegacyJava.doPrivilegedAction.invoke(null, privilegedAction);
    } catch (IllegalAccessException | InvocationTargetException e) {
      if (e.getCause() instanceof RuntimeException) {
        throw (RuntimeException) e.getCause();
      }
      throw new JDOFatalInternalException(e.getMessage());
    }
  }
}
