Skip to content

Fix regression caused by logging refactoring. #1479

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 42 additions & 4 deletions src/NHibernate.Test/Logging/LoggerProviderTest.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using NUnit.Framework;

namespace NHibernate.Test.Logging
Expand All @@ -12,17 +13,29 @@ public void LoggerProviderCanCreateLoggers()
Assert.That(NHibernateLogger.For(typeof (LoggerProviderTest)), Is.Not.Null);
}

[Test, Obsolete]
public void LoggerProviderCanCreateLoggers_Obsolete()
{
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.Null);
Assert.That(LoggerProvider.LoggerFor(typeof (LoggerProviderTest)), Is.Not.Null);
}

[Test]
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory()
{
#pragma warning disable 618
Assert.That(NHibernateLogger.For("pizza"), Is.Not.InstanceOf<NoLoggingInternalLogger>());
#pragma warning restore 618

// NoLoggingNHibernateLogger is internal
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.Not.EqualTo("NoLoggingNHibernateLogger"));
}

[Test, Obsolete]
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory_Obsolete()
{
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.InstanceOf<NoLoggingInternalLogger>());

// works because this is the legacy provider with a legacy logger
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<Log4NetLogger>());
}

[Test, Explicit("Changes global state.")]
public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed()
{
Expand All @@ -31,5 +44,30 @@ public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed()
// NoLoggingNHibernateLogger is internal
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.EqualTo("NoLoggingNHibernateLogger"));
}

[Test, Explicit("Changes global state."), Obsolete]
public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed_Obsolete()
{
NHibernateLogger.SetLoggersFactory(default(INHibernateLoggerFactory));

Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<NoLoggingInternalLogger>());
}

[Test, Explicit("Changes global state."), Obsolete]
public void WhenNoLoggingFactoryIsUsedThenNoLoggingInternalLoggerIsReturned()
{
LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());

Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<NoLoggingInternalLogger>());
}

[Test, Explicit("Changes global state."), Obsolete]
public void WhenNoLoggingFactoryIsUsedThenNoLoggingNHibernateLoggerIsReturned()
{
LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());

// NoLoggingNHibernateLogger is internal
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.EqualTo("NoLoggingNHibernateLogger"));
}
}
}
20 changes: 18 additions & 2 deletions src/NHibernate/Logging.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ public static class NHibernateLogger
private const string nhibernateLoggerConfKey = "nhibernate-logger";
private static INHibernateLoggerFactory _loggerFactory;

#pragma warning disable 618
internal static ILoggerFactory LegacyLoggerFactory { get; private set; }
#pragma warning restore 618

static NHibernateLogger()
{
var nhibernateLoggerClass = GetNhibernateLoggerClass();
Expand All @@ -68,9 +72,21 @@ public static void SetLoggersFactory(INHibernateLoggerFactory loggerFactory)
_loggerFactory = loggerFactory ?? new NoLoggingNHibernateLoggerFactory();

#pragma warning disable 618
if (!(loggerFactory is LoggerProvider.LegacyLoggerFactoryAdaptor))
// Also keep global state for obsolete logger
if (loggerFactory == null)
{
LegacyLoggerFactory = new NoLoggingLoggerFactory();
}
else
{
LoggerProvider.SetLoggersFactory(new LoggerProvider.ReverseLegacyLoggerFactoryAdaptor(loggerFactory));
if (loggerFactory is LoggerProvider.LegacyLoggerFactoryAdaptor legacyAdaptor)
{
LegacyLoggerFactory = legacyAdaptor.Factory;
}
else
{
LegacyLoggerFactory = new LoggerProvider.ReverseLegacyLoggerFactoryAdaptor(loggerFactory);
}
}
#pragma warning restore 618
}
Expand Down
27 changes: 10 additions & 17 deletions src/NHibernate/Logging.obsolete.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,54 +82,47 @@ public interface ILoggerFactory
[Obsolete("Use NHibernateLogger instead.")]
public class LoggerProvider
{
private static ILoggerFactory _legacyLoggerFactory;

[Obsolete("Implement INHibernateLoggerFactory and use NHibernateLogger.SetLoggersFactory() instead")]
public static void SetLoggersFactory(ILoggerFactory loggerFactory)
{
_legacyLoggerFactory = loggerFactory ?? new NoLoggingLoggerFactory();

if (!(loggerFactory is ReverseLegacyLoggerFactoryAdaptor))
{
var factory = loggerFactory == null || loggerFactory is NoLoggingLoggerFactory
? null
: (INHibernateLoggerFactory) new LegacyLoggerFactoryAdaptor(loggerFactory);
var factory = (loggerFactory == null || loggerFactory is NoLoggingLoggerFactory)
? null
: (INHibernateLoggerFactory) new LegacyLoggerFactoryAdaptor(loggerFactory);

NHibernateLogger.SetLoggersFactory(factory);
}
NHibernateLogger.SetLoggersFactory(factory);
}

[Obsolete("Use NHibernateLogger.For() instead.")]
public static IInternalLogger LoggerFor(string keyName)
{
return _legacyLoggerFactory.LoggerFor(keyName);
return NHibernateLogger.LegacyLoggerFactory.LoggerFor(keyName);
}

[Obsolete("Use NHibernateLogger.For() instead.")]
public static IInternalLogger LoggerFor(System.Type type)
{
return _legacyLoggerFactory.LoggerFor(type);
return NHibernateLogger.LegacyLoggerFactory.LoggerFor(type);
}

// Since 5.1
[Obsolete("Used only in Obsolete functions to thunk to INHibernateLoggerFactory")]
internal class LegacyLoggerFactoryAdaptor : INHibernateLoggerFactory
{
private readonly ILoggerFactory _factory;
internal ILoggerFactory Factory { get; }

public LegacyLoggerFactoryAdaptor(ILoggerFactory factory)
{
_factory = factory;
Factory = factory;
}

public INHibernateLogger LoggerFor(string keyName)
{
return new NHibernateLoggerThunk(_factory.LoggerFor(keyName));
return new NHibernateLoggerThunk(Factory.LoggerFor(keyName));
}

public INHibernateLogger LoggerFor(System.Type type)
{
return new NHibernateLoggerThunk(_factory.LoggerFor(type));
return new NHibernateLoggerThunk(Factory.LoggerFor(type));
}
}

Expand Down