1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.slf4j.jdk.platform.logging;
26
27 import static java.util.Objects.requireNonNull;
28
29 import java.util.MissingResourceException;
30 import java.util.ResourceBundle;
31
32 import org.slf4j.Logger;
33 import org.slf4j.spi.CallerBoundaryAware;
34 import org.slf4j.spi.LoggingEventBuilder;
35
36
37
38
39
40 class SLF4JPlatformLogger implements System.Logger {
41
42 static private final String PRESUMED_CALLER_BOUNDARY = System.Logger.class.getName();
43
44 private final Logger slf4jLogger;
45
46 public SLF4JPlatformLogger(Logger logger) {
47 this.slf4jLogger = requireNonNull(logger);
48 }
49
50 @Override
51 public String getName() {
52 return slf4jLogger.getName();
53 }
54
55
56
57
58 @Override
59 public boolean isLoggable(Level jplLevel) {
60 if (jplLevel == Level.ALL)
61 return true;
62 if (jplLevel == Level.OFF)
63 return true;
64
65 org.slf4j.event.Level slf4jLevel = jplLevelToSLF4JLevel(jplLevel);
66
67 return slf4jLogger.isEnabledForLevel(slf4jLevel);
68 }
69
70
71
72
73
74
75
76
77
78
79 private org.slf4j.event.Level jplLevelToSLF4JLevel(Level jplLevel) {
80 switch (jplLevel) {
81 case TRACE:
82 return org.slf4j.event.Level.TRACE;
83 case DEBUG:
84 return org.slf4j.event.Level.DEBUG;
85 case INFO:
86 return org.slf4j.event.Level.INFO;
87 case WARNING:
88 return org.slf4j.event.Level.WARN;
89 case ERROR:
90 return org.slf4j.event.Level.ERROR;
91 default:
92 reportUnknownLevel(jplLevel);
93 return null;
94 }
95 }
96
97 @Override
98 public void log(Level jplLevel, ResourceBundle bundle, String msg, Throwable thrown) {
99 log(jplLevel, bundle, msg, thrown, (Object[]) null);
100 }
101
102 @Override
103 public void log(Level jplLevel, ResourceBundle bundle, String format, Object... params) {
104 log(jplLevel, bundle, format, null, params);
105 }
106
107
108
109
110
111
112
113
114
115
116 private void log(Level jplLevel, ResourceBundle bundle, String msg, Throwable thrown, Object... params) {
117 if (jplLevel == Level.OFF)
118 return;
119
120 if (jplLevel == Level.ALL) {
121 performLog(org.slf4j.event.Level.TRACE, bundle, msg, thrown, params);
122 return;
123 }
124
125 org.slf4j.event.Level slf4jLevel = jplLevelToSLF4JLevel(jplLevel);
126 boolean isEnabled = slf4jLogger.isEnabledForLevel(slf4jLevel);
127
128 if (isEnabled) {
129 performLog(slf4jLevel, bundle, msg, thrown, params);
130 }
131 }
132
133 private void performLog(org.slf4j.event.Level slf4jLevel, ResourceBundle bundle, String msg, Throwable thrown, Object... params) {
134 String message = getResourceStringOrMessage(bundle, msg);
135 LoggingEventBuilder leb = slf4jLogger.makeLoggingEventBuilder(slf4jLevel);
136 if (thrown != null) {
137 leb = leb.setCause(thrown);
138 }
139 if (params != null && params.length > 0) {
140
141 for (Object p : params) {
142 leb = leb.addArgument(p);
143 }
144
145 message = String.format(message, params);
146 }
147 if (leb instanceof CallerBoundaryAware) {
148 CallerBoundaryAware cba = (CallerBoundaryAware) leb;
149 cba.setCallerBoundary(PRESUMED_CALLER_BOUNDARY);
150 }
151 leb.log(message);
152 }
153
154 private void reportUnknownLevel(Level jplLevel) {
155 String message = "Unknown log level [" + jplLevel + "]";
156 IllegalArgumentException iae = new IllegalArgumentException(message);
157 org.slf4j.helpers.Util.report("Unsupported log level", iae);
158 }
159
160 private static String getResourceStringOrMessage(ResourceBundle bundle, String msg) {
161 if (bundle == null || msg == null)
162 return msg;
163
164
165
166
167
168
169
170 try {
171 return bundle.getString(msg);
172 } catch (MissingResourceException ex) {
173 return msg;
174 } catch (ClassCastException ex) {
175 return bundle.getObject(msg).toString();
176 }
177 }
178
179 }