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 e )
52          {
53              available = false;
54          }
55          catch ( LinkageError e )
56          {
57              available = false;
58          }
59          AVAILABLE = available;
60      }
61  
62      public static boolean isSlf4jAvailable()
63      {
64          return AVAILABLE;
65      }
66  
67      private ILoggerFactory factory;
68  
69      /**
70       * Creates an instance of this logger factory.
71       */
72      public Slf4jLoggerFactory()
73      {
74          // enables no-arg constructor
75      }
76  
77      @Inject
78      Slf4jLoggerFactory( @Nullable ILoggerFactory factory )
79      {
80          setLoggerFactory( factory );
81      }
82  
83      public void initService( ServiceLocator locator )
84      {
85          setLoggerFactory( locator.getService( ILoggerFactory.class ) );
86      }
87  
88      public Slf4jLoggerFactory setLoggerFactory( ILoggerFactory factory )
89      {
90          this.factory = factory;
91          return this;
92      }
93  
94      public Logger getLogger( String name )
95      {
96          org.slf4j.Logger logger = getFactory().getLogger( name );
97          if ( logger instanceof LocationAwareLogger )
98          {
99              return new Slf4jLoggerEx( (LocationAwareLogger) logger );
100         }
101         return new Slf4jLogger( logger );
102     }
103 
104     private ILoggerFactory getFactory()
105     {
106         if ( factory == null )
107         {
108             factory = org.slf4j.LoggerFactory.getILoggerFactory();
109         }
110         return factory;
111     }
112 
113     private static final class Slf4jLogger
114         implements Logger
115     {
116 
117         private final org.slf4j.Logger logger;
118 
119         Slf4jLogger( org.slf4j.Logger logger )
120         {
121             this.logger = logger;
122         }
123 
124         public boolean isDebugEnabled()
125         {
126             return logger.isDebugEnabled();
127         }
128 
129         public void debug( String msg )
130         {
131             logger.debug( msg );
132         }
133 
134         public void debug( String msg, Throwable error )
135         {
136             logger.debug( msg, error );
137         }
138 
139         public boolean isWarnEnabled()
140         {
141             return logger.isWarnEnabled();
142         }
143 
144         public void warn( String msg )
145         {
146             logger.warn( msg );
147         }
148 
149         public void warn( String msg, Throwable error )
150         {
151             logger.warn( msg, error );
152         }
153 
154     }
155 
156     private static final class Slf4jLoggerEx
157         implements Logger
158     {
159 
160         private static final String FQCN = Slf4jLoggerEx.class.getName();
161 
162         private final LocationAwareLogger logger;
163 
164         Slf4jLoggerEx( LocationAwareLogger logger )
165         {
166             this.logger = logger;
167         }
168 
169         public boolean isDebugEnabled()
170         {
171             return logger.isDebugEnabled();
172         }
173 
174         public void debug( String msg )
175         {
176             logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, null );
177         }
178 
179         public void debug( String msg, Throwable error )
180         {
181             logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, error );
182         }
183 
184         public boolean isWarnEnabled()
185         {
186             return logger.isWarnEnabled();
187         }
188 
189         public void warn( String msg )
190         {
191             logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, null );
192         }
193 
194         public void warn( String msg, Throwable error )
195         {
196             logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, error );
197         }
198 
199     }
200 
201 }