001package org.eclipse.aether.internal.impl.slf4j; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import javax.inject.Inject; 023import javax.inject.Named; 024 025import org.eclipse.aether.spi.locator.Service; 026import org.eclipse.aether.spi.locator.ServiceLocator; 027import org.eclipse.aether.spi.log.Logger; 028import org.eclipse.aether.spi.log.LoggerFactory; 029import org.eclipse.sisu.Nullable; 030import org.slf4j.ILoggerFactory; 031import org.slf4j.spi.LocationAwareLogger; 032 033/** 034 * A logger factory that delegates to <a href="http://www.slf4j.org/" target="_blank">SLF4J</a> logging. 035 */ 036@Named( "slf4j" ) 037public class Slf4jLoggerFactory 038 implements LoggerFactory, Service 039{ 040 041 private static final boolean AVAILABLE; 042 043 static 044 { 045 boolean available; 046 try 047 { 048 Slf4jLoggerFactory.class.getClassLoader().loadClass( "org.slf4j.ILoggerFactory" ); 049 available = true; 050 } 051 catch ( Exception e ) 052 { 053 available = false; 054 } 055 catch ( LinkageError e ) 056 { 057 available = false; 058 } 059 AVAILABLE = available; 060 } 061 062 public static boolean isSlf4jAvailable() 063 { 064 return AVAILABLE; 065 } 066 067 private ILoggerFactory factory; 068 069 /** 070 * Creates an instance of this logger factory. 071 */ 072 public Slf4jLoggerFactory() 073 { 074 // enables no-arg constructor 075 } 076 077 @Inject 078 Slf4jLoggerFactory( @Nullable ILoggerFactory factory ) 079 { 080 setLoggerFactory( factory ); 081 } 082 083 public void initService( ServiceLocator locator ) 084 { 085 setLoggerFactory( locator.getService( ILoggerFactory.class ) ); 086 } 087 088 public Slf4jLoggerFactory setLoggerFactory( ILoggerFactory factory ) 089 { 090 this.factory = factory; 091 return this; 092 } 093 094 public Logger getLogger( String name ) 095 { 096 org.slf4j.Logger logger = getFactory().getLogger( name ); 097 if ( logger instanceof LocationAwareLogger ) 098 { 099 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}