View Javadoc
1   package org.eclipse.aether.internal.impl.slf4j;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   * 
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   * 
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import javax.inject.Inject;
23  import javax.inject.Named;
24  
25  import org.eclipse.aether.spi.locator.Service;
26  import org.eclipse.aether.spi.locator.ServiceLocator;
27  import org.eclipse.aether.spi.log.Logger;
28  import org.eclipse.aether.spi.log.LoggerFactory;
29  import org.eclipse.sisu.Nullable;
30  import org.slf4j.ILoggerFactory;
31  import org.slf4j.spi.LocationAwareLogger;
32  
33  /**
34   * A logger factory that delegates to <a href="http://www.slf4j.org/" target="_blank">SLF4J</a> logging.
35   */
36  @Named( "slf4j" )
37  public class Slf4jLoggerFactory
38      implements LoggerFactory, Service
39  {
40  
41      private static final boolean AVAILABLE;
42  
43      static
44      {
45          boolean available;
46          try
47          {
48              Slf4jLoggerFactory.class.getClassLoader().loadClass( "org.slf4j.ILoggerFactory" );
49              available = true;
50          }
51          catch ( Exception | LinkageError e )
52          {
53              available = false;
54          }
55          AVAILABLE = available;
56      }
57  
58      public static boolean isSlf4jAvailable()
59      {
60          return AVAILABLE;
61      }
62  
63      private ILoggerFactory factory;
64  
65      /**
66       * Creates an instance of this logger factory.
67       */
68      public Slf4jLoggerFactory()
69      {
70          // enables no-arg constructor
71      }
72  
73      @Inject
74      Slf4jLoggerFactory( @Nullable ILoggerFactory factory )
75      {
76          setLoggerFactory( factory );
77      }
78  
79      public void initService( ServiceLocator locator )
80      {
81          setLoggerFactory( locator.getService( ILoggerFactory.class ) );
82      }
83  
84      public Slf4jLoggerFactory setLoggerFactory( ILoggerFactory factory )
85      {
86          this.factory = factory;
87          return this;
88      }
89  
90      public Logger getLogger( String name )
91      {
92          org.slf4j.Logger logger = getFactory().getLogger( name );
93          if ( logger instanceof LocationAwareLogger )
94          {
95              return new Slf4jLoggerEx( (LocationAwareLogger) logger );
96          }
97          return new Slf4jLogger( logger );
98      }
99  
100     private ILoggerFactory getFactory()
101     {
102         if ( factory == null )
103         {
104             factory = org.slf4j.LoggerFactory.getILoggerFactory();
105         }
106         return factory;
107     }
108 
109     private static final class Slf4jLogger
110         implements Logger
111     {
112 
113         private final org.slf4j.Logger logger;
114 
115         Slf4jLogger( org.slf4j.Logger logger )
116         {
117             this.logger = logger;
118         }
119 
120         public boolean isDebugEnabled()
121         {
122             return logger.isDebugEnabled();
123         }
124 
125         public void debug( String msg )
126         {
127             logger.debug( msg );
128         }
129 
130         public void debug( String msg, Throwable error )
131         {
132             logger.debug( msg, error );
133         }
134 
135         public boolean isWarnEnabled()
136         {
137             return logger.isWarnEnabled();
138         }
139 
140         public void warn( String msg )
141         {
142             logger.warn( msg );
143         }
144 
145         public void warn( String msg, Throwable error )
146         {
147             logger.warn( msg, error );
148         }
149 
150     }
151 
152     private static final class Slf4jLoggerEx
153         implements Logger
154     {
155 
156         private static final String FQCN = Slf4jLoggerEx.class.getName();
157 
158         private final LocationAwareLogger logger;
159 
160         Slf4jLoggerEx( LocationAwareLogger logger )
161         {
162             this.logger = logger;
163         }
164 
165         public boolean isDebugEnabled()
166         {
167             return logger.isDebugEnabled();
168         }
169 
170         public void debug( String msg )
171         {
172             logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, null );
173         }
174 
175         public void debug( String msg, Throwable error )
176         {
177             logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, error );
178         }
179 
180         public boolean isWarnEnabled()
181         {
182             return logger.isWarnEnabled();
183         }
184 
185         public void warn( String msg )
186         {
187             logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, null );
188         }
189 
190         public void warn( String msg, Throwable error )
191         {
192             logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, error );
193         }
194 
195     }
196 
197 }