LoggerFactory.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it).
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.utils.logger;

import java.lang.reflect.Constructor;

import org.openspcoop2.utils.UtilsException;

/**
 * LoggerFactory
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class LoggerFactory {

	private static Class<ILogger> loggerImpl = null;
	private static Object [] parameters = null;
	private static Class<?> [] parameterTypes = null;
	
	@SuppressWarnings("unchecked")
	public static void initialize(String implementationClassName, Object ... pars) throws UtilsException, ClassNotFoundException{
		Class<ILogger> c = (Class<ILogger>) Class.forName(implementationClassName);
		initialize(c, pars);
	}
	public static void initialize(Class<ILogger> implementationClass, Object ... pars) throws UtilsException {
		try{
			loggerImpl = (Class<ILogger>)implementationClass;
			parameters = pars;
			if(parameters!=null){
				parameterTypes = new Class<?>[parameters.length];
				for (int i = 0; i < parameters.length; i++) {
					parameterTypes[i] = parameters[i].getClass();
				}
			}
		}catch(Exception e){
			throw new UtilsException("Expected class assignable from "+ILogger.class.getName()+". Found: "+implementationClass.getName()+" . Error: "+e.getMessage(),e);
		}
	}
	
	public static ILogger newLogger() throws UtilsException{
		return _newLogger(null);
	}
	public static ILogger newLogger(IContext context) throws UtilsException{
		return _newLogger(context);
	}
	private static ILogger _newLogger(IContext context) throws UtilsException{
		
		if(loggerImpl==null){
			throw new UtilsException("LoggerFactory not Initialized");
		}
		
		try{
			Constructor<ILogger> c = loggerImpl.getConstructor(parameterTypes);
			ILogger logger = (ILogger) c.newInstance(parameters);
			if(context!=null){
				logger.initLogger(context);
			}
			else{
				logger.initLogger();
			}
			return logger;
		}catch(Exception e){
			throw new UtilsException(e.getMessage(),e);
		}
	}
	
	public static ILogger newLogger(String implementationClassName) throws UtilsException{
		return _newLogger(implementationClassName, null);
	}
	public static ILogger newLogger(String implementationClassName, IContext context) throws UtilsException{
		return _newLogger(implementationClassName, context);
	}
	@SuppressWarnings("unchecked")
	private static ILogger _newLogger(String implementationClassName, IContext context) throws UtilsException{
		Class<ILogger> c = null;
		try {
			c = (Class<ILogger>) Class.forName(implementationClassName);
		}catch(Exception e){
			throw new UtilsException("Expected class assignable from "+ILogger.class.getName()+". Found: "+implementationClassName+" . Error: "+e.getMessage(),e);
		}
		return _newLogger(c, context);
	}
	
	public static ILogger newLogger(Class<? extends ILogger> implementationClass) throws UtilsException{
		return _newLogger(implementationClass, null);
	}
	public static ILogger newLogger(Class<? extends ILogger> implementationClass, IContext context) throws UtilsException{
		return _newLogger(implementationClass, context);
	}
	private static ILogger _newLogger(Class<? extends ILogger> implementationClass, IContext context) throws UtilsException{
		
		try{
			Constructor<? extends ILogger> c = implementationClass.getConstructor(parameterTypes);
			ILogger logger = (ILogger) c.newInstance(parameters);
			if(context!=null){
				logger.initLogger(context);
			}
			else{
				logger.initLogger();
			}
			return logger;
		}catch(Exception e){
			throw new UtilsException(e.getMessage(),e);
		}
	}
}