google-guice/GUICE_492_slf4j_logger_injection.patch
2015-05-14 15:06:19 +02:00

154 lines
5.7 KiB
Diff

Description: Provide built-in injection of SLF4J loggers
Author: Stuart McCulloch <mcculls@gmail.com>
Bug-Google: http://code.google.com/p/google-guice/issues/detail?id=492
Last-Update: 2014-11-07
diff --git a/common.xml b/common.xml
index a23eb90..2d3d9b3 100644
--- a/common.xml
+++ b/common.xml
@@ -44,6 +44,10 @@
<property name="Export-Package" value="!${module}.internal.*,${module}.*;version=${api.version}"/>
+ <condition property="DynamicImport-Package" value="org.slf4j">
+ <equals arg1="${module}" arg2="com.google.inject"/>
+ </condition>
+
<condition property="Eclipse-ExtensibleAPI" value="true">
<equals arg1="${module}" arg2="com.google.inject"/>
</condition>
diff --git a/core/pom.xml b/core/pom.xml
index 33e6dcc..edfa724 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -15,6 +15,12 @@
<dependencies>
<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.6.4</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
@@ -91,6 +97,12 @@
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--
+ | Run core tests without SLF4J on the classpath
+ -->
+ <classpathDependencyExcludes>
+ <exclude>org.slf4j:slf4j-api</exclude>
+ </classpathDependencyExcludes>
+ <!--
| Temporarily excluded tests
-->
<excludes>
@@ -113,6 +125,7 @@
<Bundle-Name>${project.artifactId}$(if;$(classes;NAMED;*.MethodAspect);; (no_aop))</Bundle-Name>
<Import-Package>!net.sf.cglib.*,!org.objectweb.asm.*,!com.google.inject.*,*</Import-Package>
<Eclipse-ExtensibleAPI>true</Eclipse-ExtensibleAPI>
+ <DynamicImport-Package>org.slf4j</DynamicImport-Package>
</instructions>
</configuration>
</plugin>
diff --git a/core/src/com/google/inject/internal/InjectorShell.java b/core/src/com/google/inject/internal/InjectorShell.java
index 6100879..56b13b3 100644
--- a/core/src/com/google/inject/internal/InjectorShell.java
+++ b/core/src/com/google/inject/internal/InjectorShell.java
@@ -251,6 +251,15 @@ final class InjectorShell {
new ProviderInstanceBindingImpl<Logger>(injector, key,
SourceProvider.UNKNOWN_SOURCE, loggerFactory, Scoping.UNSCOPED,
loggerFactory, ImmutableSet.<InjectionPoint>of()));
+
+ try {
+ Key<org.slf4j.Logger> slf4jKey = Key.get(org.slf4j.Logger.class);
+ SLF4JLoggerFactory slf4jLoggerFactory = new SLF4JLoggerFactory(injector);
+ injector.state.putBinding(slf4jKey,
+ new ProviderInstanceBindingImpl<org.slf4j.Logger>(injector, slf4jKey,
+ SourceProvider.UNKNOWN_SOURCE, slf4jLoggerFactory, Scoping.UNSCOPED,
+ slf4jLoggerFactory, ImmutableSet.<InjectionPoint>of()));
+ } catch (Throwable e) {}
}
private static class LoggerFactory implements InternalFactory<Logger>, Provider<Logger> {
@@ -270,6 +279,44 @@ final class InjectorShell {
}
}
+ private static class SLF4JLoggerFactory implements InternalFactory<org.slf4j.Logger>, Provider<org.slf4j.Logger> {
+ private final Injector injector;
+
+ private org.slf4j.ILoggerFactory loggerFactory;
+
+ SLF4JLoggerFactory(Injector injector) {
+ this.injector = injector;
+ }
+
+ org.slf4j.ILoggerFactory loggerFactory() {
+ if (loggerFactory == null) {
+ try {
+ loggerFactory = injector.getInstance(org.slf4j.ILoggerFactory.class);
+ } catch (Throwable e) {}
+ if (loggerFactory == null) {
+ loggerFactory = org.slf4j.LoggerFactory.getILoggerFactory();
+ }
+ }
+ return loggerFactory;
+ }
+
+ public org.slf4j.Logger get(Errors errors, InternalContext context, Dependency<?> dependency, boolean linked) {
+ InjectionPoint injectionPoint = dependency.getInjectionPoint();
+ if (injectionPoint != null) {
+ return loggerFactory().getLogger(injectionPoint.getMember().getDeclaringClass().getName());
+ }
+ return loggerFactory().getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+ }
+
+ public org.slf4j.Logger get() {
+ return loggerFactory().getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+ }
+
+ public String toString() {
+ return "Provider<org.slf4j.Logger>";
+ }
+ }
+
private static void bindStage(InjectorImpl injector, Stage stage) {
Key<Stage> key = Key.get(Stage.class);
InstanceBindingImpl<Stage> stageBinding = new InstanceBindingImpl<Stage>(
diff --git a/extensions/persist/pom.xml b/extensions/persist/pom.xml
index a560f38..e909927 100644
--- a/extensions/persist/pom.xml
+++ b/extensions/persist/pom.xml
@@ -29,7 +29,7 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
- <version>1.6.1</version>
+ <version>1.6.4</version>
<scope>test</scope>
</dependency>
<dependency>
diff --git a/lib/build/slf4j-api-1.6.4.jar b/lib/build/slf4j-api-1.6.4.jar
new file mode 100644
index 0000000..76ef305
Binary files /dev/null and b/lib/build/slf4j-api-1.6.4.jar differ
diff --git a/pom.xml b/pom.xml
index 37305d0..5834d49 100644
--- a/pom.xml
+++ b/pom.xml
@@ -283,7 +283,7 @@ See the Apache License Version 2.0 for the specific language governing permissio
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.5</version>
+ <version>2.6</version>
<configuration>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<!--<argLine>-Dguice_include_stack_traces=OFF</argLine>-->